2017-01-27 2 views
1

CPU 버전을 사용하여 40GB 메모리가있는 Windows 10의 tensorflow에서 간단한 컨벌루션 NN을 실행하려고합니다. 그러나 지금까지 실행을 계속하는 데 문제가 생기면 변수를 초기화 한 직후에 또는 몇 번의 반복 학습을 거쳐 중단됩니다. 아래는 내 코드와 내가 성취하고자하는 바를 요약 한 것입니다.작은 CNN에 대한 텐서 플로우 실행이 멈춤

나는 각 이미지에 5 글자 시퀀스를 가지고 있으며, 각 이미지에서 시퀀스를 인식하도록 CNN을 훈련시키고 싶다. 이를 위해 나는 각각 relu 레이어로 공급되는 두 개의 convolution 레이어 (높이/너비/채널 : 4/4/5, 4/4/10)를 가지고 있으며, 두 개의 완전히 연결된 relu 레이어가 뒤 따른다. 그리고 마지막으로 cross- 엔트로피 손실 함수.

num_image = 5 
image_size = (28, 150) 
out_channel = 5; 
shape_conv1 = [4, 4, 1, out_channel] # height, width, in_channel, out_channel 
stride_conv1 = [1, 2, 2, 1] 
shape_conv2 = [4, 4, out_channel, out_channel*2] # height, width, in_channel, out_channel 
stride_conv2 = [1, 2, 2, 1] 
num_layer1 = 100 
num_layer2 = 100 

num_output = 10 
num_batch = 200 

size_intermediate = [1, np.ceil(np.ceil(image_size[0]/stride_conv1[1])/stride_conv2[1]), \ 
       np.ceil(np.ceil(image_size[1]/stride_conv1[2])/stride_conv2[2]), out_channel*2] 
size_trans = [int(i) for i in size_intermediate] 

with graph.as_default(): 
    input_data = tf.placeholder(tf.float32, [num_batch-num_image+1, image_size[0], image_size[1], 1]) 
    input_labels = tf.placeholder(tf.float32, [num_image, num_batch-num_image+1, num_output]) 
    reg_coeff = tf.placeholder(tf.float32) 

    weights_conv1 = tf.Variable(tf.truncated_normal(shape_conv1, 0.0, 0.1)) 
    bias_relu1 = tf.Variable(tf.zeros([out_channel])) 
    weights_conv2 = tf.Variable(tf.truncated_normal(shape_conv2, 0.0, 0.1)) 
    bias_relu2 = tf.Variable(tf.zeros([out_channel*2])) 
    weights_layer1 = tf.Variable(tf.truncated_normal(\ 
         [num_image, size_trans[1]*size_trans[2]*size_trans[3], num_layer1], \ 
         0.0, (num_layer1)**-0.5)) 
    bias_layer1 = tf.zeros([num_image, 1, num_layer1]) 
    weights_layer2 = tf.Variable(tf.truncated_normal([num_image, num_layer1, num_layer2], \ 
         0.0, (num_layer2)**-0.5)) 
    bias_layer2 = tf.zeros([num_image, 1, num_layer2]) 
    weights_output = tf.Variable(tf.truncated_normal([num_image, num_layer2, num_output], 0.0, num_output**-0.5)) 
    bias_output = tf.zeros([num_image, 1, num_output]) 

    output_conv1 = tf.nn.conv2d(input_data, weights_conv1, stride_conv1, "SAME") 
    output_relu1 = tf.nn.relu(output_conv1 + bias_relu1) 
    output_conv2 = tf.nn.conv2d(output_relu1, weights_conv2, stride_conv2, "SAME") 
    output_relu2 = tf.nn.relu(output_conv2 + bias_relu2) 

    shape_inter = output_relu2.get_shape().as_list() 
    input_inter = tf.reshape(output_relu2, [1, shape_inter[0], shape_inter[1]*shape_inter[2]*shape_inter[3]]) 
    ## One copy for each letter recognizer 
    input_mid = tf.tile(input_inter, [num_image, 1, 1]) 

    input_layer1 = tf.matmul(input_mid, weights_layer1) + bias_layer1 
    output_layer1 = tf.nn.relu(input_layer1) 
    input_layer2 = tf.matmul(output_layer1, weights_layer2) + bias_layer2 
    output_layer2 = tf.nn.relu(input_layer2) 
    logits = tf.matmul(output_layer2, weights_output) + bias_output 

    # Training prediction 
    train_prediction = tf.nn.softmax(logits) 
    loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits, input_labels)) 
    # Loss term for regularization 
    loss_reg = reg_coeff*(tf.nn.l2_loss(weights_layer1)+tf.nn.l2_loss(bias_layer1)\ 
           +tf.nn.l2_loss(weights_layer2)+tf.nn.l2_loss(bias_layer2)\ 
           +tf.nn.l2_loss(weights_output)+tf.nn.l2_loss(bias_output)) 

    learning_rate = 0.1 
    optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss+loss_reg) 

는 CNN 오히려 간단하고 아주 작은, 그래서 그것은 모든 변수를 초기화 한 후 동결, 또는 기껏해야 몇 훈련이 실행 된 후봤을 때 나는 오히려 놀랐습니다. 어떤 종류의 출력도 없으며 ctrl + c가 실행을 방해하지 않습니다. Tensorflow의 Windows 버전과 관련이 있을지 궁금하지만 현재 실마리를 찾으려는 손실이 있습니다.

누군가 내 문제를 일으킨 원인에 대한 의견이나 제안을 공유 할 수 있습니까? 고맙습니다!

편집 : 의견에서 지적했듯이 모델에 데이터를 제공하는 방식에 문제가있을 수 있습니다. 따라서 나는 아래 코드의 일부를 게시한다.

num_steps = 20000 

fixed_input = np.random.randint(0, 256, [num_batch-num_image+1, 28, 150, 1]) 
fixed_label = np.tile((np.random.choice(10, [num_batch-num_image+1, 1])==np.arange(10)).astype(np.float32), (5, 1, 1)) 

with tf.Session(graph=graph) as session: 
    tf.global_variables_initializer().run() 
    print("Initialized") 
    loss1 = 0.0 
    loss2 = 0.0 

    for i in range(1, num_steps+1): 
     feed_dict = {input_data : fixed_input, input_labels : fixed_label, reg_coeff : 2e-4} 
     _, l1, l2, predictions = session.run([optimizer, loss, loss_reg, train_prediction], feed_dict=feed_dict) 
     loss1 += l1 
     loss2 += l2 

     if i % 500 == 0: 
      print("Batch/reg loss at step %d: %f, %f" % (i, loss1/500, loss2/500)) 
      loss1 = 0.0 
      loss2 = 0.0 
      print("Minibatch accuracy: %.1f%%" % accuracy(predictions, fixed_labels)) 

나는 임의의 입력과 그 레이블을 사용하여 코드가 실행되는지 테스트하기 만합니다. 불행히도 실행은 교육의 처음 몇 단계에서 다시 멈 춥니 다.

+0

모델 자체는 괜찮아 보입니다. 두 가지 가능성이 있습니다. (a) 입력을 제공하고 표시하지 않는 코드를 실행하는 코드에 문제가 있거나 (b) Windows의 Tensorflow에 버그가 있습니다. 어떤 코드를 입력하지 않고도 무작위 또는 일정한 입력으로 모델을 실행 해보는 것이 하나의 방법입니다. 두 단계 후에도 여전히 매달 리니? 그렇다면 Github 문제를 제기해야합니다. 그렇지 않다면, 입력 - 판독 코드에 문제가 있습니다 --- 그걸 보여줄 수 있습니까? 희망이 도움이됩니다! –

+0

@PeterHawkins 제안에 감사드립니다. 나는 훈련을하기 위해 사용했던 코드를 게시했다. 불행히도 지속적인 데이터로도 교육은 여전히 ​​고착되었습니다. 내가 누락 된 기본 사항이 없다면, 실제로 tensorflow와 관련된 문제가있는 것 같습니다. – bagend2001

+0

Windows 관련 버그처럼 들립니다. Github 문제를 제기하는 것이 가장 좋습니다. 최대한 작게 자급 적으로 재생산하고 Tensorflow Github에 문제를 제기하십시오. (재생산 코드가 작고 간단할수록 누군가가 고칠 가능성이 높습니다.) –

답변

0

대기열 러너 때문일 가능성이 큽니다. 초기화 및 대기열 실행을 처리하는 MonitoredSession 내에서 교육 단계를 실행 해 주실 수 있습니까?

with tf.train.MonitoredTrainingSession(...) as sess: 
    sess.run(optimizer) 
+1

죄송 합니다만 따라 가지 않습니다. 나의 (제한된) 이해는 대기열 주자가 주 훈련 부분에 데이터를 공급하는 데 사용된다는 것입니다. 그렇다면 대기열 주자를 사용하지 않기 때문에 왜 그들이 동결의 원인이 될까요? – bagend2001

관련 문제