TF Graph не соответствует коду

Я пытаюсь создать очень простую нейронную сеть, считывающую информацию с формой 1x2048, и создать классификацию для двух категорий (объект или не объект). Однако структура графа отличается от того, что я считаю закодированным. Плотные слои должны быть включены в область «inner_layer» и должны получать входные данные из заполнителя «input». Вместо этого TF, кажется, рассматривает их как независимые уровни, которые не получают никакой информации от «входа».

Кроме того, при попытке использовать сводки тензорной доски я получаю сообщение об ошибке, говорящее мне, что я не упомянул о вставке входных данных для очевидных заполнителей плотных слоев. Если не использовать tensorboard, все работает так, как я и ожидал, судя по коду.

Я потратил много времени, пытаясь найти проблему, но я думаю, что должен упускать из виду что-то очень простое.

График, который я получаю в tensorboard, находится на этом изображении.

Что соответствует следующему коду:

tf.reset_default_graph()
keep_prob = 0.5

# Graph Strcuture
## Placeholders for input
with tf.name_scope('input'):
    x_ = tf.placeholder(tf.float32, shape = [None, transfer_values_train.shape[1]], name = "input1")
    y_ = tf.placeholder(tf.float32, shape = [None, num_classes], name = "labels")

## Dense Layer one with 2048 nodes
with tf.name_scope('inner_layers'):
    first_layer = tf.layers.dense(x_, units = 2048, activation=tf.nn.relu, name = "first_dense")
    dropout_layer = tf.nn.dropout(first_layer, keep_prob, name = "dropout_layer")
    #readout layer, without softmax
    y_conv = tf.layers.dense(dropout_layer, units = 2, activation=tf.nn.relu, name = "second_dense")

# Evaluation and training
with tf.name_scope('cross_entropy'):
    cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels = y_ , logits = y_conv),
                                   name = "cross_entropy_layer")
with tf.name_scope('trainer'):
    train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)

with tf.name_scope('accuracy'):
    prediction = tf.argmax(y_conv, axis = 1)
    correct_prediction = tf.equal(prediction, tf.argmax(y_, axis = 1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

Кто-нибудь знает, почему график так отличается от того, что вы ожидаете, основываясь на коде?


person Dominique Paul    schedule 12.04.2018    source источник


Ответы (1)


Рендеринг графика в тензорной доске может быть немного запутанным (поначалу), но это правильно. Взгляните на эту картинку, где я оставил только inner_layers часть вашего графика:

тензорная доска

Вы можете заметить, что:

  • first_dense и second_dense на самом деле сами являются областями имен (генерируются функцией tf.layers.dense; см. также этот вопрос).
  • Их входные/выходные тензоры находятся внутри области inner_layers и правильно связаны с dropout_layer. Здесь в каждом из плотных слоев живут соответствующие линейные операции: MatMul, BiasAdd, Relu.
  • Обе области также включают переменные (kernel и bias каждая), которые отображаются отдельно от inner_layers. Они инкапсулируют операции, относящиеся конкретно к переменной, такие как read, assign, initialize и т. д. Линейные операции в first_dense зависят от переменных операций first_dense и second_dense аналогичным образом.

    Причина такого разделения заключается в том, что в распределенных настройках переменные управляются другой задачей, называемой < em>сервер параметров. Обычно он запускается на другом устройстве (процессор, а не на графическом процессоре), иногда даже на другом компьютере. Другими словами, для тензорного потока управление переменными по своей конструкции отличается от матричного вычисления.

    Сказав это, я хотел бы увидеть режим в тензорном потоке, который не будет разбивать область видимости на переменные и операции и сохранять их связанными.

В остальном график идеально соответствует коду.

person Maxim    schedule 13.04.2018