これは言葉ではっきりと表現するのが難しいので、ご不明な点がありましたら教えてください。テンソルフローを使用して、最後のステップで結合されるまで各 "ブランチ"が別々の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)
私は、データを読み込む部分を投稿しませんでした。だから私はちょうどモデルの部分とメインのメソッドを投稿します。
ありがとうございました。
soooooいただきありがとうございます。コードをご覧ください。実際にモデルを掘り下げて変数を命名したわけではありません。私はそれらをすべて別のリストに入れます。それらは基本的に私が持っているすべての変数名です。 – ljzhanglc
どこがエラーですか? 'eval_results = model.evaluate(input_fn = eval_input_fn)'? – amirbar