2017-10-13 13 views
0

这很难用文字表达清楚,所以如果您有任何问题,请告诉我。如何使用张量流建立一个CNN模型,每个“分支”是独立的,直到最后一步加入?

我正在使用CNN培训图像识别模型。但是我有不同角度的图像,所以我想用n张图片的每个角度做几个图层。在这个过程中,我将每个角度的输出减少到1,最后,我将所有角度的输出结合起来,做一个2层神经网络。

我试图训练一个角度作为测试并获得了工作结果,然后我将每个角度的每个图层放到一个列表中,当我沿着同一个步骤进行时(所有角度的卷积图层列表,层1,卷积层2的列表,共用层2的列表...),除了我添加组合它们的最后一步并做最终逻辑层并获得0/1输出。

我收到了很多错误,例如在检查点没有找到Key conv2d_7/bias。

所以,而不是调试,我想知道这是否是一个有效的方法来做到这一点呢?当我将所有图层放在不同的列表中时,该模型是否可能找不到流中的某些值?

如果不是,我应该怎么做才能实现这个目标,分别训练每个角度,然后结合最终训练和0/1的训练?

非常感谢。

下面是代码:

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) 

我没有张贴在那里我读入的数据,因为我不认为这是造成问题的根本的部分。所以我只是发布模型部分和主要方法。

谢谢。

回答

0

是的,你做了什么应该工作。代码没有附加,所以我无法看到保存/加载模型的确切问题。

我的猜测是,你没有遵循评估代码中的训练码惯例。我认为是这样的原因是因为名称conv2d_7/bias不依赖于角度。

因此 - 如果您声明了具有角度特定名称或前缀的图层,请确保在评估代码中也使用相同的名称。即对于角度30,您必须定义conv2d_7-angle_30/bias(或者您命名它),而不是conv2d_7/bias

+0

谢谢sooooo多,你能看看代码吗?我们实际上并没有深入模型并命名变量。我把它们放在不同的列表中,这些基本上都是我所有的变量名。 – ljzhanglc

+0

错误在哪里? 'eval_results = model.evaluate(input_fn = eval_input_fn)'? – amirbar

相关问题