tenorflow GradientDescentOptimizer: несовместимые формы между операционным вводом и вычисленным входным градиентом - PullRequest
0 голосов
/ 24 мая 2018

Модель хорошо работала до шага оптимизации.Однако, когда я хочу оптимизировать свою модель, появляется сообщение об ошибке:

Несовместимые формы между операционным вводом и вычисленным входным градиентом.Операция пересылки: softmax_cross_entropy_with_logits_sg_12.Индекс ввода: 0. Исходная форма ввода: (16, 1).Расчетная входная градиентная форма: (16, 16)

следующий мой код.

import tensorflow as tf;  
batch_size = 16
size = 400
labels  = tf.placeholder(tf.int32, batch_size)
doc_encode  = tf.placeholder(tf.float32, [batch_size, size])

W1 = tf.Variable(np.random.rand(size, 100), dtype=tf.float32, name='W1')
b1 = tf.Variable(np.zeros((100)), dtype=tf.float32, name='b1')

W2 = tf.Variable(np.random.rand(100, 1),dtype=tf.float32, name='W2')
b2 = tf.Variable(np.zeros((1)), dtype=tf.float32, name='b2')

D1 = tf.nn.relu(tf.matmul(doc_encode, W1) + b1)
D2 = tf.nn.selu(tf.matmul(D1, W2) + b2)

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=D2))
optim = tf.train.GradientDescentOptimizer(0.01).minimize(cost, aggregation_method=tf.AggregationMethod.EXPERIMENTAL_TREE)
with tf.Session() as sess:  
    sess.run(tf.global_variables_initializer())
    _cost, _optim = sess.run([cost, optim], {labels:np.array([1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1]), doc_encode: np.random.rand(batch_size, size)})

1 Ответ

0 голосов
/ 24 мая 2018

Исправьте следующие вещи.

Во-первых,

Измените форму ввода заполнителей на эту

X = tf.placeholder(tf.int32, shape=[None,400]
Y = tf.placeholder(tf.float32, shape=[None,1]

Почему Нет , потому что это дает вам свободукормление любого размера.Это предпочтительнее, потому что во время обучения вы хотите использовать мини-партию, но при прогнозировании или выводе времени вы, как правило, будете кормить одну вещь.Обозначая «Нет», об этом позаботится.

Во-вторых,

Исправьте инициализацию веса, вы кормите случайными значениями, они тоже могут быть отрицательными.Всегда рекомендуется инициализировать с небольшим положительным значением.(Я вижу, что вы используете relu в качестве активации, градиент которого равен нулю для отрицательных значений веса, поэтому эти веса никогда не обновляются в градиентном спуске, другими словами, это бесполезные веса)

В-третьих,

Логиты - это результат, который вы получаете от W2*x + b2.И это tf.nn.softmax_cross.....(..) автоматически применяет активацию softmax.Так что не нужно SeLu для последнего слоя.

...