Shape ValueError в сети LSTM с использованием Tensorflow - PullRequest
0 голосов
/ 15 мая 2018

Я хочу тренировать модель LSTM с Tensorflow. У меня есть текстовые данные в качестве входных данных, и я получаю doc2vec каждого абзаца текста и передаю его слоям lstm, но я получаю ValueError из-за несогласованности ранга формы. Я искал в Stackoverflow похожие вопросы и некоторые учебные пособия, но не смог решить эту ошибку. Ты хоть представляешь, что мне делать? Вот ошибка:

Traceback (последний вызов был последним): Файл "writeRNN.py", строка 97, в выходные данные, final_state = tf.nn.dynamic_rnn (ячейка, embed, initial_state = initial_state) Файл "myven / lib / python3.5 / site-packages / tenorflow / python / ops / rnn.py", строка 627, в dynamic_rnn DTYPE = DTYPE) Файл "myven / lib / python3.5 / site-packages / tenorflow / python / ops / rnn.py", строка 690, в _dynamic_rnn_loop для input_ in flat_input) Файл "myven / lib / python3.5 / site-packages / tenorflow / python / ops / rnn.py", строка 690, в для input_ in flat_input) Файл "myven / lib / python3.5 / site-packages / tenorflow / python / framework / tenor_shape.py", строка 761, в with_rank_at_least повысить ValueError («Shape% s должен иметь ранг не менее% d»% (self, rank)) ValueError: Shape (?,?) Должен иметь ранг не менее 3

И ниже код:

lstm_size = 128
lstm_layers = 1
batch_size = 50
learning_rate = 0.001

# Create the graph object
graph = tf.Graph()
# Add nodes to the graph
with graph.as_default():
    inputs_ = tf.placeholder(tf.int32, [None, None], name='inputs')
    labels_ = tf.placeholder(tf.int32, [None, None], name='labels')
    keep_prob = tf.placeholder(tf.float32, name='keep_prob')
with graph.as_default():
    lstm = tf.contrib.rnn.BasicLSTMCell(lstm_size)
    drop = tf.contrib.rnn.DropoutWrapper(lstm, output_keep_prob=keep_prob)
    cell = tf.contrib.rnn.MultiRNNCell([drop] * lstm_layers)
    initial_state = cell.zero_state(batch_size, tf.float32)

with graph.as_default():
    outputs, final_state = tf.nn.dynamic_rnn(cell, inputs_, initial_state=initial_state)


with graph.as_default():
    predictions = tf.contrib.layers.fully_connected(outputs[:, -1], 1, activation_fn=tf.sigmoid)
    cost = tf.losses.mean_squared_error(labels_, predictions)
    optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cost)


with graph.as_default():
    correct_pred = tf.equal(tf.cast(tf.round(predictions), tf.int32), labels_)
    accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
with tf.Session(graph=graph) as sess:
    sess.run(tf.global_variables_initializer())
    for e in range(epochs):
        state = sess.run(initial_state)
        for ii, (x, y) in enumerate(get_batches(train_x, train_y, batch_size), 1):
            feed = {inputs_: x, labels_: y[:, None], keep_prob: 0.5, initial_state: state}
            loss, state, _ = sess.run([cost, final_state, optimizer], feed_dict=feed)       

Я получил ошибку на выходах, final_state = tf.nn.dynamic_rnn (ячейка, input_, initial_state = initial_state) Строка как ошибка, которую я описал. Модель doc2vec обучается на gensim и преобразует каждое предложение в вектор со значением 100. Я пытался изменить input_ shape и label_ shape, но также получаю ту же ошибку! Я действительно не знаю, что мне делать?!

Я очень благодарен, если вы ответите на мой вопрос.

1 Ответ

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

Если вы посмотрите на документацию для функции dynamic_rnn, она говорит, что входы должны иметь три измерения. Первый предназначен для размера пакета, второй - для длины последовательности, а третий - для размера вложения данных. Ваш вход имеет только два измерения, поэтому возникает ошибка.

...