2 votes

tensorflow cnn error : InvalidArgumentError (voir ci-dessus pour le traceback) : les logits et les labels doivent être de la même taille

J'ai écrit ce code en le modifiant à partir du tutoriel officiel de tensorflow. J'avais un réseau comme suit :

def weight_variable(shape):
    initial = tf.truncated_normal(shape, stddev=0.1)
    return tf.Variable(initial)

def bias_variable(shape):
    initial = tf.constant(0.1, shape=shape)
    return tf.Variable(initial)

def conv2d(x, w):
    return tf.nn.conv2d(x, w, strides=[1, 1, 1, 1], padding='SAME')

def max_pool_2x2(x):
    return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')

import tensorflow as tf
import numpy as np

train_feature = np.array(model.dataset[0])
train_label = np.array(model.labelset[0])
print(train_feature.shape)
print(train_label.shape)

x_placeholder = tf.placeholder(tf.float32, shape=[None, train_feature.shape[1]])
y_placeholder = tf.placeholder(tf.float32, shape=[None, 8])
# network structure
w_conv1 = weight_variable([5, 5, 1, 32])
b_conv1 = bias_variable([32])
x_image = tf.reshape(x_placeholder, [-1, 160, 120, 1])
h_conv1 = tf.nn.relu(conv2d(x_image, w_conv1) + b_conv1)
h_pool1 = max_pool_2x2(h_conv1)

w_conv2 = weight_variable([5, 5, 32, 64])
b_conv2 = bias_variable([64])

h_conv2 = tf.nn.relu(conv2d(h_pool1, w_conv2) + b_conv2)
h_pool2 = max_pool_2x2(h_conv2)

w_fc1 = weight_variable([320, 1024])
b_fc1 = bias_variable([1024])

h_pool2_flat = tf.reshape(h_pool2, [-1, 320])
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, w_fc1) + b_fc1)

keep_prob = tf.placeholder(tf.float32)
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)

w_fc2 = weight_variable([1024, 8])
b_fc2 = bias_variable([8])

y_conv = tf.matmul(h_fc1_drop, w_fc2) + b_fc2

cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y_conv, y_placeholder))
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
sess = tf.InteractiveSession()
sess.run(tf.global_variables_initializer())
batch = (train_feature, np.eye(8)[train_label])
train_step.run(feed_dict={x_placeholder: batch[0], y_placeholder: batch[1], keep_prob: 0.5})

L'erreur est la suivante :

cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y_conv, y_placeholder))
File "/Users/lintseju/anaconda/lib/python3.5/site-packages/tensorflow/python/ops/nn_ops.py", line 1449, in softmax_cross_entropy_with_logits
precise_logits, labels, name=name)
File "/Users/lintseju/anaconda/lib/python3.5/site-packages/tensorflow/python/ops/gen_nn_ops.py", line 2265, in _softmax_cross_entropy_with_logits
features=features, labels=labels, name=name)
File "/Users/lintseju/anaconda/lib/python3.5/site-packages/tensorflow/python/framework/op_def_library.py", line 759, in apply_op
op_def=op_def)
File "/Users/lintseju/anaconda/lib/python3.5/site-packages/tensorflow/python/framework/ops.py", line 2240, in create_op
original_op=self._default_original_op, op_def=op_def)
File "/Users/lintseju/anaconda/lib/python3.5/site-packages/tensorflow/python/framework/ops.py", line 1128, in __init__
self._traceback = _extract_stack()

InvalidArgumentError (see above for traceback): logits and labels must be same size: logits_size=[2400,8] labels_size=[10,8]
 [[Node: SoftmaxCrossEntropyWithLogits = SoftmaxCrossEntropyWithLogits[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](Reshape_2, Reshape_3)]]

train_feature est un tableau numpy (10, 19200), et train label est un tableau numpy (10,). Quelqu'un sait-il pourquoi logits_size=[2400,8] ?

1voto

mefathy Points 193

Avant de transmettre une image (qu'il s'agisse de l'entrée du réseau ou d'une sortie intermédiaire d'une couche convolutionnelle (CONV)) à une couche entièrement connectée (FC), vous devez vous assurer que (1) vous transformez correctement l'image en un vecteur 1D et que (2) vous définissez les dimensions des poids du réseau pour qu'ils correspondent au vecteur 1D. Dans votre cas, le passage aux couches FC a lieu après la mise en commun de la deuxième couche. Bien que vous vous assuriez que h_pool2_flat ont une dimension compatible avec les poids w_fc1 de la première couche FC, vous ne définissez pas correctement la dimension plate. La valeur 320 codée en dur n'est pas la dimension correcte dans ce cas. En outre, essayer de coder en dur n'est peut-être pas la meilleure pratique en général et le code peut continuer à se casser la figure chaque fois que vous modifiez la taille de l'entrée ou la pile convolutive du réseau (par exemple, en ajoutant/supprimant des couches de pooling ou en ajustant les strides de certaines couches).

Au lieu de cela, vous devez ajouter du code pour calculer automatiquement la dimension plate et utiliser la valeur calculée pour configurer les dimensions, comme dans l'exemple suivant :

# Here happens conversion from 2/3D images to 1D vectors.
h_pool2_shape = h_pool2.get_shape()
# Don't hard-code the 1D vector dim. Rather, (1) multiply image's height,
# width and depth to get it.
h_pool2_dim = h_pool2_shape[1] * h_pool2_shape[2] * h_pool2_shape[3]
# (2) Use the computed 1D dimension to set the FC1 weight matrix dimensions.
w_fc1 = weight_variable(tf.stack([h_pool2_dim, 1024]))
b_fc1 = bias_variable([1024])
# (3) Use the same 1D dimension to correctly reshape the batch matrix.
h_pool2_flat = tf.reshape(h_pool2, tf.stack([-1, h_pool2_dim]))
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, w_fc1) + b_fc1)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X