2015-12-29 2 views
11

Я пытаюсь изучить TensorFlow, внедряя ApproximatelyAlexNet на основе различных примеров в Интернете. В основном расширяя пример AlexNet here, чтобы получить 224x224 RGB-изображения (а не 28x28 изображений в оттенках серого) и добавили еще несколько слоев, изменив размеры ядра, шаги и т. Д. На другие реализованные в AlexNet реализации, которые я нашел в Интернете.Ошибка TensorFlow: логины и метки должны быть одинакового размера

Работали через ряд несогласованных ошибок типа формы, но это один имеет меня в тупик:

tensorflow.python.framework.errors.InvalidArgumentError: logits and labels must be same size: logits_size=dim { size: 49 } dim { size: 10 } labels_size=dim { size: 1 } dim { size: 10 } 
    [[Node: SoftmaxCrossEntropyWithLogits = SoftmaxCrossEntropyWithLogits[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/gpu:0"](Softmax, _recv_Placeholder_1_0/_13)]] 
    [[Node: gradients/Mean_grad/range_1/_17 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/cpu:0", send_device="/job:localhost/replica:0/task:0/gpu:0", send_device_incarnation=1, tensor_name="edge_457_gradients/Mean_grad/range_1", tensor_type=DT_INT32, _device="/job:localhost/replica:0/task:0/cpu:0"]()]] 

49 размер особенно озадачивает. Для отладки, мой размер партии в настоящее время 1, если увеличить его до 2, то 49 будет 98.

Если я вхожу в форму х и у, что я прохожу в

sess.run(optimizer, feed_dict={x: batchImages, y: batchLabels, keepProb: P_DROPOUT}) 

я получаю

x shape: (1, 150528) 
y shape: (1, 10) 

Это как ожидалось: 150528 = 224 * 224 RGB пикселей и один горячий вектор, представляющий мои метки.

Поблагодарили бы за помощь в определении этого!

Update: код экспонирование ошибки здесь:

https://gist.github.com/j4m3z0r/e70096d0f7bd4bd24c42

ответ

12

Спасибо, что поделились своим кодом как Gist. Есть два изменения, которые необходимы, чтобы сделать формы соглашаются:

  1. Линия:

    fc1 = tf.reshape(pool5, [-1, wd1Shape[0]]) 
    

    ... отвечает за в пакетном измерении ошибочных 49.Вход 1 х 7 х 7 х 256, и она будет изменена, чтобы 49 х 256, потому что wd1Shape[0] 256. Одним из возможных замена заключается в следующем:

    pool5Shape = pool5.get_shape().as_list() 
    fc1 = tf.reshape(pool5, [-1, pool5Shape[1] * pool5Shape[2] * pool5Shape[3]]) 
    

    ... который даст fc1 форму 1 x 12544.

  2. После внесения этого изменения размер весовой матрицы 'wd1' (256 x 4096) не соответствует количеству узлов в fc1. Вы можете изменить определение этой матрицы следующим образом:

    'wd1': tf.Variable(tf.random_normal([12544, 4096])), 
    

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

+0

Удивительный. Благодарю. Я думаю, что смогу с этим справиться. Очень признателен. – j4m3z0r

+0

Последующий вопрос: существует ли способ получить TensorFlow в более информативном режиме в этом случае? Похоже, что TF мог понять, что были несогласованные фигуры точно на той линии, которую вы отметили. – j4m3z0r

+0

Я думаю, что проблема заключается в -1 в изменении, которая действует как подстановочный знак и (в этом случае) теряет информацию о ведущем измерении. Это затрудняет понимание TensorFlow истинной формы без запуска программы, и могут быть даже допустимые программы, в которых вы разбиваете один пример на 49 меньших примеров. Вероятно, нам нужны более эффективные способы выражения инвариантных преобразований размера партии, чтобы избежать этого ('tf.expand_dims()' и 'tf.squeeze()' полезны, но, возможно, нам нужен 'tf.flatten_dims()' для этого случая). – mrry

0

Учитывая, что вы не предоставили фактический код, который вы используете его трудно точно сказать, что это неправильно.

Вот некоторые общие советы для отладки таких проблем:

  • Добавить print(tensor.get_shape()) в местах, связанных с проблемой (в вашем случае dense2, из, _weights [ «из»], _biases [ «из» ] являются подозреваемыми).

  • Убедитесь, что ваши умножения матрицы находятся в правильном порядке (например, dense2 by _weights ['out'], должны приводить к матрице batch_size x 10).

Если вы изменили код в AlexNet вы связаны между собой, вы, вероятно, были изменены следующие строки:

dense1 = tf.reshape(norm3, [-1, _weights['wd1'].get_shape().as_list()[0]]) # Reshape conv3 output to fit dense layer input 
dense1 = tf.nn.relu(tf.matmul(dense1, _weights['wd1']) + _biases['bd1'], name='fc1') # Relu activation 
dense2 = tf.nn.relu(tf.matmul(dense1, _weights['wd2']) + _biases['bd2'], name='fc2') # Relu activation 
out = tf.matmul(dense2, _weights['out']) + _biases['out'] 

Вероятно, форма dense2 является [49, 1024] в вашем случае. Вы можете проверить, добавив печать dense2.get_shape(). Вы должны печатать для фигур для всех тензоров, пока не найдете тот, который получает 49. Я могу только догадываться, что вы изменили, но это может быть одна из преобразований.

+0

Спасибо за примечание. Я загрузил суть здесь, который является автономным и демонстрирует вопрос: https://gist.github.com/j4m3z0r/e70096d0f7bd4bd24c42 Вы правы: максимальные пулы слой заканчивается размером 7х7 = 49. – j4m3z0r

+0

Хорошо, сделав некоторый прогресс: добавив больше уровней maxpool после того, как различные свертки уменьшат число 49 до 4, что, я думаю, имеет смысл: мы начинаем с ввода с более высоким разрешением, поэтому нам нужно больше уровней maxPool, чтобы привести к соразмерной понижающей дискретизации ввода , – j4m3z0r

+0

Первое измерение должно быть размером партии, поэтому даже если оно равно 4 - оно все еще неверно. Я думаю, что проблема 'fc1 = tf.reshape (пул5, [-1, wd1Shape [0]])' находится в этой строке. Когда вы делаете -1, он в значительной степени захватывает остальную часть пула 5. Попробуйте заменить -1 на 1 (размер партии) и посмотреть, есть ли рассогласование, и исправить изменение формы из wd1Shape [0] 'в зависимости от того, каким он должен быть. – ilblackdragon

0

Эта проблема объясняется тем, что переменная и метка класса не соответствуют друг другу.

например: - В коде, вы объявили переменную класса как 10 Но метка не может быть 10.

После того, как вы сделали свой класс переменной и маркировать ту же размерность. Эта проблема будет решена.

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