내 질문이 TF에만 해당되는지 아니면 일반적으로 NN에 해당하는지는 잘 모르지만 tensorflow를 사용하여 CNN을 만들었습니다. 그리고 완전히 연결된 레이어의 출력 크기가 왜인지 이해하는 데 어려움을 겪고 있습니다.TensorFlow (신경망) FC 출력 크기
X = tf.placeholder(tf.float32, [None, 32, 32, 3])
y = tf.placeholder(tf.int64, [None])
is_training = tf.placeholder(tf.bool)
# define model
def complex_model(X,y,is_training):
# conv layer
wconv_1 = tf.get_variable('wconv_1', [7 ,7 ,3, 32])
bconv_1 = tf.get_variable('bconv_1', [32])
# affine layer 1
w1 = tf.get_variable('w1', [26*26*32//4, 1024]) #LINE 13
b1 = tf.get_variable('b1', [1024])
# batchnorm params
bn_gamma = tf.get_variable('bn_gamma', shape=[32]) #scale
bn_beta = tf.get_variable('bn_beta', shape=[32]) #shift
# affine layer 2
w2 = tf.get_variable('w2', [1024, 10])
b2 = tf.get_variable('b2', [10])
c1_out = tf.nn.conv2d(X, wconv_1, strides=[1, 1, 1, 1], padding="VALID") + bconv_1
activ_1 = tf.nn.relu(c1_out)
mean, var = tf.nn.moments(activ_1, axes=[0,1,2], keep_dims=False)
bn = tf.nn.batch_normalization(act_1, mean, var, bn_gamma, bn_beta, 1e-6)
mp = tf.nn.max_pool(bn, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='VALID')
affine_in_flat = tf.reshape(mp, [-1, 26*26*32//4])
affine_1 = tf.matmul(affine_in_flat, w1) + b1
activ_2 = tf.nn.relu(affine_1)
affine_2 = tf.matmul(activ_2, w2) + b2
return affine_2
#print(affine_2.shape)
내가 그냥 넣어 것으로 예상했을 것이다 (W1)의 값을 설정 라인 (13)에
: 내가 줄의 코드를 실행하면 위의 그림
w1 = tf.get_variable('w1', [26*26*32, 1024])
을 그러나와와
affine_in_flat = tf.reshape(mp, [-1, 26*26*32])
내 출력 크기가 64,10 대신에 16,10 이니, 아래의 초기화를 통해 기대할 수 있습니다.
x = np.random.randn(64, 32, 32,3)
with tf.Session() as sess:
with tf.device("/cpu:0"): #"/cpu:0" or "/gpu:0"
tf.global_variables_initializer().run()
#print("train", x.size, is_training, y_out)
ans = sess.run(y_out,feed_dict={X:x,is_training:True})
%timeit sess.run(y_out,feed_dict={X:x,is_training:True})
print(ans.shape)
print(np.array_equal(ans.shape, np.array([64, 10])))
누구나 왜 w1 [0]의 크기를 4로 나눌 필요가 있는지 말해 줄 수 있습니까? bn
및 mp
에 대한 print
문을 추가