Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python &引用;尺寸必须匹配“;使用toco进行tflite转换时出错_Python_Tensorflow_Tensorboard_Tensorflow Estimator_Tensorflow Lite - Fatal编程技术网

Python &引用;尺寸必须匹配“;使用toco进行tflite转换时出错

Python &引用;尺寸必须匹配“;使用toco进行tflite转换时出错,python,tensorflow,tensorboard,tensorflow-estimator,tensorflow-lite,Python,Tensorflow,Tensorboard,Tensorflow Estimator,Tensorflow Lite,我有一个用TensorFlow估计器训练的自定义CNN模型(图像分类器),在转换为TensorFlowLite模型后,我将在iOS应用程序中使用它 我的模型有几个退出层,还有批量规范化层。为了避免转换错误并删除优化\u以进行\u推理过程中的那些丢失层, 我在检查点文件旁边单独保存了eval\u graph.pbtxt,以便在freeze\u graph中使用 在freeze\u graph中一切正常,optimize\u for\u expression也不会抛出错误。然而,在将冻结模型和优化模

我有一个用TensorFlow估计器训练的自定义CNN模型(图像分类器),在转换为TensorFlowLite模型后,我将在iOS应用程序中使用它

我的模型有几个退出层,还有批量规范化层。为了避免转换错误并删除
优化\u以进行\u推理过程中的那些丢失层,
我在检查点文件旁边单独保存了
eval\u graph.pbtxt
,以便在
freeze\u graph
中使用

freeze\u graph
中一切正常,
optimize\u for\u expression
也不会抛出错误。然而,在将冻结模型和优化模型文件(均
.pb
)导入tensorboard进行检查后,我发现:

优化前冻结模型

优化后的模型

似乎
optimize\u for\u inference
删除了输入张量层的形状信息,如果我冻结了在训练模式下保存了图形的模型(默认的
graph.pbtxt
),并对其进行优化,情况就不会如此

环境:

  • Tensorflow 1.8.0用于培训
  • 转换为Tensorflow 1.13.1
代码如下:

摘自型号_fn,相当正常:

def cnn_model_fn(特性、标签、模式、参数):
“”“CNN的模型函数。”“”
#输入层,图像在馈入前被整形;
net=tf.placeholder\u,默认值为(
特征['像素'],
(无、48、48、1),
name='input\u tensor'
)
#bn-1
net=tf.layers.batch\u规范化(
输入=净,
训练=模式==tf.estimator.ModeKeys.TRAIN
)
#conv2d-1
net=tf.layers.conv2d(
输入=净,
过滤器=32,
内核大小=[3,3],
“相同”,
激活=tf.nn.relu
)
#CONV2D、辍学、人才库、bns。。。
#CONV2Ds->DENSEs
#48个像素集合三次(内核大小=2,步幅=2),最终的conv2d有128个神经元;
net=tf.reforme(net,[-1,6*6*128])
#bn-4
net=tf.layers.batch\u规范化(
输入=净,
训练=模式==tf.estimator.ModeKeys.TRAIN
)
#稠密-1
净=tf.layers.density(
输入=净,
单位=256,
核正则化子=keras.regularizers.l2(0.001),
激活=tf.nn.relu
)
#丹斯,罗吉斯,没什么特别的。。。
#在预测中:
如果mode==tf.estimator.ModeKeys.PREDICT:
返回tf.estimator.EstimatorSpec(…)
#在评价中:
如果模式==tf.estimator.ModeKeys.EVAL:
#用于在eval模式下保存图形的钩子,该图形将用于冻结和优化过程;
eval_finish_hook=EvalFinishHook()
eval_finish_hook.model_dir=参数['model_dir']
返回tf.estimator.estimator规范(
...,
评估挂钩=[评估挂钩]
)
#在培训中:
如果模式==tf.estimator.ModeKeys.TRAIN:
返回tf.estimator.EstimatorSpec(…)
和自定义评估挂钩类别:

class EvalFinishHook(tf.train.SessionRunHook):
模型_dir='。'
_节省=无
def begin(自我):
self.\u saver=tf.train.saver()
super().begin()
def结束(自我,会话):
dst_dir=self.model_dir+'eval_ckpt'
self._saver.save(sess=session,save_path=dst_dir+'/eval.ckpt')
train.write_graph(session.graph.as_graph_def(),dst_dir,'eval_graph.pbtxt')
super().end(会话)
冻结并优化:

#冻结图形
echo“冻结检查点${best_step}…”
冻结图\
--input_graph=${input_graph}\
--input_checkpoint=${input_checkpoint}\
--输入\二进制=假\
--输出图=${freezed\u model}\
--输出节点名称=${output\u names}\
#优化推理
回声“优化…”
/path/to/bazel-bin/tensorflow/python/tools/optimize\u用于推理\
--输入=${freezed_model}\
--输出=${optimized_model}\
--冻结图=真\
--input_names=${input_names}\
--输出名称=${output\u names}
toco抛出错误:

#转换为tflite
回声“转换…”
托科\
--graph_def_file=${optimized_model}\
--输入\格式=TENSORFLOW\图形def\
--输出\u格式=TFLITE\
--推理类型=浮点型\
--输入类型=浮点\
--input_数组=${input_名称}\
--输出数组=${output\u names}\
--输入_形状=1,48,48,1\
--输出文件=${tflite\u model}
#错误信息
检查失败:尺寸x==尺寸y(128对4608)尺寸必须匹配
这个错误似乎是合理的,因为形状的秩1和秩2都是未知的


为什么?

optimize\u for\u推断从图形中随机删除掉层,通常在输入上使用掉层。 因此,答案可能是肯定的

bazel-bin/tensorflow/python/tools/optimize_for_inference \ 
--input=/tf_files/retrained_graph.pb \ 
--output=/tf_files/optimized_graph.pb \ 
--input_names={} \ 
--output_names=result
让我们尝试使用RandomUniform、FLOOR、TensorFlowShape、TensorFlowSwitch、TensorFlowMerge自定义实现,以禁用错误


参考资料:

使用冻结图形而不是graph.pbtxt时,应使用eval.pbtxt

请让我查一下

因此,让我们将第一维度的“无”替换为零,其余维度的“无”替换为描述向量/矩阵的大小。 另一点是遵守矩阵乘法规则,即第一个操作数的列数必须与第二个操作数的行数匹配


如果它对您有帮助,请接受答案。

好吧,看来swap
bn-4
dense-1
可以使错误静音。因此,在这种情况下,批标准化应该在稠密之后进行(例如,在conv2d->稠密重塑之后)。

是的,它应该在稠密之后:

model.add(Dense(.., ..))
model.add(BatchNormalization())
model.add(Activation(...))
model.add(Dropout(...))

我尝试过冻结和优化eval和train模式下保存的图,并将两个优化模型导入tensorboard进行检查,唯一的区别是训练图的
输入张量有输出形状,而eval图的输入张量没有输出形状。顺便说一下,我可以从火车上买到tflite