2017-05-04 5 views
1

Ich bin neu bei Tensorflow und versuche, weg von der Mnist-Datensatz und versuche etwas ein wenig anders. Ich arbeite mit dem Emotionsdatensatz CK+ und kann meinen Code nicht ändern, um erfolgreich auf diesem Datensatz zu laufen. Für diejenigen, die meine Arbeit replizieren möchten, habe ich die verarbeiteten Bilder und Etiketten here gefunden. Sie finden die Bilder im Ordner "ck + skaliert" und die Beschriftungen im bearbeiteten Ordner.Ich habe Probleme mit Dimensionalitätsfehlern in meinem CNN

Wir arbeiten mit 265 Bildern, die [256 x 256] groß sind.

So, hier ist mein Code:

import os 
import tensorflow as tf 
import sys 
import urllib 
import numpy as np 
from PIL import Image 
import glob 
train = [] 
for filename in glob.glob('/Users/madhavthaker/Documents/CSCI63/Final Project/face-emoticon-master/data/ck+_scaled/*.png'): #assuming gif 
    img=np.asarray(Image.open(filename)) 
    img_flat = img.reshape(img.size) 
    train.append(img_flat) 

### MNIST EMBEDDINGS ### 
ckp_labels = [5, 0, 3, 5, 4, 0, 1, 3, 5, 4, 0, 3, 5, 0, 1, 5, 4, 0, 0, 0, 2, 1, 3, 5, 0, 3, 5, 1, 3, 5, 0, 3, 5, 4, 0, 3, 5, 3, 1, 1, 0, 4, 5, 2, 1, 5, 3, 5, 1, 5, 3, 1, 5, 1, 5, 0, 1, 5, 3, 5, 1, 3, 0, 1, 5, 2, 3, 1, 5, 3, 1, 3, 1, 5, 3, 2, 5, 3, 1, 5, 3, 4, 0, 5, 0, 3, 1, 3, 2, 5, 1, 3, 5, 1, 5, 4, 0, 3, 1, 5, 1, 2, 5, 1, 3, 5, 3, 5, 1, 3, 5, 5, 3, 1, 1, 3, 4, 1, 5, 4, 1, 5, 0, 1, 3, 5, 2, 3, 5, 5, 3, 5, 1, 0, 1, 5, 3, 0, 5, 1, 0, 3, 5, 0, 3, 5, 3, 1, 4, 5, 1, 3, 5, 1, 3, 1, 3, 5, 1, 5, 0, 3, 5, 1, 1, 4, 1, 5, 1, 4, 1, 0, 1, 3, 5, 5, 0, 1, 0, 5, 4, 0, 5, 3, 5, 3, 5, 1, 3, 5, 2, 0, 5, 2, 0, 5, 2, 3, 4, 3, 2, 5, 1, 5, 0, 3, 0, 1, 3, 5, 0, 1, 3, 5, 0, 4, 3, 3, 1, 4, 2, 1, 3, 5, 5, 3, 0, 3, 1, 5, 5, 0, 3, 5, 3, 2, 5, 3, 4, 7, 7, 7, 7, 7, 7, 7, 7, 0, 2, 4, 0, 7, 2, 0, 7, 0, 7, 2, 4, 4, 0, 2, 4, 7, 2] 

if sys.version_info[0] >= 3: 
    from urllib.request import urlretrieve 
else: 
    from urllib import urlretrieve 

LOGDIR = 'log3/' 
GITHUB_URL ='https://raw.githubusercontent.com/mamcgrath/TensorBoard-TF-Dev-Summit-Tutorial/master/' 

### MNIST EMBEDDINGS ### 
mnist = tf.contrib.learn.datasets.mnist.read_data_sets(train_dir=LOGDIR + 'data', one_hot=True) 
### Get a sprite and labels file for the embedding projector ### 
urlretrieve(GITHUB_URL + 'labels_1024.tsv', LOGDIR + 'labels_1024.tsv') 
urlretrieve(GITHUB_URL + 'sprite_1024.png', LOGDIR + 'sprite_1024.png') 

# Add convolution layer 
def conv_layer(input, size_in, size_out, name="conv"): 
    with tf.name_scope(name): 
    #w = tf.Variable(tf.zeros([5, 5, size_in, size_out]), name="W") 
    #b = tf.Variable(tf.zeros([size_out]), name="B") 
    w = tf.Variable(tf.truncated_normal([4, 4, size_in, size_out], stddev=0.1), name="W") 
    b = tf.Variable(tf.constant(0.1, shape=[size_out]), name="B") 
    conv = tf.nn.conv2d(input, w, strides=[1, 1, 1, 1], padding="SAME") 
    act = tf.nn.relu(conv + b) 
    tf.summary.histogram("weights", w) 
    tf.summary.histogram("biases", b) 
    tf.summary.histogram("activations", act) 
    return tf.nn.max_pool(act, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME") 


# Add fully connected layer 
def fc_layer(input, size_in, size_out, name="fc"): 
    with tf.name_scope(name): 
    w = tf.Variable(tf.truncated_normal([size_in, size_out], stddev=0.1), name="W") 
    b = tf.Variable(tf.constant(0.1, shape=[size_out]), name="B") 
    act = tf.nn.relu(tf.matmul(input, w) + b) 
    tf.summary.histogram("weights", w) 
    tf.summary.histogram("biases", b) 
    tf.summary.histogram("activations", act) 
    return act 


def mnist_model(learning_rate, use_two_conv, use_two_fc, hparam): 

    tf.reset_default_graph() 
    tf.set_random_seed(1) 
    sess = tf.Session() 

    # Setup placeholders, and reshape the data 
    x = tf.placeholder(tf.float32, shape=[None, 256*256], name="x") 
    x_image = tf.reshape(x, [-1, 256, 256, 1]) 
    tf.summary.image('input', x_image, 3) 
    y = tf.placeholder(tf.float32, shape=[None, ], name="labels") 

    if use_two_conv: 
    conv1 = conv_layer(x_image, 1, 32, "conv1") 
    conv_out = conv_layer(conv1, 32, 64, "conv2") 
    else: 
    conv1 = conv_layer(x_image, 1, 64, "conv") 
    conv_out = tf.nn.max_pool(conv1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME") 

    flattened = tf.reshape(conv_out, [-1, 16 * 16 * 16]) 


    if use_two_fc: 
    fc1 = fc_layer(flattened, 16 * 16 * 16, 40, "fc1") 
    embedding_input = fc1 
    embedding_size = 40 
    logits = fc_layer(fc1, 40, 1, "fc2") 
    else: 
    embedding_input = flattened 
    embedding_size = 7*7*64 
    logits = fc_layer(flattened, 7*7*64, 10, "fc") 

    with tf.name_scope("xent"): 
    xent = tf.reduce_mean(
     tf.nn.softmax_cross_entropy_with_logits(
      logits=logits, labels=y), name="xent") 
    tf.summary.scalar("xent", xent) 

    with tf.name_scope("train"): 
    train_step = tf.train.AdamOptimizer(learning_rate).minimize(xent) 

    with tf.name_scope("accuracy"): 
    correct_prediction = tf.equal(tf.argmax(logits, -1), tf.argmax(y, -1)) 
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 
    tf.summary.scalar("accuracy", accuracy) 

    summ = tf.summary.merge_all() 


    embedding = tf.Variable(tf.zeros([1024, embedding_size]), name="test_embedding") 
    assignment = embedding.assign(embedding_input) 
    saver = tf.train.Saver() 

    sess.run(tf.global_variables_initializer()) 
    writer = tf.summary.FileWriter(LOGDIR + hparam) 
    writer.add_graph(sess.graph) 

    config = tf.contrib.tensorboard.plugins.projector.ProjectorConfig() 
    embedding_config = config.embeddings.add() 
    embedding_config.tensor_name = embedding.name 
    embedding_config.sprite.image_path = LOGDIR + 'sprite_1024.png' 
    embedding_config.metadata_path = LOGDIR + 'labels_1024.tsv' 
    # Specify the width and height of a single thumbnail. 
    embedding_config.sprite.single_image_dim.extend([256, 256]) 
    tf.contrib.tensorboard.plugins.projector.visualize_embeddings(writer, config) 

    for i in range(300): 
    if i % 5 == 0: 
     [train_accuracy, s] = sess.run([accuracy, summ], feed_dict={x: train, y: ckp_labels}) 
     writer.add_summary(s, i) 
     print ("train accuracy:", train_accuracy) 
    sess.run(train_step, feed_dict={x: train, y: ckp_labels}) 

def make_hparam_string(learning_rate, use_two_fc, use_two_conv): 
    conv_param = "conv2" if use_two_conv else "conv1" 
    fc_param = "fc2" if use_two_fc else "fc1" 
    return "lr_%.0E%s%s" % (learning_rate, conv_param, fc_param) 

def main(): 
    # You can try adding some more learning rates 
    #for learning_rate in [1E-3, 1E-4, 1E-5]: 
    for learning_rate in [1E-4]: 

    # Include "False" as a value to try different model architectures 
    #for use_two_fc in [True, False]: 
    for use_two_fc in [True]: 
     #for use_two_conv in [True, False]: 
     for use_two_conv in [True]: 
     # Construct a hyperparameter string for each one (example: "lr_1E-3fc2conv2") 
     hparam = make_hparam_string(learning_rate, use_two_fc, use_two_conv) 
     print('Starting run for %s' % hparam) 
     sys.stdout.flush() # this forces print-ed lines to show up. 

     # Actually run with the new settings 
     mnist_model(learning_rate, use_two_fc, use_two_conv, hparam) 


if __name__ == '__main__': 
    main() 

Und hier ist der Fehler Ich erhalte:

InvalidArgumentError (see above for traceback): logits and labels must be same size: logits_size=[16960,1] labels_size=[1,265] 
    [[Node: xent/SoftmaxCrossEntropyWithLogits = SoftmaxCrossEntropyWithLogits[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](xent/Reshape, xent/Reshape_1)]] 

Was mir wirklich verwirrend ist, warum Form meiner Logits ist [16960,1 ]. Jede Hilfe würde sehr geschätzt werden.

Antwort

1

Zunächst soll y von Form (batch_size) sein: (so (265) in Ihrem Fall, vielleicht kann es auch mit (265 arbeitet, 1))

y = tf.placeholder(tf.float32, shape=[None], name="labels") 

Und mit y nicht in einer zu sein -Hot Codierung, müssen Sie tf.nn.sparse_softmax_cross_entropy_with_logits anstelle von softmax_cross_entropy_with_logits verwenden.

Dann: am Ende der 2. Conv Schicht (und max Poolings), Bildgröße ist (256x256)/2/2 = (64,64). Mit 64 Tiefe erhalten Sie 64 * 64 * 64 Werte pro Probe. Aber Sie tun flattened = tf.reshape(conv_out, [-1, 16 * 16 * 16]), die Ihnen einen Tensor der Form gibt [265*2^6, 16*16*16] (265 * 2^6 = 16960, das ist, wo es herkommt). Ersetzen Sie es durch flattened = tf.reshape(conv_out, [-1, 64*64*64]).

Weiter, logits = fc_layer(fc1, 40, 1, "fc2") ist auch ein Fehler, sollten Sie haben, und Sie scheinen zu haben num_classes = 8.

Diese Änderungen sollten Ihnen logits of shape (265, num_classes) geben, was Sie für tf.nn.sparse_softmax_cross_entropy_with_logits wollen.

Sie müssen noch weitere Änderungen für die Fälle vornehmen, in denen use_two_fc oder use_two_conv false sind. Ich werde Sie herausfinden lassen. Sie sollten bei jedem Schritt sehr viel vorsichtiger mit der Form Ihrer Tensoren umgehen und sie bei Bedarf ausdrucken, um zu überprüfen, ob sie wirklich Ihren Wünschen entsprechen. Vielleicht verwenden Sie mehr Variablen wie num_classes_ batch_size, etc., um sicherzustellen, dass die Dinge kohärent sind und dass sie besser lesbar sind.

+0

Hallo, Ihr Kommentar hat mir geholfen, mein erstes Problem zu lösen, und ich konzentrierte mich darauf, zusätzliche Informationen darüber zu finden, wie ich meine Dimensionen für ein CNN einrichten kann. Jetzt habe ich meinen Filter im Conv später zu (17, 17) geändert und abgeflacht in 'abgeflacht = tf.reshape (conv_out, [-1, 55 * 55 * 64]) ''. Meine Mathe geht aus, aber ich bekomme diesen Fehler: 'InvalidArgumentError (siehe oben für Traceback): Eingabe zum Umformen ist ein Tensor mit 6553600 Werten, aber die angeforderte Form erfordert ein Vielfaches von 193600'. Aber es funktioniert am Ende mit '[-1,64 * 64 * 64]'. Probleme zu verstehen, was passiert – madsthaks

+0

Sorry, ich verstehe nicht, was Sie genau geändert haben. Vielleicht wird es klarer, wenn du deine Frage isst oder eine neue mit all deinem aktuellen Code beginnst – gdelab