这很难用文字表达清楚,所以如果您有任何问题,请告诉我。如何使用张量流建立一个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)
我没有张贴在那里我读入的数据,因为我不认为这是造成问题的根本的部分。所以我只是发布模型部分和主要方法。
谢谢。
谢谢sooooo多,你能看看代码吗?我们实际上并没有深入模型并命名变量。我把它们放在不同的列表中,这些基本上都是我所有的变量名。 – ljzhanglc
错误在哪里? 'eval_results = model.evaluate(input_fn = eval_input_fn)'? – amirbar