tensorflow slim-如何进行推断?

时间:2018-12-28 10:12:13

标签: python tensorflow tensorflow-slim

我必须使用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转换。

感谢您的帮助

0 个答案:

没有答案