我必须使用TensorFlow 1.9(目前无法使用最新版本)。我创建了一个伪VGG模型,可以训练该模型并保存它。
这是一个摘要:
# "generate" function returns a tensorflow dataset with correct labels
# and images data.
# "_parse_function" resizes images to 224, 224, 3 shape
train_ds = generate('../data/train/*/*', transform_fn=_parse_function, batch_size=8)
iterator = train_ds.make_one_shot_iterator()
images, labels = iterator.get_next()
print(images, labels)
print(images.get_shape())
x = slim.conv2d(images, 64, (3,3), scope='input')
x = slim.conv2d(x, 64, (3,3))
x = slim.max_pool2d(x, (1,1))
x = slim.conv2d(x,128, (3,3))
x = slim.conv2d(x, 128, (3,3))
x = slim.max_pool2d(x, (1,1))
# ... other conv, maxpool, and so on, then
x = slim.flatten(x)
x = slim.fully_connected(x, 64, activation_fn=tf.nn.relu)
x = slim.fully_connected(x, 16, activation_fn=tf.nn.relu)
logits = slim.fully_connected(x, 3, activation_fn=None, scope='output')
然后我像这样训练它:
loss = tf.losses.softmax_cross_entropy(labels, logits)
optimizer = tf.train.GradientDescentOptimizer(learning_rate=.001)
total_loss = tf.losses.get_total_loss()
tf.summary.scalar('loss', total_loss)
train_op = slim.learning.create_train_op(total_loss, optimizer)
slim.learning.train(
train_op,
'./logs',
save_summaries_secs=20)
现在可以了,我在“ ./logs”目录中有文件。
我现在打开一个新会话,并尝试加载模型,然后对另一个图像进行“预测”。但是我找不到哪个是“输入”张量。
saver = tf.train.import_meta_graph('./logs/model.ckpt-214.meta')
with tf.Session() as sess:
saver.restore(sess, tf.train.latest_checkpoint('./logs'))
# what to set ?
sess.run('???', {'???': image})
问题在于,在我的模型中,我在conv2d层中使用了“图像”,这就是迭代器在调用“ get_next”方法时返回的内容。
但是操作列表为我提供了正在等待的“ input / Conv2D”(224、224、3、64)=> 64,这是要进行卷积的次数。我正在寻找输入占位符存在的位置来设置(1,224,224,3)输入,但是找不到。
我尝试导入模型,然后使用“ tf.graph_util.convert_variables_to_constants”导出一个更简单的模型,但是问题是相同的:要使用的正确输入是什么?
这是我可以看到的输入摘要:
['OneShotIterator', 'IteratorGetNext', 'Conv/weights', 'Conv/biases', 'Conv/Conv2D', 'Conv/BiasAdd', 'Conv/Relu', 'Conv_1/weights', 'Conv_1/biases', 'Conv_1/Conv2D', 'Conv_1/BiasAdd', 'Conv_1/Relu', 'MaxPool2D/MaxPool' ...
PS:请注意,我来自Keras,并且对TensorFlow的低级抽象不太满意。我正在尝试“苗条”以保持抽象并能够与Movidius硬件一起使用。 目标是能够删除训练操作并在以后使用变量进行const转换。
感谢您的帮助