Ошибка TensorFlow: логины и метки должны быть одинакового размера
Я пытаюсь изучить TensorFlow, внедряя ApproximatelyAlexNet на основе различных примеров в Интернете. В основном расширив пример AlexNet здесь, чтобы получить 224x224 RGB-изображения (а не 28x28 изображений в оттенках серого) и добавив еще несколько слоев, изменив размеры ядра, шаги, и т.д., в других реализациях AlexNet, которые я нашел в Интернете.
Проработали несколько ошибок несогласованного типа, но это меня озадачило:
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.
Если я зарегистрирую форму x и y, которую я передаю в
sess.run(optimizer, feed_dict={x: batchImages, y: batchLabels, keepProb: P_DROPOUT})
Я получаю
x shape: (1, 150528)
y shape: (1, 10)
Как ожидалось: 150528 = 224 * 224 RGB пикселей и один горячий вектор, представляющий мои метки.
Поблагодарили бы за помощь в выяснении этого!
Обновить: код, демонстрирующий ошибку здесь:
https://gist.github.com/j4m3z0r/e70096d0f7bd4bd24c42
Ответы
Ответ 1
Спасибо, что поделились своим кодом как Gist. Для согласования фигур необходимы два изменения:
-
Строка:
fc1 = tf.reshape(pool5, [-1, wd1Shape[0]])
... отвечает за ошибочный 49
в размерности партии. Входной сигнал 1 x 7 x 7 x 256, и он изменен как 49 x 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.
-
После внесения этого изменения размер весовой матрицы 'wd1'
(256 x 4096) не соответствует количеству узлов в fc1
. Вы можете изменить определение этой матрицы следующим образом:
'wd1': tf.Variable(tf.random_normal([12544, 4096])),
... хотя вы можете изменить другие весы или выполнить дополнительный пул, чтобы уменьшить размер этой матрицы.
Ответ 2
Учитывая, что вы не указали фактический код, вы используете его, чтобы точно сказать, что неправильно.
Вот несколько общих советов для отладки таких проблем:
-
Добавьте print(tensor.get_shape())
в места, связанные с проблемой (в вашем случае dense2, out, _weights ['out'], _biases ['out'] являются подозреваемыми).
-
Убедитесь, что ваши умножения матрицы находятся в правильном порядке (например, 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. Я могу только догадываться, что вы изменили, но может быть одним из преобразований.
Ответ 3
Эта проблема связана с тем, что ваша переменная класса и метка не совпадают.
например: -
В вашем коде вы объявили переменную класса как 10
Но метка может не быть 10.
Как только вы внесете переменную класса и отметьте ее таким же размером. Эта проблема будет решена.