1. 程式人生 > >TensorFlow的 卷積層

TensorFlow的 卷積層

應用 這一 ted trunc style input rem num batch

用 TensorFlow 做卷積

讓我們用所學知識在 TensorFlow 裏構建真的 CNNs。在下面的練習中,你需要設定卷積核濾波器(filters)的維度,weight,bias。這在很大程度上來說是 TensorFlow CNNs 最難的部分。一旦你知道如何設置這些屬性的大小,應用 CNNs 會很方便。

回顧

你應該看一下二維卷積的文檔。文檔大部分都很清楚,padding這一部分,可能會有點難以理解。padding 會根據你給出的 ‘VALID‘ 或者 ‘SAME‘ 參數,做相應改變。

這些也是需要你回顧的:

  1. TensorFlow 變量。
  2. Truncated 正態分布 - 在 TensorFlow 中你需要在一個正態分布的區間中初始化你的權值。
  3. 根據輸入大小、濾波器大小,來決定輸出維度(如下所示)。你用這個來決定濾波器應該是什麽樣:

     new_height = (input_height - filter_height + 2 * P)/S + 1
     new_width = (input_width - filter_width + 2 * P)/S + 1
    

說明

  1. conv2d函數中完成所有 TODO
  2. 設定 stridespadding 、 filter weight/bias (F_w and F_b) 輸出是 (1, 2, 2, 3)。除了 strides 所有變量的類型都應該為 TensorFlow 變量。
"""
Setup the strides, padding and filter weight/bias such that the output shape is (1, 2, 2, 3). """ import tensorflow as tf import numpy as np # `tf.nn.conv2d` requires the input be 4D (batch_size, height, width, depth) # (1, 4, 4, 1) x = np.array([ [0, 1, 0.5, 10], [2, 2.5, 1, -8], [4, 0, 5, 6], [
15, 1, 2, 3]], dtype=np.float32).reshape((1, 4, 4, 1)) X = tf.constant(x) def conv2d(input): # Filter (weights and bias) # The shape of the filter weight is (height, width, input_depth, output_depth) # The shape of the filter bias is (output_depth,) # TODO: Define the filter weights `F_W` and filter bias `F_b`. # NOTE: Remember to wrap them in `tf.Variable`, they are trainable parameters after all. F_W = ? F_b = ? # TODO: Set the stride for each dimension (batch_size, height, width, depth) strides = [?, ?, ?, ?] # TODO: set the padding, either ‘VALID‘ or ‘SAME‘. padding = ? # https://www.tensorflow.org/versions/r0.11/api_docs/python/nn.html#conv2d # `tf.nn.conv2d` does not include the bias computation so we have to add it ourselves after. return tf.nn.conv2d(input, F_W, strides, padding) + F_b out = conv2d(X)

方案

這是我的做法。註意:有不止一種方法得到正確的輸出維度,你的答案可能會跟我的有所不同。

def conv2d(input):
    # Filter (weights and bias)
    F_W = tf.Variable(tf.truncated_normal((2, 2, 1, 3)))
    F_b = tf.Variable(tf.zeros(3))
    strides = [1, 2, 2, 1]
    padding = VALID
    return tf.nn.conv2d(input, F_W, strides, padding) + F_b

我想要把輸入的 (1, 4, 4, 1) 轉變成 (1, 2, 2, 3)。padding 方法我選擇 ‘VALID‘。我覺得這更容易理解,也得到了我想要的結果。

out_height = ceil(float(in_height - filter_height + 1) / float(strides[1]))
out_width  = ceil(float(in_width - filter_width + 1) / float(strides[2]))

把值帶入:

out_height = ceil(float(4 - 2 + 1) / float(2)) = ceil(1.5) = 2
out_width  = ceil(float(4 - 2 + 1) / float(2)) = ceil(1.5) = 2

要把深度從 1 變成 3。我要把我濾波器的輸出做相應的設置:

F_W = tf.Variable(tf.truncated_normal((2, 2, 1, 3))) # (height, width, input_depth, output_depth)
F_b = tf.Variable(tf.zeros(3)) # (output_depth)

輸入的深度是 1,所以我選擇 1 作為濾波器的 input_depth

TensorFlow的 卷積層