Я пытался изучить TensorFlow, реализуя ApproximatelyAlexNet на основе различных примеров в Интернете. В основном расширение примера AlexNet здесь, чтобы получить изображения RGB размером 224x224 (вместо изображений в оттенках серого 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

16
j4m3z0r 30 Дек 2015 в 00:33

4 ответа

Лучший ответ

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

  1. Линия:

    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.

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

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

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

14
mrry 30 Дек 2015 в 06:00

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

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

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

0
Bhajesh Bharathan 7 Фев 2018 в 15:26

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

Вот несколько общих советов по устранению таких проблем:

  • Добавьте print(tensor.get_shape()) в те места, которые связаны с проблемой (в вашем случае: "solid2", "out", _weights ['out'], _biases ['out'] являются подозреваемыми).

  • Убедитесь, что умножение вашей матрицы выполнено в правильном порядке (например, «density2 на _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
ilblackdragon 29 Дек 2015 в 23:57

У меня была аналогичная проблема при использовании model.fit (..). Оказывается, мой output_size был определен как 2 при использовании "binary_crossentropy" в качестве функции потерь, тогда как он должен был быть определен как 1.

2
Yuv_c 2 Фев 2020 в 13:14