2017-01-27 4 views
1

Я пытаюсь запустить несколько простых сверточных NN в тензорном потоке в Windows 10 с 40 ГБ памяти, используя версию ЦП. Тем не менее, до сих пор я все время сталкиваюсь с проблемами при выполнении либо зависает сразу после инициализации переменных, либо после нескольких итераций обучения. Ниже приведен краткий обзор моего кода и того, чего я хочу достичь.tensorflow исполнение freezes для небольшого CNN

У меня в каждом изображении пятибуквенная последовательность, и я хотел бы обучить CNN распознавать последовательность в каждом изображении. Для этого у меня есть два слоя свертки (высота/ширина/канал: 4/4/5, 4/4/10), каждый из которых подается в слой relu, а затем два полностью связанных слоя relu и, наконец, слой softmax с кросс- функция потери энтропии.

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) 

Си-Эн довольно проста и достаточно мал, так что я был очень удивлен, когда я увидел его заморозили после инициализации всех переменных, или в лучшем случае после нескольких тренировочных заездов. Нет никакого выхода, и ctrl + c не прерывает выполнение. Интересно, может ли это иметь какое-либо отношение к версии Tensorflow для Windows, но в настоящее время я не понимаю, где искать подсказки.

Не могли бы вы поделиться своим предложением или мнением о том, что могло вызвать мою проблему? Спасибо!

EDIT: Как указано в комментариях, может возникнуть проблема с тем, как я передаю данные модели. Поэтому я также размещаю эту часть кода ниже.

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

Модель сама по себе выглядит хорошо. Есть две возможности: либо (а) что-то не так с кодом, который подает входные данные и запускает график, который вы не показываете, или (b) в Tensorflow в Windows есть ошибка. Один из способов решения этой задачи - попробовать запустить модель со случайными или постоянными входами, без какого-либо кода для чтения входов. Он все еще висит после нескольких шагов? Если да, тогда вы должны подать вопрос Github. Если нет, то что-то не так с кодом ввода-чтения - не могли бы вы это показать? Надеюсь, это поможет! –

+0

@PeterHawkins Спасибо за предложение. Я опубликовал код, который я использовал для обучения. К сожалению, даже с постоянными данными обучение все еще застряло. Если есть что-то основное, что мне не хватает, кажется, что я, возможно, столкнулся с какой-то проблемой с tensorflow ... – bagend2001

+0

Это звучит как ошибка, специфичная для Windows. Это звучит для меня, как ваш лучший выбор - подать вопрос Github. Пожалуйста, сделайте наименьшее, автономное воспроизведение, которое вы можете, и сообщите о проблеме на Tensorflow Github. (Чем меньше и проще код воспроизведения, тем выше вероятность того, что кто-то его исправит.) –

ответ

0

Скорее всего, это из-за очереди. Не могли бы вы попытаться запустить свой тренировочный шаг в MonitoredSession, который обрабатывает инициализацию и выполнение очереди под капотом. Он будет выглядеть следующим образом:

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

Извините, но я не совсем понимаю. Мое (ограниченное) понимание заключается в том, что очередь-бегуны используются для подачи данных в основную часть обучения. Если это так, поскольку я не использую очереди-очереди, почему они будут причиной замораживания? – bagend2001

Смежные вопросы