2017-10-13 7 views
0

これは言葉ではっきりと表現するのが難しいので、ご不明な点がありましたら教えてください。テンソルフローを使用して、最後のステップで結合されるまで各 "ブランチ"が別々のCNNモデルを構築する方法はありますか?

私はCNNを使用して画像認識モデルを訓練しています。しかし、私はさまざまな角度の画像を持っているので、n枚の画像の各角度でいくつかのレイヤーを行いたいと思います。このプロセスでは、各角度の出力を1に減らし、最後にすべての角度の出力を結合して2層のニューラルネットワークを作成します。

私はテストとして1つの角度を鍛えようとしましたが、結果が出てきました。そして、同じ角度で畳み込みレイヤー1のリスト、プーリングのリストレイヤー1、畳み込みレイヤー2のリスト、プールレイヤー2のリスト...)を除きます。最後のロジスティックレイヤーを組み合わせて0/1の出力を得る最後のステップを追加します。

キー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/biasの代わりにconv2d_7-angle_30/biasを定義する必要があります。

+0

soooooいただきありがとうございます。コードをご覧ください。実際にモデルを掘り下げて変数を命名したわけではありません。私はそれらをすべて別のリストに入れます。それらは基本的に私が持っているすべての変数名です。 – ljzhanglc

+0

どこがエラーですか? 'eval_results = model.evaluate(input_fn = eval_input_fn)'? – amirbar

関連する問題