2017-12-29 3 views
1

Tensorflow에서 컨벌루션 뉴럴 네트워크 모델을 작성하여 문자 인식을하고 있습니다. 내 모델에는 2 개의 Conv 레이어와 2 개의 완전히 연결된 레이어가 있습니다. 교육을위한 78K 이미지와 테스트를위한 13K 이미지가 있습니다. 모델을 실행할 때 테스트 세트에서 약 92.xx %의 정확도를 얻었습니다. Tensorboard에서 내 정확성과 손실 곡선을 시각화했을 때. 나는 세로줄를 얻었지만, 나는 왜 이것을 얻고 있는지 몰랐다. 나는이 Accuracy and Cross Entropy curve when viewed on tensorboard와 같은 커브를 얻었다. 가중치 및 바이어스의 또Tensorflow가있는 CNN 모델

분포 곡선이 점에서 어떤 도움이 높게 평가되어 Left side shows testing parameters (weights and bias) and right side shows training parameters on first conv layer

수직선을 나타낸다. !! !!

내가 과거에이 문제가 발생했습니다
def conv_layer(input, size_in, size_out, name="conv"): 
with tf.name_scope(name): 
w = tf.Variable(tf.random_normal([5, 5, size_in, size_out], stddev=0.1), name="W") 
b = tf.Variable(tf.constant(0.1, shape=[size_out]), name="B") 
conv = tf.nn.conv2d(input, w, strides=[1, 1, 1, 1],padding="VALID") 
act = tf.nn.relu(conv + b) 
tf.summary.histogram("weights", w) 
tf.summary.histogram("biases", b) 
tf.summary.histogram("activations", act) 
return tf.nn.max_pool(act, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")` 

def fc_layer(input, size_in, size_out, name="fc"): 
with tf.name_scope(name): 
w = tf.Variable(tf.random_normal([size_in, size_out], stddev=0.1), name="W") # Truncated_normal 
b = tf.Variable(tf.constant(0.1, shape=[size_out]), name="B") 
act = tf.matmul(input, w) + b 
tf.summary.histogram("weights", w) 
tf.summary.histogram("biases", b) 
tf.summary.histogram("activations", act) 
return act 

def model(use_two_conv, use_two_fc): 
sess = tf.Session() 
x = tf.placeholder(tf.float32, shape=[None, 1024], name="x") 
x_image = tf.reshape(x, [-1, 32, 32, 1]) 
tf.summary.image('input', x_image, 3) 
y = tf.placeholder(tf.float32, shape=[None,46], name="labels") 

if use_two_conv: 
    conv1 = conv_layer(x_image, 1, 4, "conv1") 
    conv_out = conv_layer(conv1,4,16,"conv2")  
else: 
    conv1 = conv_layer(x_image, 1, 16, "conv1") 
    conv_out = tf.nn.max_pool(conv1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME") 

flattened = tf.reshape(conv_out, [-1, 5 * 5 * 16]) 

if use_two_fc: 
    fc1 = fc_layer(flattened, 5 * 5 * 16, 200, "fc1") 
    relu = tf.nn.relu(fc1) 
    tf.summary.histogram("fc1/relu", relu) 
    logits = fc_layer(fc1, 200, 46, "fc2")   

else: 
    logits = fc_layer(flattened, 5*5*16, 46, "fc") 
+0

나는이 정확한 문제를 여러 번 실행했지만 코드가 없으면 코드 문제를 진단하기가 어렵습니다! 교육 코드를 게시 하시겠습니까? 아마도''writer.add_summary (current_summary, epoch)''대신''writer.add_summary (current_summary)''를 쓸 것입니다. 코드를 게시하면 답변으로 기꺼이 게시 할 것입니다. –

+0

감사합니다 @DylanF. 그것은 효과가 있었다. 그러나 나는 한 가지 더 문제가 있습니다.이 숙련 된 모델에서 새로운 이미지를 테스트하고 싶지만 "conv1/W : 0", "conv2"와 같은 변수가 있기 때문에 함수 conv_layer() 및 fc_layer()에 정의 된 변수를 어떻게 복원해야합니까?/W : 0 "입니다. 새 이미지에이 훈련 된 모델을 어떻게 사용해야합니까? –

+0

정말 완전히 새로운 질문입니다. 질문하기에 앞서 [이 질문] (https://stackoverflow.com/questions/33759623/tensorflow-how-to-save-restore-a-model/47235448#47235448)을 참조 할 수 있습니다. 가장 최근의 방법이기 때문에 [Tom 's answer] (https://stackoverflow.com/a/47235448/8217456)를 사용합니다. 그러나 받아 들여진 응답은 역시 유효한 해결책이다! –

답변

0

, 그것은 (때문에 관련 부분의 일반적인 변수 이름을 사용

writer.add_summary(current_summary) 

대신

writer.add_summary(current_summary, epoch) 

사용의 결과이었다 질문자 코드는 게시되지 않습니다.) 예 :

summary_op = tf.summary.merge_all() 
with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    writer = tf.summary.FileWriter("/Whatever/Path", sess.graph) 
    for iteration in range(1001): 
     if epoch % 100 == 0: 
      _, current_summary = sess.run([training_op, summary_op]) 
      writer.add_summary(current_summary, iteration) 
     else: 
      _ = sess.run(training_op)