現在用來構建神經網路的框架太多了,門檻變的也比較低,基本每個框架的文件都會介紹如果快速的構建一個神經網路,並訓練它來解決一個問題。
TF框架是Google出的,可謂是“根正苗紅”,在其官網上也有很多入門的示例,TF提供了各種型別神經網路層的基礎元件,比如卷積層,全連線層,迴圈神經元等等,由於其社群發展非常龐大,所以在這方面會跟進的非常快。基於框架提供的這些方法,開發者所做的就是像搭積木一樣,找到合適的網路層,根據資料的大小、型別等設計每一層的介面。針對訓練和預測功能,新增相應的訓練和預測邏輯即可。
以官網上構建MNIST資料集的分類神經網路為例
首先設計一下用於分類MNIST資料的一個網路結構:
1. 卷積神經網路層
2. 池化層
3. 再接一個卷積層
4. 再接一個池化層
5. 全連線層
6. 全連線層(輸出)
由於TF框架把這些網路層都封裝的比較好了,並且留出了足夠多的引數和介面用於開發者調參,因此我們只需要利用這些API即可。這裡用到的神經網路層的API都tf.layers中可以找到,卷積神經網路可以用tf.layers.conv2d(), 池化層是tf.layers.max_pooling2d(),全連線層可以用tf.layers.dense()。
需要注意的是,構建完整的網路結構時,需要根據資料的shape、預測結果的結構來設計網路的輸入輸出和各個網路層的匹配,比如MNIST的資料是一個28*28大小的圖片,再設計輸入層的時候就要把shape設定成28*28。
構造網路部分的程式碼如下:
# 輸入層
"""
接收原始的輸入資料,注意設定資料的shape
[-1,28,28,1]中各維度的解釋:
-1 這個維度代表的是Batch size, -1 代表不固定
28,28 這兩個分別是寬和高的維度,MNIST都是28個畫素
最後面的1 代表影象的通道數,灰度圖只有一個通道
input_layer = tf.reshape(features["x"], [-1, 28, 28, 1])
# 卷積層-1
第一個卷積層的輸入就是上面那一層的結果,filter代表卷積核的個數,kernel_size是卷積核的shape,或者說感受野的大小,tf.nn.relu是啟用函式,也可以選擇其他的比如tanh等。
conv1 = tf.layers.conv2d(
inputs=input_layer,
filters=32,
kernel_size=[5, 5],
padding="same",
activation=tf.nn.relu)
# 池化層 - 1
池化層主要是為了減少引數,減少計算量,並且還能把重要特徵保留下來。
pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)
# 卷積層- 2 和 池化層 -2
conv2 = tf.layers.conv2d(
inputs=pool1,
filters=64,
pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2)
# 全連線層
pool2_flat = tf.reshape(pool2, [-1, 7 * 7 * 64])
dense = tf.layers.dense(inputs=pool2_flat, units=1024, activation=tf.nn.relu)
dropout = tf.layers.dropout(
inputs=dense, rate=0.4, training=mode == tf.estimator.ModeKeys.TRAIN)
#Logits輸出層
最後這一個FC主要是為了把輸出的格式定好,如果訓練一個10個類的分類模型,那麼就像下面一個,把units設為10
logits = tf.layers.dense(inputs=dropout, units=10)
基於上面的程式碼,就構建完成了一個多層的卷積神經網路啦。
如果要訓練這個網路的話,就需要新增訓練邏輯和驗證邏輯來完成了。
現在用來構建神經網路的框架太多了,門檻變的也比較低,基本每個框架的文件都會介紹如果快速的構建一個神經網路,並訓練它來解決一個問題。
TensorflowTF框架是Google出的,可謂是“根正苗紅”,在其官網上也有很多入門的示例,TF提供了各種型別神經網路層的基礎元件,比如卷積層,全連線層,迴圈神經元等等,由於其社群發展非常龐大,所以在這方面會跟進的非常快。基於框架提供的這些方法,開發者所做的就是像搭積木一樣,找到合適的網路層,根據資料的大小、型別等設計每一層的介面。針對訓練和預測功能,新增相應的訓練和預測邏輯即可。
栗子以官網上構建MNIST資料集的分類神經網路為例
首先設計一下用於分類MNIST資料的一個網路結構:
1. 卷積神經網路層
2. 池化層
3. 再接一個卷積層
4. 再接一個池化層
5. 全連線層
6. 全連線層(輸出)
開發由於TF框架把這些網路層都封裝的比較好了,並且留出了足夠多的引數和介面用於開發者調參,因此我們只需要利用這些API即可。這裡用到的神經網路層的API都tf.layers中可以找到,卷積神經網路可以用tf.layers.conv2d(), 池化層是tf.layers.max_pooling2d(),全連線層可以用tf.layers.dense()。
需要注意的是,構建完整的網路結構時,需要根據資料的shape、預測結果的結構來設計網路的輸入輸出和各個網路層的匹配,比如MNIST的資料是一個28*28大小的圖片,再設計輸入層的時候就要把shape設定成28*28。
構造網路部分的程式碼如下:
# 輸入層
"""
接收原始的輸入資料,注意設定資料的shape
[-1,28,28,1]中各維度的解釋:
-1 這個維度代表的是Batch size, -1 代表不固定
28,28 這兩個分別是寬和高的維度,MNIST都是28個畫素
最後面的1 代表影象的通道數,灰度圖只有一個通道
"""
input_layer = tf.reshape(features["x"], [-1, 28, 28, 1])
# 卷積層-1
"""
第一個卷積層的輸入就是上面那一層的結果,filter代表卷積核的個數,kernel_size是卷積核的shape,或者說感受野的大小,tf.nn.relu是啟用函式,也可以選擇其他的比如tanh等。
"""
conv1 = tf.layers.conv2d(
inputs=input_layer,
filters=32,
kernel_size=[5, 5],
padding="same",
activation=tf.nn.relu)
# 池化層 - 1
"""
池化層主要是為了減少引數,減少計算量,並且還能把重要特徵保留下來。
"""
pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)
# 卷積層- 2 和 池化層 -2
conv2 = tf.layers.conv2d(
inputs=pool1,
filters=64,
kernel_size=[5, 5],
padding="same",
activation=tf.nn.relu)
pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2)
# 全連線層
pool2_flat = tf.reshape(pool2, [-1, 7 * 7 * 64])
dense = tf.layers.dense(inputs=pool2_flat, units=1024, activation=tf.nn.relu)
dropout = tf.layers.dropout(
inputs=dense, rate=0.4, training=mode == tf.estimator.ModeKeys.TRAIN)
#Logits輸出層
"""
最後這一個FC主要是為了把輸出的格式定好,如果訓練一個10個類的分類模型,那麼就像下面一個,把units設為10
"""
logits = tf.layers.dense(inputs=dropout, units=10)
基於上面的程式碼,就構建完成了一個多層的卷積神經網路啦。
如果要訓練這個網路的話,就需要新增訓練邏輯和驗證邏輯來完成了。