2017-11-17 1 views
1
import tensorflow as tf 
import numpy as np 
import glob 
fq=glob.glob("*.jpg") 
filename_queue = tf.train.string_input_producer(fq) 
reader = tf.WholeFileReader() 
key, value = reader.read(filename_queue) 
my_img = tf.image.decode_jpeg(value,channels=3) 
my_img=tf.cast(my_img,tf.float32) 
resized_image = tf.image.resize_images(my_img, [50, 50]) 


labels=[1,1,1,0,0] 
onehot = tf.one_hot(labels, depth=2) 



image_batch = tf.train.batch([resized_image], batch_size=2) 

# layer 1 
w1 = tf.Variable(tf.truncated_normal([2, 2, 3, 52], stddev=0.01)) 
b1= tf.Variable(tf.constant(0.01, shape = [52])) 
layer1=tf.nn.conv2d(image_batch,w1,[1,1,1,1],padding='SAME') 
act1=tf.nn.relu(tf.nn.bias_add(layer1,b1)) 
pool1=tf.layers.max_pooling2d(act1,2,2) 

# layer 2 
b2= tf.Variable(tf.constant(0.01, shape = [104])) 
w2=tf.Variable(tf.truncated_normal([2, 2,52, 104], stddev=0.01)) 
layer2=tf.nn.conv2d(pool1,w2,[1,1,1,1],padding='SAME') 
act2=tf.nn.relu(tf.nn.bias_add(layer2,b2)) 
pool2=tf.layers.max_pooling2d(act2,2,2) 

#fully connected layer 
b3= tf.Variable(tf.constant(0.01, shape = [300])) 
w3=tf.Variable(tf.truncated_normal([12*12*104, 300], stddev=0.01)) 
fcl1=tf.reshape(pool2,[-1,12*12*104]) 
fcl1 = tf.add(tf.matmul(fcl1, w3), b3) 
fcl1 = tf.nn.relu(fcl1) 
fcl1 = tf.nn.dropout(fcl1,0.5) 

#output layer 
b_out=b3= tf.Variable(tf.constant(0.01, shape = [2])) 
w_out=tf.Variable(tf.truncated_normal([300, 2], stddev=0.01)) 
ans=tf.add(tf.matmul(fcl1,w_out),b_out) 


#traning , loss , optimizer 
logits = ans 
prediction = tf.nn.softmax(logits) 
loss_op = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(
logits=logits, labels=onehot)) 
optimizer = tf.train.AdamOptimizer(learning_rate=0.001) 
train_op = optimizer.minimize(loss_op) 




with tf.Session() as s: 
    s.run(tf.global_variables_initializer()) 
    coord = tf.train.Coordinator() 
    threads = tf.train.start_queue_runners(coord=coord) 
    for step in range(1, 40): 
     s.run(train_op) 
     print(step,s.run(loss_op)) 
    coord.request_stop() 
    coord.join(threads) 

Traceback (most recent call last): File "test.py", line 56, in logits=logits, labels=onehot))Tensorflow: Kennzeichnung Ausgabe

ValueError: Dimension 0 in both shapes must be equal, but are 2 and 5 for 'SoftmaxCrossEntropyWithLogits' (op: 'SoftmaxCrossEntropyWithLogits') with input shapes: [2,2], [5,2].

Bitte sag mir, was mein Fehler, ich glaube, ich brauche zwei Etiketten zu einer Zeit, füttern, aber es all 5 zu einem Zeitpunkt stattfindet. Wie kann ich Etiketten separat batchen?

Antwort

1

Sie machen Eingangschargen, aber keine Beschriftungschargen. Versuchen Sie auch, Etikettenchargen zuzuführen. Machen Sie einen Platzhalter für Ihre Etiketten:

labels = tf.placeholder(tf.int32, [None]) 
# Keep the tf.one_hot op. 
onehot = tf.one_hot(labels, depth=2) 

und dann später:

all_labels = [1, 1, 1, 0, 0] 
start = 0 
with tf.Session() as s: 
    # ... 
    for step in range(40): 
     t = all_labels[start:start+2] # grab next label batch 
     start += 2 
     if start > len(all_labels): 
      start = 0 # reset to start of list when we overrun the end 
     sess.run(train_op, feed_dict={labels: t}) 

Ehrlich gesagt, ich würde behandeln sowohl Ihre Daten Chargen und Ihre Etikettenchargen auf die gleiche Weise, aber ich hatte Probleme, herauszufinden, wie tf.train.batch zu arbeiten, um die Ausgabe von tf.one_hot zu arbeiten, und ich hatte Probleme tf.train.batch auf Ihrem rohen Label-Array zuerst laufen und dann an tf.one_hot übergeben.

+0

danke, arbeitete wie ein Charme. Du bist ein wahrer Held! Die Leute markierten diese Frage als "außer Betrieb gesetzt", aber ich habe nie das Debuggen verlangt, aber ich wollte meine Zweifel beseitigen, also dachte ich, dass die Veröffentlichung meines Rohcodes den Leuten helfen würde, meine Situation zu verstehen. Ich schätze deine Zeit sehr! Danke noch einmal :) –