1

私はCNNデザインを始めようとしていますが、このコードはデザインを推測しようとしています(f.maps size、strides。 ...)。誰かがテンソルフロー(手書き数字)付きの畳み込みNNの設計を私に説明できますか? (入力img:28 x 28 |出力:10(n_classes))

私が聞いたことは、 入力 - > Conv5-32 - > maxpool - > Conv5-5 - > maxpool - > fc1 - > outputsです。

私が正しくなっていないのは、fc1の入力です。なぜそれが7 by 7ですか?

誰かお手伝いできますか? (私は初心者です)

import tensorflow as tf 

from tensorflow.examples.tutorials.mnist import input_data 

mnist = input_data.read_data_sets('/tmp/data/', one_hot=True) 


#Parameters 
learning_rate = 0.001 
training_iters = 200000 
batch_size = 28 
display_step = 10 


#Network Parameters 

n_input = 784 
n_output = 10 
dropout = 0.75 

#tf grath input 
x = tf.placeholder(tf.float32, [None,n_input]) 
y = tf.placeholder(tf.float32, [None, n_output]) 
keep_prob = tf.placeholder(tf.float32) 



# Create some wrappers for simplicity 
def conv2d(x, W, b, strides=1): 
    # Conv2D wrapper, with bias and relu activation 
    x = tf.nn.conv2d(x, W, strides=[1, strides, strides, 1], padding='SAME') 
    x = tf.nn.bias_add(x, b) 
    return tf.nn.relu(x) 


def maxpool2d(x, k=2): 
    # MaxPool2D wrapper 
    return tf.nn.max_pool(x, ksize=[1, k, k, 1], strides=[1, k, k, 1], 
          padding='SAME') 




# Create model 
def conv_net(x, weights, biases, dropout): 
    # Reshape input picture 
    x = tf.reshape(x, shape=[-1, 28, 28, 1]) 

    # Convolution Layer 
    conv1 = conv2d(x, weights['wc1'], biases['bc1']) 
    # Max Pooling (down-sampling) 
    conv1 = maxpool2d(conv1, k=2) 

    # Convolution Layer 
    conv2 = conv2d(conv1, weights['wc2'], biases['bc2']) 
    # Max Pooling (down-sampling) 
    conv2 = maxpool2d(conv2, k=2) 

    # Fully connected layer 
    # Reshape conv2 output to fit fully connected layer input 
    fc1 = tf.reshape(conv2, [-1, weights['wd1'].get_shape().as_list()[0]]) 
    fc1 = tf.add(tf.matmul(fc1, weights['wd1']), biases['bd1']) 
    fc1 = tf.nn.relu(fc1) 
    # Apply Dropout 
    fc1 = tf.nn.dropout(fc1, dropout) 

    # Output, class prediction 
    out = tf.add(tf.matmul(fc1, weights['out']), biases['out']) 
    return out 




# Store layers weight & bias 
weights = { 
    # 5x5 conv, 1 input, 32 outputs 
    'wc1': tf.Variable(tf.random_normal([5, 5, 1, 32])), 
    # 5x5 conv, 32 inputs, 64 outputs 
    'wc2': tf.Variable(tf.random_normal([5, 5, 32, 5])), 
    # fully connected, 7*7*64 inputs, 1024 outputs 
    'wd1': tf.Variable(tf.random_normal([7*7*64, 1024])), 
    # 1024 inputs, 10 outputs (class prediction) 
    'out': tf.Variable(tf.random_normal([1024, n_classes])) 
} 

biases = { 
    'bc1': tf.Variable(tf.random_normal([32])), 
    'bc2': tf.Variable(tf.random_normal([64])), 
    'bd1': tf.Variable(tf.random_normal([1024])), 
    'out': tf.Variable(tf.random_normal([n_classes])) 
} 

答えて

1

これは最大プールのためです。各ディメンションで入力のサイズを2で割っています。

最初の最大プールの後、28x28は14x14になり、次に2番目の最大7x7になります。

+0

はい、しかしmaxpool1の前に、私たちの28x28画像の入力は、stride = 1 noの5x5サイズのフィルターを使用して24に減らされましたか? (28 -5)/ 1 + 1 = 24→(img_size-filter_size)/ストライド+1である。 maxpool 1の入力は24x24 imgなので、どう思いますか? –

+0

パディング= '同じ'のため、いいえ。これは、出力が入力と同じサイズになるように入力を0で埋めていることを意味します。 – TheWalkingCube

+0

ああ、理論的には "Same"という意味で、ゼロパディングは私のストライドと同じサイズですか? –

関連する問題