2017-10-13 4 views
0

C'est assez difficile à exprimer avec des mots clairement, alors s'il vous plaît laissez-moi savoir si vous avez des questions. Je forme un modèle de reconnaissance d'image en utilisant CNN. Mais j'ai des images d'angles différents, donc je veux faire plusieurs couches avec chaque angle de n images. Dans ce processus, je diminue la sortie de chaque angle à 1, et à la fin, je combine cette sortie de tous les angles et fais un réseau neuronal à 2 couches. J'ai essayé de former un angle comme test et j'ai obtenu un résultat de travail, puis j'ai placé chaque couche de chaque angle dans une liste comme je vais dans la même étape, (une liste de couche convolutionnelle1 pour tous les angles, une liste de pooling layer1, une liste de layer2 convolutionnelle, une liste de pooling layer2 ...) sauf que j'ajoute la dernière étape de les combiner et faire la couche logistique finale et obtenir une sortie 0/1.Comment utiliser le flux tensoriel pour construire un modèle CNN où chaque "branche" est séparée jusqu'à la dernière étape?

J'ai eu des tonnes d'erreurs comme Key conv2d_7/bias pas trouvé dans le point de contrôle.

Donc, au lieu de déboguer, je me demande si c'est une façon valable de le faire en premier lieu? Est-il possible que lorsque je mets toutes les couches dans des listes différentes, le modèle ne trouve pas certaines des valeurs dans le flux?

Sinon, que dois-je faire pour atteindre cet objectif d'entraîner chaque angle séparément, puis combiner le résultat et faire l'entraînement final vers 0/1?

Merci beaucoup.

Voici le code:

def model_train(features, labels, mode): 
    input_list = [] 
    conv1_list = [] 
    pool1_list = [] 
    conv2_list = [] 
    pool2_list = [] 
    conv3_list = [] 
    pool3_list = [] 
    pool3_flat_list = [] 
    dense1_list = [] 
    dense2_list = [] 
    logit1_list = [] 
    feature = tf.transpose(features["x"],[1,0,2,3]) 
    for i in range(0,11,1): 
     input_list.append(tf.reshape(feature[i], [-1, 73, 135, 1])) 

     conv1_list.append(tf.layers.conv2d(
      inputs=input_list[i], 
      filters=10, 
      kernel_size=[5, 5], 
      padding="same", 
      activation=tf.nn.relu)) 
     pool1_list.append(tf.layers.max_pooling2d(inputs=conv1_list[i], pool_size=[2, 2], strides=2)) 
     conv2_list.append(tf.layers.conv2d(
      inputs=pool1_list[i], 
      filters=20, 
      kernel_size=[3, 3], 
      padding="same", 
      activation=tf.nn.relu)) 
     pool2_list.append(tf.layers.max_pooling2d(inputs=conv2_list[i], pool_size=[2, 2], strides=2)) 
     conv3_list.append(tf.layers.conv2d(
      inputs=pool2_list[i], 
      filters=30, 
      kernel_size=[5, 5], 
      padding="same", 
      activation=tf.nn.relu)) 
     pool3_list.append(tf.layers.max_pooling2d(inputs=conv3_list[i], pool_size=[3, 3], strides=3)) 
     pool3_flat_list.append(tf.reshape(pool3_list[i], [-1, 6*11*30])) 
     dense1_list.append(tf.layers.dense(inputs=pool3_flat_list[i], units=512, activation=tf.nn.relu)) 
     dense2_list.append(tf.layers.dense(inputs=dense1_list[i], units=16, activation=tf.nn.relu)) 
     logit1_list.append(tf.layers.dense(inputs=dense2_list[i],units=1)) 


    # nn of 11 separate results 
    input2 = tf.reshape(logit1_list,[11,-1]) 
    input2 = tf.transpose(input2) 
    dense3 = tf.layers.dense(inputs = input2, units = 64) 
    logit2 = tf.layers.dense(inputs = dense3, units = 2) 



    predictions = { 
     # Generate predictions (for PREDICT and EVAL mode) 
     "classes": tf.argmax(input=logit2, axis=1), 
     # Add `softmax_tensor` to the graph. It is used for PREDICT and by the 
     # `logging_hook`. 
     "probabilities": tf.nn.softmax(logit2, name="softmax_tensor") 
    } 

    if mode == tf.estimator.ModeKeys.PREDICT: 
     return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions) 

    onehot_labels = tf.one_hot(indices=tf.cast(labels, tf.int32), depth=2) 
    onehot_labels = tf.squeeze(onehot_labels, axis=1) 
    loss = tf.losses.softmax_cross_entropy(
     onehot_labels=onehot_labels, logits=logit2) 

    # Configure the Training Op (for TRAIN mode) 
    if mode == tf.estimator.ModeKeys.TRAIN: 
     optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001) 
     train_op = optimizer.minimize(
      loss=loss, 
      global_step=tf.train.get_global_step()) 
     return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op) 

    # Add evaluation metrics (for EVAL mode) 
    eval_metric_ops = { 
     "accuracy": tf.metrics.accuracy(
      labels=labels, predictions=predictions["classes"])} 
    return tf.estimator.EstimatorSpec(
     mode=mode, loss=loss, eval_metric_ops=eval_metric_ops) 


def main(argv=None): 
    dropbox_dir = '/Users/someone/Dropbox' 
    csv_dir = dropbox_dir + '/ML/CSInde/stage1_labels.csv' 
    zone13_dir = dropbox_dir + '/ML/zone13/' 

    image_list, label_list = read_labeled_image_list(csv_dir) 
    labels = np.asarray(label_list, dtype=np.int32) 
    labels = np.reshape(labels, [1147, 1]) 

    images = read_images_from_disk(image_list) 

    model = tf.estimator.Estimator(
     model_fn=model_train, model_dir="/tmp/test_model") 
    tensors_to_log = {"probabilities": "softmax_tensor"} 

    logging = tf.train.LoggingTensorHook(
     tensors=tensors_to_log, every_n_iter=50) 

    train_input_fn = tf.estimator.inputs.numpy_input_fn(
     x={"x": images}, 
     y=labels, 
     batch_size=100, 
     num_epochs=None, 
     shuffle=False) 
    model.train(
     input_fn=train_input_fn, 
     steps=20000, 
     hooks=[logging] 
    ) 
    print('finishTrain++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++') 
    # a = tf.Print(tf.shape(images), [tf.shape(images)]) 
    # b = tf.add(a, a).eval() 
    eval_input_fn = tf.estimator.inputs.numpy_input_fn(
     x={"x": images}, 
     y=labels, 
     num_epochs=1, 
     shuffle=False) 
    eval_results = model.evaluate(input_fn=eval_input_fn) 
    print(eval_results) 

Je ne poste pas la partie où je l'ai lu dans les données que je ne pense pas que ce soit l'origine des problèmes. Donc, je viens de poster la partie du modèle et la méthode principale.

Merci.

Répondre

0

Oui, ce que vous avez fait devrait fonctionner. Le code n'est pas attaché donc je ne peux pas voir quel est le problème exact dans l'enregistrement/chargement du modèle. Je suppose cependant, que vous ne suivez pas la convention de code de formation dans le code d'évaluation. Je pense que c'est parce que le nom conv2d_7/bias ne dépend pas de l'angle. Donc, si vous avez déclaré vos couches avec des noms spécifiques à l'angle, ou préfixe, assurez-vous que vous utilisez également ce même nom dans votre code d'évaluation. Par exemple, pour l'angle 30, vous devez définir conv2d_7-angle_30/bias (ou peu importe comment vous l'avez nommé), au lieu de conv2d_7/bias.

+0

Merci beaucoup, pourriez-vous s'il vous plaît jeter un oeil sur le code? Nous n'avons pas réellement creusé dans le modèle et nommé les variables. Je les ai tous mis dans des listes différentes, ce sont essentiellement tous les noms de variables que j'ai. – ljzhanglc

+0

où est l'erreur? 'eval_results = model.evaluate (input_fn = eval_input_fn)'? – amirbar