3

J'ai formé un réseau de neurones de convolution avec la taille de lot de 10. Toutefois, lorsque les tests, je veux prédire la classification de chaque jeu de données séparément et non en lots, ce qui donne l'erreur:Formation par lots, mais test d'un élément de données individuel dans Tensorflow?

Assign requires shapes of both tensors to match. lhs shape= [1,3] rhs shape= [10,3] 

Je comprends 10 fait référence à batch_size et 3 est le nombre de classes que je classe dans. Ne peut-on pas s'entraîner en utilisant des lots et faire des tests individuellement?

Mise à jour:

Phase de formation:

batch_size=10 
classes=3 
#vlimit is some constant : same for training and testing phase 
X = tf.placeholder(tf.float32, [batch_size,vlimit ], name='X_placeholder') 
Y = tf.placeholder(tf.int32, [batch_size, classes], name='Y_placeholder') 
w = tf.Variable(tf.random_normal(shape=[vlimit, classes], stddev=0.01), name='weights') 
b = tf.Variable(tf.ones([batch_size,classes]), name="bias") 
logits = tf.matmul(X, w) + b 
entropy = tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=Y, name='loss') 
loss = tf.reduce_mean(entropy) 
optimizer = tf.train.AdamOptimizer(learning_rate).minimize(loss) 

Phase de test:

batch_size=1 
classes=3 
X = tf.placeholder(tf.float32, [batch_size,vlimit ], name='X_placeholder') 
Y = tf.placeholder(tf.int32, [batch_size, classes], name='Y_placeholder') 
w = tf.Variable(tf.random_normal(shape=[vlimit, classes], stddev=0.01), name='weights') 
b = tf.Variable(tf.ones([batch_size,classes]), name="bias") 
logits = tf.matmul(X, w) + b 
entropy = tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=Y, name='loss') 
loss = tf.reduce_mean(entropy) 
optimizer = tf.train.AdamOptimizer(learning_rate).minimize(loss) 
+1

Je crois que cela devrait être possible. Pouvez-vous ajouter un exemple de code pour montrer quels espaces réservés (lhs, rhs) ou variables etc. vous avez définis? – dijksterhuis

+1

a mis à jour la question !!! – user5722540

+0

Les deux phases font-elles partie du même graphique Tensorflow? – dijksterhuis

Répondre

3

Lorsque vous définissez votre espace réservé, utilisez:

X = tf.placeholder(tf.float32, [None, vlimit ], name='X_placeholder') 
Y = tf.placeholder(tf.int32, [None, classes], name='Y_placeholder') 
... 

plutôt pour votre phase d'entraînement et de test (en fait, vous ne devriez pas avoir à les redéfinir pour la phase de test). Définissez également votre biais comme:

b = tf.Variable(tf.ones([classes]), name="bias") 

Sinon, vous la formation d'un parti pris pour chaque échantillon dans votre lot, ce qui est pas ce que vous voulez. TensorFlow devrait automatiquement se dérouler le long de la première dimension de votre entrée et reconnaître que la taille du lot, donc pour l'entraînement, vous pouvez nourrir des lots de 10, et pour tester, vous pouvez nourrir des échantillons individuels (ou des lots de 100 ou).

3

Absolument. Les espaces réservés sont des 'buckets' qui reçoivent des données de vos entrées. La seule chose qu'ils font est de diriger les données dans votre modèle. Ils peuvent agir comme des «seaux infinis» en utilisant l'astuce None - vous pouvez y glisser autant (ou aussi peu) de données que vous le souhaitez (en fonction des ressources disponibles évidemment).

Dans la formation, essayez de remplacer batch_size avec None pour les espaces réservés de formation:

X = tf.placeholder(tf.float32, [None, vlimit ], name='X_placeholder') 
Y = tf.placeholder(tf.int32, [None, classes], name='Y_placeholder') 

Définissez ensuite tout ce que vous avez comme avant.

Puis faire des opérations de formation, par exemple:

_, Tr_loss, Tr_acc = sess.run([optimizer, loss, accuracy], feed_dict{x: btc_x, y: btc_y}) 

Pour les tests, réutiliser ces mêmes espaces réservés (X, Y) et ne prenez pas la peine de redéfinir les autres variables.

Toutes les variables Tensorflow sont statiques pour une seule définition de graphe Tensorflow. Si vous restaurez le modèle, les espaces réservés existent toujours à partir de quand il a été formé. Tout comme les autres variables, par ex. w, b, logits, entropy & optimizer.

puis terminez op de test, par exemple:

Ts_loss, Ts_acc = sess.run([loss, accuracy], feed_dict{ x: test_x , y: test_y })