web-dev-qa-db-fra.com

TensorFlow / TFLearn: ValueError: Impossible de fournir la valeur de la forme (64,) pour Tensor u'target / Y: 0 ', qui a la forme' (?, 10) '

J'ai essayé d'effectuer une régression en utilisant tflearn et mon propre ensemble de données.

En utilisant tflearn, j'ai essayé d'implémenter un réseau convolutionnel basé sur un exemple en utilisant le jeu de données MNIST. Au lieu d'utiliser l'ensemble de données MNIST, j'ai essayé de remplacer les données de formation et de test par les miennes. Mes données sont lues à partir d'un fichier csv et ont une forme différente des données MNIST. J'ai 255 fonctionnalités qui représentent une grille 15 * 15 et une valeur cible. Dans l'exemple, j'ai remplacé les lignes 24-30 par (et inclus import numpy as np):

#read in train and test csv's where there are 255 features (15*15) and a target
csvTrain = np.genfromtxt('train.csv', delimiter=",")
X = np.array(csvTrain[:, :225]) #225, 15
Y = csvTrain[:,225]

csvTest = np.genfromtxt('test.csv', delimiter=",")
testX = np.array(csvTest[:, :225])
testY = csvTest[:,225]

#reshape features for each instance in to 15*15, targets are just a single number
X = X.reshape([-1,15,15,1])
testX = testX.reshape([-1,15,15,1])

## Building convolutional network
network = input_data(shape=[None, 15, 15, 1], name='input')

J'obtiens l'erreur suivante:

ValueError: impossible de fournir la valeur de la forme (64,) pour le tenseur u'target/Y: 0 ', qui a la forme' (?, 10) '

J'ai essayé différentes combinaisons et j'ai vu un question similaire dans stackoverflow mais je n'ai pas réussi. L'exemple de cette page ne fonctionne pas pour moi et génère une erreur similaire et je ne comprends pas la réponse fournie ou celles fournies par des questions similaires.

Comment utiliser mes propres données?

16
user728785

Réponse courte

Dans la ligne 41 de exemple MNIST , vous devez également modifier la taille de sortie 10 en 1 dans network = fully_connected(network, 10, activation='softmax') en network = fully_connected(network, 1, activation='linear'). Notez que vous pouvez supprimer le softmax final.

En regardant votre code, il semble que vous ayez une valeur cible Y, ce qui signifie utiliser la perte L2 avec mean_square (vous trouverez ici toutes les pertes disponibles):

regression(network, optimizer='adam', learning_rate=0.01,
                 loss='mean_square', name='target')

Remodelez également Y et Y_test pour avoir la forme (batch_size, 1).


Réponse longue: comment analyser l'erreur et trouver le bogue

Voici comment analyser l'erreur:

  • L'erreur est Cannot feed value ... for Tensor 'target/Y', Ce qui signifie qu'elle provient de l'argument Y feed_dict .
  • Encore une fois, selon l'erreur, vous essayez de fournir une valeur Y of shape (64,) alors que le réseau attend une forme (?, 10).
    • Il attend une forme (batch_size, 10), car à l'origine c'est un réseau pour MNIST (10 classes)
  • Nous voulons maintenant modifier la valeur attendue du réseau pour Y.
    • dans le code, nous voyons que la dernière couche fully_connected(network, 10, activation='softmax') retourne une sortie de taille 10
    • Nous changeons cela en une sortie de taille 1 sans softmax: fully_connected(network, 1, activation='linear')

Au final, ce n'était pas un bug, mais une mauvaise architecture de modèle .

31
Olivier Moindrot