Ошибка 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.

Как только вы внесете переменную класса и отметьте ее таким же размером. Эта проблема будет решена.