我使用batch_size 128 从TensorFlow的存储库中训练了Cifar10示例模型,并且工作正常.然后我冻结了图表并设法用C++运行它,就像他们在C++标签图像示例中一样.
唯一的问题是我不得不人为地生成形状张量[128,image_height,image_width,channels]以使用C++对单个图像进行分类,因为保存的模型需要批量输入128个样本,因为这是来自队列的样本数.
我尝试使用batch_size = 1训练Cifar10示例,然后当我使用C++运行模型时,我设法逐个对示例进行分类,但这似乎不是一个很好的解决方案.我也尝试在保存的图形文件中手动更改张量形状,但它不起作用.
我的问题是,用固定批量大小(如32,64,128等)训练模型的最佳方法是什么,然后保存模型,以便可以使用任意长度的批量大小?如果那是不可能的,那么如何保存模型以便能够逐个对样本进行分类.
听起来问题是TensorFlow将批量大小"烘焙"到图中的其他张量(例如,如果图形包含tf.shape(t)某些张量,t其形状取决于批量大小,则批量大小可能存储在图形中作为不变).解决方案是稍微更改程序,以便tf.train.batch()返回具有可变批量大小的张量.
该tf.train.batch()方法接受tf.Tensor的batch_size参数.修改可变大小批次的程序的最简单方法可能是为批量大小定义占位符:
# Define a scalar tensor for the batch size, so that you can alter it at
# Session.run()-time.
batch_size_tensor = tf.placeholder(tf.int32, shape=[])
input_tensors = tf.train.batch(..., batch_size=batch_size_tensor, ...)
Run Code Online (Sandbox Code Playgroud)
这样可以防止将批量大小烘焙到GraphDef中,因此您应该能够在C++中提供任何批量大小的值.但是,此修改将要求您在每个步骤中为批量大小提供值,这有点单调乏味.
假设您始终希望使用批处理大小128进行训练,但保留以后更改批处理大小的灵活性,则可以使用a tf.placeholder_with_default()指定在不提供备用值时批处理大小应为128 :
# Define a scalar tensor for the batch size, so that you can alter it at
# Session.run()-time.
batch_size_tensor = tf.placeholder_with_default(128, shape=[])
input_tensors = tf.train.batch(..., batch_size=batch_size_tensor, ...)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5796 次 |
| 最近记录: |