2017-09-21 1 views
3

J'essaye d'implémenter le perceptron multicouche dans TensorFlow avec des données de tableau 4D-numpy J'ai eu ce problème sur la fonction MatMul. J'espère que quelqu'un peut m'aider ici et je vous remercie beaucoup.Problème MatMul dans TensorFlow

ValueError: Shape must be rank 2 but is rank 4 for 'MatMul' (op: 'MatMul') with input shapes: [1500,2,10000,5], [1500,1500]. 

Mon code est:

# Network Parameters 
n_hidden_1 = 1500 # 1st layer number of neurons 
n_hidden_2 = 1500 # 2nd layer number of neurons 
n_input = 1500 
n_classes = 1500 

# tf Graph input 
X = tf.placeholder("float", [1500,2,10000,5]) 
Y = tf.placeholder("float", [1500,1]) 

# Store layers weight & bias 
weights = { 
    'h1': tf.Variable(tf.random_normal([n_input, n_hidden_1])), 
    'h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])), 
    'out': tf.Variable(tf.random_normal([n_hidden_2, n_classes])) 
} 
biases = { 
    'b1': tf.Variable(tf.random_normal([n_hidden_1])), 
    'b2': tf.Variable(tf.random_normal([n_hidden_2])), 
    'out': tf.Variable(tf.random_normal([n_classes])) 
} 


# Create model 
def multilayer_perceptron(x): 

    layer_1 = tf.add(tf.matmul(x, weights['h1']), biases['b1']) 

    layer_2 = tf.add(tf.matmul(layer_1, weights['h2']), biases['b2']) 

    out_layer = tf.matmul(layer_2, weights['out']) + biases['out'] 
    return out_layer 

    # Construct model 
    logits = multilayer_perceptron(X) 

La deuxième erreur est:

ValueError: Dimension 1 in both shapes must be equal, but are 1500 and 1 for 'cost/SoftmaxCrossEntropyWithLogits' (op: 'SoftmaxCrossEntropyWithLogits') with input shapes: [1500,1500], [1500,1]. 

le code est:

p_keep_input = tf.placeholder("float", name="p_keep_input") 
p_keep_hidden = tf.placeholder("float", name="p_keep_hidden") 
py_x = model(X, w_h, w_h2, w_o, p_keep_input, p_keep_hidden) 

with tf.name_scope("cost"): 
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=py_x, labels=Y)) 
    train_op = tf.train.RMSPropOptimizer(0.001, 0.9).minimize(cost) 

Répondre

2

Pour les couches denses que vous commencez généralement avec remodelant données d'entrée à une rangée par échantillon, de sorte une matrice [nSamples, nFeatures] (avec 2 dimensions, pas 4), puisque vous n'utiliserez pas la structure. Seulement cela permet au MatMul de se produire correctement (c'est maintenant une multiplication de deux matrices 2D). Je suppose que voici nSamples = n_inputs = 1500, et nFeatures = 2*10000*5. Dans ce cas, veillez à ce que h1 soit de forme [nFeatures, n_hidden_1].

n_features = 2*10000*5 
weights = { 
    'h1': tf.Variable(tf.random_normal([n_features, n_hidden_1])), 
    'h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])), 
    'out': tf.Variable(tf.random_normal([n_hidden_2, n_classes])) 
} 

...

def multilayer_perceptron(x): 
    x_reshaped = tf.reshape(x, [None, n_features]) 
    layer_1 = tf.add(tf.matmul(x_reshaped, weights['h1']), biases['b1']) 

Par ailleurs, pour faciliter le débogage, vous devez utiliser différentes n_inputs, n_hidden, n_classes (vous pouvez avoir pas d'autre choix pour n_classes mais vous pouvez changer les autres), De cette façon, vous comprendrez plus facilement les erreurs de façonnage (alors qu'ici vous voyez une forme de 1500, vous ne savez pas d'où elle vient, donc c'est plus déroutant et peut même être là pour de mauvaises raisons et causer des problèmes plus tard).

Réponse au 2ème problème (modifier):

tf.nn.softmax_cross_entropy_with_logits attend les logits et les étiquettes des mêmes [N_SAMPLES, n_classes] forme, les étiquettes étant un chaud juste codé comme les logits (sauf QU'ILS ll se compose habituellement seulement d'un 1 et de zéros). Si Y est de forme [n_samples, 1], alors je suppose qu'il contient juste l'index de classe pour chaque échantillon. Dans ce cas, vous devriez utiliser sparse_softmax_cross_entropy_with_logits à la place, et Y devrait être de forme [n_samples] seulement, pas [n_samples, 1].

+0

merci beaucoup! il a résolu le problème;) – user37353

+0

J'ai eu une autre erreur. Je vais l'ajouter à ma question. – user37353

+0

Je l'ai répondu. À l'avenir, s'il vous plaît poster de nouvelles questions arrising dans un autre poste, car ils sont des problèmes différents, de sorte que vous pouvez accepter la première réponse et obtenir plus d'attention sur la nouvelle erreur. Et vous ne devriez certainement pas utiliser des nombres égaux partout (votre 1500 pour n_samples, n_classes, n_hidden_1, n_hidden_2). Même si vous utilisez 1500, 1499, 1498, 1497, il aura presque exactement le même comportement, mais vous saurez beaucoup plus vite si vos formes sont ce qu'elles devraient être. – gdelab