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]))
}
はい、しかしmaxpool1の前に、私たちの28x28画像の入力は、stride = 1 noの5x5サイズのフィルターを使用して24に減らされましたか? (28 -5)/ 1 + 1 = 24→(img_size-filter_size)/ストライド+1である。 maxpool 1の入力は24x24 imgなので、どう思いますか? –
パディング= '同じ'のため、いいえ。これは、出力が入力と同じサイズになるように入力を0で埋めていることを意味します。 – TheWalkingCube
ああ、理論的には "Same"という意味で、ゼロパディングは私のストライドと同じサイズですか? –