0

내 질문이 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로 나눌 필요가 있는지 말해 줄 수 있습니까? bnmp에 대한 print 문을 추가

답변

0

내가 얻을 :

bn : <tf.Tensor 'batchnorm/add_1:0' shape=(?, 26, 26, 32) dtype=float32>

mp : 최대의 strides=[1, 2, 2, 1] 풀링에 의한 것으로 보인다 <tf.Tensor 'MaxPool:0' shape=(?, 13, 13, 32) dtype=float32>

은 (그러나 26, 26을 유지하기 위해 padding='SAME'도 필요합니다).