2016-12-19 6 views
1

문자 (문자 레벨 LSTM)를 예측하기 위해 PTB 데이터 세트를 연습 중입니다.
교육 배치의 차원은 [len (dataset) x vocabulary_size]입니다. 여기에서 vocabulary_size = 27 (26 + 1 [unk 토큰 및 공백 또는 완전 멈춤의 경우]).
입력 (arrX) 및 레이블 (arrY)에 대해 one_hot으로 변환하기위한 코드입니다.
tflearn의 LSTM에 대한 치수 오류

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, :] 

I 그것이 LSTM.Following tflearn를 전달할 그래프 입력 (X)과 라벨 (Y)의 틀을 제작하고 그래프 및 세션에 대한 코드이다.

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  

그래서, 나는 다음과 같은 오류 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 차원 텐서 [샘플, 타임 스텝, 입력 희미한] 모양의 입력을받습니다. 입력 데이터를 3D로 바꿀 수 있습니다. 문제가있는 모양에서 trainX[len(dataset) x vocabulary_size]입니다. trainX = trainX.reshape(trainX.shape+ (1,)) 모양을 사용하면 [len(dataset), vocabulary_size, 1]으로 변경됩니다. 이 데이터는 입력 자리 표시 자 X의 간단한 변경으로 lstm으로 전달할 수 있습니다. 자리 표시 자에 차원을 하나 더 추가하십시오 (X = tf.placeholder(shape=(None, vocabulary_size, 1), dtype=tf.float32)).