2017-07-20 5 views
0

Ich bin neu bei Tensorflow, ich versuche zu trainieren mein CNN-Modell, um Gesichter in der Zukunft zu klassifizieren. Ich habe einen Bilddatensatz von 56 Personen und ihre beschnittenen Gesichter als numpige Arrays mit der Form [-1,224,224,3] und float32 type. Wenn ich versuche, tensorflow feed_dict in ich einfach befestigen, wie meine train_X und train_Y wie in tensorflow zum Einspeisen suchenValueError: Kann den Wert der Form (224, 224, 3) für Tensor 'Placeholder_3: 0' nicht einziehen, der Form hat (?, 224, 224, 3) '

Ich erhalte die typischen Fehler Valueerror: Wert kann nicht von Form füttern (224, 224, 3) für Tensor 'Placeholder_3: 0', der die Form '(?, 224, 224, 3)' hat. Es scheint einfach zu verstehen, aber ich habe keine Ahnung, wie ich meinen Code ändern kann, damit er funktioniert.

Mein Tensorflow Code ist hier

import tensorflow as tf 

config = tf.ConfigProto() 
config.gpu_options.allocator_type = 'BFC' 
#config.gpu_options.allow_growth = True 
config.gpu_options.per_process_gpu_memory_fraction = 0.6 


n_classes = 56 
batch_size = 1 
hm_epochs = 100 


#x = tf.placeholder('float', [None, 150528]) 
x = tf.placeholder('float', [None, 224,224,3]) 
y = tf.placeholder('float') 


keep_rate = 0.8 
keep_prob = tf.placeholder(tf.float32) 

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

def maxpool2d(x): 
    #      size of window   movement of window 
    return tf.nn.max_pool(x, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME') 


def convolutional_neural_network(x): 
    weights = {'W_conv1':tf.Variable(tf.random_normal([5,5,3,32])), 
       'W_conv2':tf.Variable(tf.random_normal([5,5,32,64])), 
       'W_fc':tf.Variable(tf.random_normal([224*224*3,1024])), 
       'out':tf.Variable(tf.random_normal([1024, n_classes]))} 

    biases = {'b_conv1':tf.Variable(tf.random_normal([32])), 
       'b_conv2':tf.Variable(tf.random_normal([64])), 
       'b_fc':tf.Variable(tf.random_normal([1024])), 
       'out':tf.Variable(tf.random_normal([n_classes]))} 

    x = tf.reshape(x, shape=[-1, 224, 224, 3]) 
    #x = train_X 

    #creating the first layer of CNN 
    conv1 = tf.nn.relu(conv2d(x, weights['W_conv1']) + biases['b_conv1']) # activation function 1 
    conv1 = maxpool2d(conv1) 

    #creating the second layer of CNN 
    conv2 = tf.nn.relu(conv2d(conv1, weights['W_conv2']) + biases['b_conv2']) # activation function 2 
    conv2 = maxpool2d(conv2) 

    fc = tf.reshape(conv2,[-1, 224*224*3]) 
    fc = tf.nn.relu(tf.matmul(fc, weights['W_fc'])+biases['b_fc']) 
    fc = tf.nn.dropout(fc, keep_rate) 
    output = tf.matmul(fc, weights['out'])+biases['out'] 

    return output 



def train_neural_network(x): 


    i = 0 

    prediction = convolutional_neural_network(x) 
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=prediction,labels=y)) 

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

    with tf.Session(config = config) as sess:   
     sess.run(tf.global_variables_initializer()) 

     for epoch in range(hm_epochs): 
      epoch_loss = 0 
      for _ in range(int(len(train_X)/batch_size)): 
       _, c = sess.run([optimizer, cost], feed_dict={x: train_X[i:i+batch_size], y: train_y[i:i+batch_size]}) #HERE IS THE ERROR 
       epoch_loss += c 
       i += 100 


     print('Epoch', epoch, 'completed out of',hm_epochs,'loss:',epoch_loss) 



train_neural_network(x) 

Ich werde so freuen, wenn mir jemand zu helfen in der Lage, alle zu verstehen. Vielen Dank im Voraus für Ihre Hilfe. PS: Bye übrigens, ich muss meine Daten auf die Art und Weise wie meine GPU mir OOM nicht geben. Weil ich den Fütterungsweg ändern kann, um das Stapeln auszuschließen, und es funktioniert gut außer OOM-Fehler. Die lustige Geschichte, dass wenn ich den Kernel neu starte und es einige Male neu starte. Der andere Fehler ist aufgetreten - InvalidArgumentError (siehe oben für Traceback): Eingabe zum Umformen ist ein Tensor mit 200704 Werten, aber die angeforderte Form erfordert ein Vielfaches von 150528. 200704 kann überhaupt nicht hier sein, denn das ist 224 * 224 * 4 wenn I habe nur 224 * 224 * 3

+0

passen Sie Ihren train_X auf [-1,224,224,3] an, Sie speisen einen einzigen Eingang, also sollte [1, 224, 224, 3] statt [224, 224, 3] sein –

Antwort

1

Die Form der FC-Schicht ist nicht korrekt.

#W_fc':tf.Variable(tf.random_normal([224*224*3,1024])) 
W_fc':tf.Variable(tf.random_normal([56*56*64,1024])) 
#fc = tf.reshape(conv2,[-1, 224*224*3]) 
fc = tf.reshape(conv2,[-1, 56*56*64]) 

Wenn Sie Faltung und maxpooling auf Eingangsbilder anwenden, erhalten Sie die folgende Größe von Feature-Karten.

Eingangsbilder: 224x224x3
|
(conv1) 224x224x32
|
(maxpool) 112x112x32
|
(conv2) 112x112x64
|
(maxpool) 56x56x64

Ich habe Ihren Code wie oben beschrieben repariert, es hat funktioniert.
Bitte probieren Sie es aus.

Verwandte Themen