2016-12-19 3 views
1

Я тренирую набор данных PTB для прогнозирования символов (то есть LSTM на уровне персонажа).
Размер для учебных партий - [len (dataset) x vocabulary_size]. Здесь, vocabulary_size = 27 (26 + 1 [для токенов unk и пробелов или стоп-стопов.]).
Это код для преобразования в one_hot для ввода обоих партий (arrX) и меток (arrY).
Ошибка в размерности для LSTM в tflearn

arrX = np.zeros((len(train_data), vocabulary_size), dtype=np.float32) 
arrY = np.zeros((len(train_data)-1, vocabulary_size), dtype=np.float32) 
for i, x in enumerate(train_data): 
    arrX[i, x] = 1 
arrY = arrX[1, :] 

творю заполнитель входа (X) и меток (Y) в графике, чтобы передать его tflearn LSTM.Following код для графа и сессии.

batch_size = 256 
with tf.Graph().as_default(): 
    X = tf.placeholder(shape=(None, vocabulary_size), dtype=tf.float32)  
    Y = tf.placeholder(shape=(None, vocabulary_size), dtype=tf.float32)  
    print (utils.get_incoming_shape(tf.concat(0, Y))) 
    print (utils.get_incoming_shape(X)) 
    net = tflearn.lstm(X, 512, return_seq=True) 
    print (utils.get_incoming_shape(net)) 
    net = tflearn.dropout(net, 0.5) 
    print (utils.get_incoming_shape(net)) 
    net = tflearn.lstm(net, 256) 
    net = tflearn.fully_connected(net, vocabulary_size, activation='softmax') 
    loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(net, Y)) 
    optimizer = tf.train.AdamOptimizer(learning_rate=0.01).minimize(loss) 

init = tf.initialize_all_variables() 

with tf.Session() as sess: 
    sess.run(init) 
    offset=0 
    avg_cost = 0 
    total_batch = (train_length-1)/256 
    print ("No. of batches:", '%d' %total_batch) 
    for i in range(total_batch) : 
     batch_xs, batch_ys = trainX[offset : batch_size + offset], trainY[offset : batch_size + offset] 
     sess.run(optimizer, feed_dict={X: batch_xs, Y: batch_ys}) 
     cost = sess.run(loss, feed_dict={X: batch_xs, Y: batch_ys}) 
     avg_cost += cost/total_batch 
     if i % 20 == 0: 
      print("Step:", '%03d' % i, "Loss:", str(cost)) 
     offset += batch_size  

SO, я получаю следующую ошибку assert ndim >= 3, "Input dim should be at least 3." AssertionError: Input dim should be at least 3.

Как я могу resolve this error? Есть ли альтернативное решение? Должен ли я писать отдельное определение LSTM?

ответ

0

Я не привык к этим наборам данных, но вы пробовали использовать tflearn.input_data (shape) с уровнем tflearn.embedding? Если вы используете вложение, я полагаю, что вам не придется изменять свои данные в 3 измерениях.

0

lstm слой принимает ввод формы 3-D тензор [сэмплы, временные метки, входные данные]. Вы можете изменить свои входные данные на 3D. В вашей заданной форме trainX есть [len(dataset) x vocabulary_size]. Форма trainX = trainX.reshape(trainX.shape+ (1,)) будет изменена на [len(dataset), vocabulary_size, 1]. Эти данные могут быть переданы в lstm путем простого изменения входного заполнителя X. Добавьте еще один размер к заполнителю на X = tf.placeholder(shape=(None, vocabulary_size, 1), dtype=tf.float32).

Смежные вопросы