tflite图中Conv2D的奇怪输出

我有一个tflite图的片段,如附件图片所示enter image description here

我需要调试它的行为,在第一步就得到了相当令人困惑的结果。当我输入全零张量后,我期望在第一个Conv2D之后得到一个仅包含Conv2D偏置值的张量(因为所有卷积核元素都被乘以零),但实际上我得到的是一个包含一些随机数据的张量,以下是代码片段:

def test_graph(path=PATH_DEFAULT):    interp = tf.lite.Interpreter(path)    interp.allocate_tensors()    input_details = interp.get_input_details()    in_idx = input_details[0]['index']    zeros = np.zeros(shape=(1, 256, 256, 3), dtype=np.float32)    interp.set_tensor(in_idx, zeros)    interp.invoke()    # 第一个conv2d操作的输出索引是3(见netron图片)    after_conv_2d = interp.get_tensor(3)    # 偏置的形状只是[输出通道数]    n, h, w, c = after_conv_2d.shape    # 如果我们输入全零张量,我们可以期望得到的唯一值是偏置值    # 因为在这种情况下所有卷积核元素都被乘以零    uniq_vals_cnt = len(np.unique(after_conv_2d))    assert uniq_vals_cnt <= c, f"输出中有{uniq_vals_cnt}个值,应该<= {c}"

输出:

AssertionError: 输出中有287928个值,应该<= 24

有人能帮我解答我的困惑吗?


回答:

看来我假设可以从解释器中获取任何中间张量是错误的,我们只能对输出进行操作,尽管解释器不会抛出错误,并且对于与非输出张量相关的索引也会返回正确形状的张量。

调试此类图的一种方法是将所有张量设为输出,但最简单的方法可能是将tflite文件转换为pb,使用toco,然后再将pb转换回tflite,并指定新的输出。不过这种方法并非理想,因为tocotflite -> pb转换的支持在1.9版本后被移除,使用之前的版本可能会在某些图上失败(在我这里就失败了)。

更多信息请见:tflite: get_tensor on non-output tensors gives random values

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注