1

Je suis en train de construire LSTM RNN basé sur ce guide: http://monik.in/a-noobs-guide-to-implementing-rnn-lstm-using-tensorflow/ Mon entrée est ndarray avec la taille de 89102 * 39 (89102 lignes, 39 caractéristiques). Il y a 3 étiquettes pour les données - 0,1,2 Il semble que j'ai un problème avec la définition des espaces réservés mais je ne suis pas sûr de ce que c'est.placeholders définition pour entrée nd-array dans tensorflow

Mon code est:

data = tf.placeholder(tf.float32, [None, 1000, 39]) 
    target = tf.placeholder(tf.float32, [None, 3]) 
    cell = tf.nn.rnn_cell.LSTMCell(self.num_hidden) 

    val, state = tf.nn.dynamic_rnn(cell, data, dtype=tf.float32) 
    val = tf.transpose(val, [1, 0, 2]) 
    last = tf.gather(val, int(val.get_shape()[0]) - 1) 


    weight = tf.Variable(tf.truncated_normal([self.num_hidden, int(target.get_shape()[1])])) 
    bias = tf.Variable(tf.constant(0.1, shape=[target.get_shape()[1]])) 

    prediction = tf.nn.softmax(tf.matmul(last, weight) + bias) 

    cross_entropy = -tf.reduce_sum(target * tf.log(tf.clip_by_value(prediction, 1e-10, 1.0))) 

    optimizer = tf.train.AdamOptimizer() 
    minimize = optimizer.minimize(cross_entropy) 

    mistakes = tf.not_equal(tf.argmax(target, 1), tf.argmax(prediction, 1)) 
    error = tf.reduce_mean(tf.cast(mistakes, tf.float32)) 


    init_op = tf.initialize_all_variables() 
    sess = tf.Session() 
    sess.run(init_op) 
    batch_size = 1000 
    no_of_batches = int(len(train_input)/batch_size) 
    epoch = 5000 
    for i in range(epoch): 
     ptr = 0 
     for j in range(no_of_batches): 
      inp, out = train_input[ptr:ptr + batch_size], train_output[ptr:ptr + batch_size] 
      ptr += batch_size 
      sess.run(minimize, {data: inp, target: out}) 
     print("Epoch - ", str(i)) 

Et j'obtiens une erreur suivante:

File , line 133, in execute_graph 
sess.run(minimize, {data: inp, target: out}) 

    File "/usr/local/lib/python3.5/dist- 
packages/tensorflow/python/client/session.py", line 789, in run 
    run_metadata_ptr) 

    File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py", line 975, in _run 
    % (np_val.shape, subfeed_t.name, str(subfeed_t.get_shape()))) 

ValueError: Cannot feed value of shape (1000, 39) for Tensor 'Placeholder:0', which has shape '(1000, 89102, 39)' 

Toute idée de ce qui pourrait être l'origine du problème?

Répondre

1

Comme indiqué here, la fonction dynamic_rnn prend les entrées par lots de forme

[batch_size, truncated_backprop_length, input_size]

Dans le lien que vous avez fourni, la forme de l'espace réservé était

data = tf.placeholder(tf.float32, [None, 20,1]) 

Cela signifie qu'ils a choisi truncated_backprop_length=20 et input_size=1.
Leurs données était le tableau 3D suivant:

[ 
array([[0],[0],[1],[0],[0],[1],[0],[1],[1],[0],[0],[0],[1],[1],[1],[1],[1],[1],[0],[0]]), 
array([[1],[1],[0],[0],[0],[0],[1],[1],[1],[1],[1],[0],[0],[1],[0],[0],[0],[1],[0],[1]]), 
..... 
] 

En fonction de votre code, il semble que train_input est un tableau 2D et non un tableau 3D. Par conséquent, vous devez le transformer en un tableau 3D. Pour ce faire, vous devez décider quels paramètres vous voulez utiliser pour truncated_backprop_length et input_size. Ensuite, vous devez définir data de manière appropriée.

Par exemple, si vous voulez truncated_backprop_length et input_size à 39 et 1 respectivement, vous pouvez faire

import numpy as np 
train_input=np.reshape(train_input,(len(train_input),39,1)) 
data = tf.placeholder(tf.float32, [None, 39,1]) 

J'ai changé votre code selon la discussion ci-dessus et l'exécuter sur certaines données aléatoires que je produisais. Il fonctionne sans lancer d'erreur. Voir le code ci-dessous:

import tensorflow as tf 
import numpy as np 
num_hidden=5 
train_input=np.random.rand(89102,39) 
train_input=np.reshape(train_input,(len(train_input),39,1)) 
train_output=np.random.rand(89102,3) 

data = tf.placeholder(tf.float32, [None, 39, 1]) 
target = tf.placeholder(tf.float32, [None, 3]) 
cell = tf.nn.rnn_cell.LSTMCell(num_hidden) 

val, state = tf.nn.dynamic_rnn(cell, data, dtype=tf.float32) 
val = tf.transpose(val, [1, 0, 2]) 
last = tf.gather(val, int(val.get_shape()[0]) - 1) 


weight = tf.Variable(tf.truncated_normal([num_hidden, int(target.get_shape()[1])])) 
bias = tf.Variable(tf.constant(0.1, shape=[target.get_shape()[1]])) 

prediction = tf.nn.softmax(tf.matmul(last, weight) + bias) 

cross_entropy = -tf.reduce_sum(target * tf.log(tf.clip_by_value(prediction, 1e-10, 1.0))) 

optimizer = tf.train.AdamOptimizer() 
minimize = optimizer.minimize(cross_entropy) 

mistakes = tf.not_equal(tf.argmax(target, 1), tf.argmax(prediction, 1)) 
error = tf.reduce_mean(tf.cast(mistakes, tf.float32)) 


init_op = tf.initialize_all_variables() 
sess = tf.Session() 
sess.run(init_op) 
batch_size = 1000 
no_of_batches = int(len(train_input)/batch_size) 
epoch = 5000 
for i in range(epoch): 
    ptr = 0 
    for j in range(no_of_batches): 
     inp, out = train_input[ptr:ptr + batch_size], train_output[ptr:ptr + batch_size] 
     ptr += batch_size 
     sess.run(minimize, {data: inp, target: out}) 
    print("Epoch - ", str(i)) 
+0

Quand j'ai essayé d'utiliser un espace réservé 2D (tf.placeholder (tf.float32, [1000, 39]) Je suis l'erreur: ValueError: forme (39, 1000) doit avoir un rang au moins 3 Alors, comment pourriez-vous suggérer que je vais transformer les données en 3D? Il est à noter que je suis nouveau avec tf, donc je pourrais avoir quelques erreurs de débutant .... – oren

+0

@Oren voir ma mise à jour –

+0

J'ai essayé de changer le code en fonction de votre suggestion mais j'ai quand même obtenu une erreur: ValueError: Impossible d'alimenter la valeur de la forme (1000,) pour Tensor 'Placeholder_1: 0', whi ch a la forme '(?, 3)' Je devinais que cette erreur faisait référence au vecteur d'apprentissage, donc j'ai essayé de le remodeler en 2D mais cela n'a pas fonctionné: train_output = np.reshape (train_output, (len (train_output), 1)) Une suggestion sur la façon de résoudre ce problème? – oren