首頁>Club>
9
回覆列表
  • 1 # 深空智慧

    現在用來構建神經網路的框架太多了,門檻變的也比較低,基本每個框架的文件都會介紹如果快速的構建一個神經網路,並訓練它來解決一個問題。

    Tensorflow

    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,

    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)

    基於上面的程式碼,就構建完成了一個多層的卷積神經網路啦。

    如果要訓練這個網路的話,就需要新增訓練邏輯和驗證邏輯來完成了。

  • 中秋節和大豐收的關聯?
  • 在NBA歷史上,你認為哪個常規賽MVP獲得者的資料最漂亮?