1

私はUdacityの深い学習のコースに取り組んでいます。私はこれまでの課題にとても満足しています。しかし、2つのコード行があり、それは私がかなり理解していないものです。Udacityディープラーニング畳み込みニューラルネットワーク - TensorFlow

batch_size = 20 
patch_size = 5 
depth = 16 
num_hidden = 64 

graph = tf.Graph() 

with graph.as_default(): 

    # Input data. 
    tf_train_dataset = tf.placeholder(
    tf.float32, shape=(batch_size, image_size, image_size, num_channels)) 
    tf_train_labels = tf.placeholder(tf.float32, shape=(batch_size, num_labels)) 
    tf_valid_dataset = tf.constant(valid_dataset) 
    tf_test_dataset = tf.constant(test_dataset) 

    # Variables. 
    layer1_weights = tf.Variable(tf.truncated_normal(
     [patch_size, patch_size, num_channels, depth], stddev=0.1)) 
    layer1_biases = tf.Variable(tf.zeros([depth])) 
    layer2_weights = tf.Variable(tf.truncated_normal(
     [patch_size, patch_size, depth, depth], stddev=0.1)) 
    *********************************************************** 
    layer2_biases = tf.Variable(tf.constant(1.0, shape=[depth])) 
    *********************************************************** 
    layer3_weights = tf.Variable(tf.truncated_normal(
     [image_size // 4 * image_size // 4 * depth, num_hidden], stddev=0.1)) 
    *********************************************************** 
    layer3_biases = tf.Variable(tf.constant(1.0, shape=[num_hidden])) 
    layer4_weights = tf.Variable(tf.truncated_normal(
     [num_hidden, num_labels], stddev=0.1)) 
    layer4_biases = tf.Variable(tf.constant(1.0, shape=[num_labels])) 

    # Model. 
    def model(data): 
    conv = tf.nn.conv2d(data, layer1_weights, [1, 2, 2, 1], padding='SAME') 
    hidden = tf.nn.relu(conv + layer1_biases) 
    conv = tf.nn.conv2d(hidden, layer2_weights, [1, 2, 2, 1], padding='SAME') 
    hidden = tf.nn.relu(conv + layer2_biases) 
    shape = hidden.get_shape().as_list() 
    reshape = tf.reshape(hidden, [shape[0], shape[1] * shape[2] * shape[3]]) 
    hidden = tf.nn.relu(tf.matmul(reshape, layer3_weights) + layer3_biases) 
    return tf.matmul(hidden, layer4_weights) + layer4_biases 

    # Training computation. 
    logits = model(tf_train_dataset) 
    loss = tf.reduce_mean(
    tf.nn.softmax_cross_entropy_with_logits(logits, tf_train_labels)) 

    # Optimizer. 
    optimizer = tf.train.GradientDescentOptimizer(0.05).minimize(loss) 

    # Predictions for the training, validation, and test data. 
    train_prediction = tf.nn.softmax(logits) 
    valid_prediction = tf.nn.softmax(model(tf_valid_dataset)) 
    test_prediction = tf.nn.softmax(model(tf_test_dataset)) 

私はかなり分かりませんコードの部分にアスタリスクを付けました。最初に、入力と畳み込みレイヤーの間の最初のバイアスセットがゼロである理由がわかりません。次に、2番目のレイヤーではすべて1になります。

次に、私は次のコード行理解していない:私たちはimage_size // 4 * image_size // 4 * depthを使用している理由を、私は得ることはありません、具体的に

layer3_weights = tf.Variable(tf.truncated_normal(
    [image_size // 4 * image_size // 4 * depth, num_hidden], stddev=0.1)) 

を、そして私は特に、我々が使用している理由を理解していない4.

詳細情報が必要な場合は、お知らせください。これは、ノートブックをGitHubからクローンできるUdacityの深い学習コースから取得したものです。

多くの感謝:)

+2

彼らは単に手で計算しました、パラメータ空間のサイズは何ですか、これは畳み込みで使用されるパラメータの結果です。イメージのサイズを小さくしています(カーネルをいくつかのパディングなどで動かすと)、この場合、サイズが4倍に減ります。そのような魔法のような定数ではありません。前に畳み込みレイヤーで使用されたパラメータの結果です。彼らは単に一致する必要があります、それだけです。 – lejlot

+0

ありがとうございます@lejlot。最初のバイアスに対して異なる値を使用した理由を知っていますか? – simongraham

+0

私はそれがバイアスの他の初期化でもうまくいくことを確信しています。それは完全に任意に見える – lejlot

答えて

0

が答えるために[image_sizeでは// 4 * image_sizeでは// 4 *深さ]は一部:

コードはSAMEパディングで二回畳み込みを適用する - 今すぐ

In each convolution the output image is half of input size (since stride = 2) 
Therefore size of output after first 2 convolution layers is : 
(image_size/4) * (image_size/4) * depth 

次の層は完全に接続されているので、この層への入力は3D画像ではなくフラットな画像でなければならない。したがって、層3の重みは次元である。

((image_size/4) * (image_size/4) * depth), num_hidden 
関連する問題