![309e47630ee80784574e2c1afc0d880d.png](https://i-blog.csdnimg.cn/blog_migrate/1b394ea76d53857c0fab9c2215672e70.jpeg)
原因分析
实现的关键在于:
- 模型构建过程中任何操作都是基于不知道batch_size下构建的。因为一旦某个图构建操作基于batch_size就会导致,meta graph中会写死固化张量某个维度为batch_size
- 测试的时候,batch_size大小不能变,因为batch_size不是一个placeholder,而直接写死固化在图模型中,作为图中操作的超参数(关键是超参数的数据类型,int、float、unit tensor)
实现方式
- 最笨的方式:测试时再次构建一次图,然后只加载训练时保存的参数
- 劣势:每次测试都需要在构建一次图模型
- tf.placeholder():将batch_size设置为placeholder,因为tensorflow中几乎所有函数的参数都支持“0-D tensor”,如果参数的数据类型不是tensor,源码中都会使用tf.convert_to_tensor()
- 劣势:模型每次训练或者测试都必须提供placeholder值
- tf.shape(tf.Tensor):该方法可以获得张量的动态形状,而且不用每一次都输入batch_size的placeholder,直接根据input来推算
- 注意:不要使用t