Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用用于Tensorflow的Edgetpu编译器编译时出错

使用用于Tensorflow的Edgetpu编译器编译时出错
EN

Stack Overflow用户
提问于 2020-06-29 21:39:03
回答 1查看 193关注 0票数 2

我正在尝试将一个两个输出的keras模型转换成一个编译的,量化的,tflite模型,它将在Google Coral上工作。我以前在一个只有1个输出的Keras网络中使用了这个确切的过程,它是有效的。

下面是我的流程:

代码语言:javascript
运行
AI代码解释
复制
import tensorflow as tf
from tensorflow.keras.applications.mobilenet import preprocess_input

file = 'path/to/model-01.h5'
model = tf.keras.models.load_model(file)
converter = tf.lite.TFLiteConverter.from_keras_model(model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]

os.chdir('/path/to/image/directories')#Where image directories are
directory = os.listdir()
directory

def representative_dataset_gen():
    
    for i in directory:
        count = 0
        os.chdir(i)
        files = os.listdir()
        print(i)
        for j in files:
            if count<500:
                img = Image.open(j)
                width, height = img.size
                bands = img.getbands()
                array = np.asarray(img, dtype=np.float32)
                array = preprocess_input(array)
                count=count+1
                yield[np.expand_dims(array, axis=0)]
            else:
                break
        os.chdir('../')

converter.representative_dataset = representative_dataset_gen
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.int8  # or tf.uint8
converter.inference_output_type = tf.int8  # or tf.uint8
tflite_quant_model = converter.convert()

tflite_model_dir = pathlib.Path('where/i/want/to/save/')
tflite_quant_model_file = tflite_model_dir/'quantized.tflite'
tflite_quant_model_file.write_bytes(tflite_quant_model)

然后,我尝试在终端中使用edgetpu_compiler

代码语言:javascript
运行
AI代码解释
复制
edgetpu_compiler quantizedmodel.tflite

并收到此错误:

代码语言:javascript
运行
AI代码解释
复制
ERROR: :129 std::abs(input_product_scale - bias_scale) <= 1e-6 * std::min(input_product_scale, bias_scale) was not true.
ERROR: Node number 40 (FULLY_CONNECTED) failed to prepare.


Internal compiler error. Aborting! 

在尝试验证模型时尝试interpreter.allocate_tensors()时,我也得到了相同的错误。

代码语言:javascript
运行
AI代码解释
复制
#Load Model
interpreter = tf.lite.Interpreter(model_path='path/to/model/quantized.tflite')
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
interpreter.resize_tensor_input(input_details[0]['index'], (32, 200, 200, 3))
interpreter.resize_tensor_input(output_details[0]['index'], (32, 5))
interpreter.allocate_tensors()

它返回

代码语言:javascript
运行
AI代码解释
复制
RuntimeError                              Traceback (most recent call last)
 in 
      2 interpreter.resize_tensor_input(input_details[0]['index'], (32, 200, 200, 3))
      3 interpreter.resize_tensor_input(output_details[0]['index'], (32, 5))
----> 4 interpreter.allocate_tensors()
      5 

~/Software/anaconda3/envs/Tensorflow2/lib/python3.7/site-packages/tensorflow_core/lite/python/interpreter.py in allocate_tensors(self)
    245   def allocate_tensors(self):
    246     self._ensure_safe()
--> 247     return self._interpreter.AllocateTensors()
    248 
    249   def _safe_to_run(self):

~/Software/anaconda3/envs/Tensorflow2/lib/python3.7/site-packages/tensorflow_core/lite/python/interpreter_wrapper/tensorflow_wrap_interpreter_wrapper.py in AllocateTensors(self)
    108 
    109     def AllocateTensors(self):
--> 110         return _tensorflow_wrap_interpreter_wrapper.InterpreterWrapper_AllocateTensors(self)
    111 
    112     def Invoke(self):

RuntimeError: tensorflow/lite/kernels/kernel_util.cc:106 std::abs(input_product_scale - bias_scale) <= 1e-6 * std::min(input_product_scale, bias_scale) was not true.Node number 40 (FULLY_CONNECTED) failed to prepare.

我使用的是tensorflow 2.2.0

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-29 22:25:39

我会为这个打开一个问题here,因为它是tflite量化过程中的一个实际错误。我非常肯定我以前见过这种情况,但不确定是否有解决方法:/

编辑基本上,你可以尝试使用这个脚本进行一个虚拟推理运行,如果在你的CPU模型上失败了,那么很明显模型在tflite转换后被破坏了。

代码语言:javascript
运行
AI代码解释
复制
import numpy as np 
import sys
from tflite_runtime.interpreter import Interpreter
from tflite_runtime.interpreter import load_delegate

if len(sys.argv) < 2:
    print('Usage:', sys.argv[0], 'model_path')
    exit()

def main():
    """Runs inference with an input tflite model.""" 
    model_path = str(sys.argv[1])
    if model_path.endswith('edgetpu.tflite'):
        print('initialized for edgetpu')
        delegates = [load_delegate('libedgetpu.so.1.0')]                             
        interpreter = Interpreter(model_path, experimental_delegates=delegates)
    else: 
        print('initialized for cpu')
        interpreter = Interpreter(model_path)

    interpreter.allocate_tensors() 
    input_details = interpreter.get_input_details() 
    images = np.zeros(input_details[0]['shape'], input_details[0]['dtype'])
    #print(images)
    interpreter.set_tensor(input_details[0]['index'], images) 
    interpreter.invoke() 
    output_details = interpreter.get_output_details() 
    outputs = interpreter.get_tensor(output_details[0]['index']) 
    print(outputs)
    print('Success.') 

if __name__== '__main__':
    main()

我在pass中看到了这个问题,但不确定是否有解决方案。打开一个bug实际上是修复这个问题的最好方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62647070

复制
相关文章
用Python进行时间序列分解和预测
本文介绍了用Python进行时间序列分解的不同方法,以及如何在Python中进行时间序列预测的一些基本方法和示例。
Datawhale
2021/01/07
3.8K0
用Python进行时间序列分解和预测
Swoole:重新定义PHP
PHP语言的异步、并行、高性能网络通信框架,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询。 Swoole可以广泛应用于互联网、移动通信、企业软件、云计算、网络游戏、物联网、车联网、智能家居等领域。 使用PHP+Swoole作为网络通信框架,可以使企业IT研发团队的效率大大提升,更加专注于开发创新产品。
黄啊码
2020/05/29
7860
数据降维:特征值分解和奇异值分解的实战分析
《实例》阐述算法,通俗易懂,助您对算法的理解达到一个新高度。包含但不限于:经典算法,机器学习,深度学习,LeetCode 题解,Kaggle 实战。期待您的到来! 01 — 回顾 这几天推送了关于机器学习数据预处理之降维算法,介绍了通过降维提取数据的主成分的背景,特征值分解法,奇异值分解法的相关原理。 现在我们再回顾下这些问题,首先,提取主成分的必要性,从数字信号的角度分析,主成分时方差较大,称为信号,而噪声是方差较小的;极限讲,如果100个样本点都汇集成一个点,也就是方差为0,那么不就相当于我们手上有1个
double
2018/04/02
1.6K0
数据降维:特征值分解和奇异值分解的实战分析
PHP数据结构(三)——运用栈实现括号匹配
PHP数据结构(三)——运用栈实现括号匹配 (原创内容,转载请注明来源,谢谢) 栈在数据结构上是一种特殊的线性表,其限制是仅允许在表的一端进行插入和删除运算,即LIFO(后进先出),越往入栈的数据在
用户1327360
2018/03/07
1.2K0
PHP数据结构(三)——运用栈实现括号匹配
用Spark学习矩阵分解推荐算法
    在矩阵分解在协同过滤推荐算法中的应用中,我们对矩阵分解在推荐算法中的应用原理做了总结,这里我们就从实践的角度来用Spark学习矩阵分解推荐算法。
刘建平Pinard
2018/08/14
1.5K0
放弃偏见,重新认识 PHP
一位名叫Brent的程序员小哥,写了一篇博客文章,介绍了PHP在2019年的情况。
猿哥
2019/05/30
8440
PHP--正则表达式和样式匹配--小记
POSIX 风格的,有些低版本软件支持,目前高版本的有些已经废弃不用了,比如 zend studio 的较新版本.
书童小二
2018/09/03
1.9K0
用栈判断是否匹配
写代码的时候用到的括号都是成双成对的出现,并且大小也相同。在集成编辑环境中,IDE就会为我们自己动检查括号是否匹配。那么为了避免在报错,如何判断是否有无括号不匹配?
算法与编程之美
2023/08/22
1800
用栈判断是否匹配
因子分解和枚举(一)
今天有难题,所以我分了俩个来写,第一篇水题,发车了…… 返回n的第k个质数 题目中有一个说是排序,但是你for循环后已经是排好序的了,所以说很水的一题,不要相的太难了,请彦祖们看代码
秋名山码神
2022/12/13
1600
PHP正则表达式和字符串匹配
正则表达式是一种可以用来匹配字符串的模式。在PHP中,可以使用preg_match()函数来使用正则表达式进行匹配。preg_match()函数接受两个参数,第一个参数是正则表达式,第二个参数是要匹配的字符串。它返回匹配成功的次数,如果匹配失败则返回0。
堕落飞鸟
2023/04/27
1.3K0
SpringBoot正匹配和负匹配
在Spring框架的自动配置中,”Positive matches”(正匹配)和”Negative matches”(负匹配)是用于条件化配置的概念。
酒楼
2023/06/20
8470
用Docker快速实现SAPT能量分解分析
现在有了更方便的技术,叫做Docker。简而言之,Docker技术是将应用封装成一个包,封装的时候把应用需要的环境也包进来了。这个打好的包被称为镜像(image),基于镜像可以开启一个容器(container),容器与操作系统底层直接交互并且可以执行。有个这个技术,我们就可以拿过来容器直接用,免去了编译、链接库等等的劳顿。重要的是能快速出结果。
用户7592569
2020/07/27
8080
用Docker快速实现SAPT能量分解分析
PHP正则匹配日期和时间(时间戳转换)的实例代码
php需要一定的时间格式才能转换成时间戳(表示从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数),这就要用到php正则判断,以下是代码:
超级小可爱
2023/02/20
2.4K0
PHP正则表达式和字符串匹配示例
除了正则表达式之外,PHP还提供了一些字符串匹配函数。这些函数可以用于查找字符串中是否包含某个子串,或者从字符串中提取特定的子串。
堕落飞鸟
2023/04/27
1K0
linux awk精确匹配和模糊匹配
➜ ~ cat a 123 456 222 3312 ➜ ~ awk '/12/' a 123 3312 ➜ ~ awk '$0 ~ /12/' a 123 3312 ➜ ~ awk '$0 == "123"' a 123
葫芦
2019/04/17
10.7K0
数据结构用栈来判断括号匹配问题——Java
//判断括号匹配问题 public class Bracket_matching { //这是一个main方法,是程序的入口: public static void main(String[] args) { String st = "()()()"; //打印 System.out.println(Brackets(st)); } public static boolean Brackets(String str) {
楠羽
2022/11/18
2940
php去重后重新排键值
因为我们已经移除了一些元素,因此数组看起来不是正常的序列。比如我们可能会得到:array(0=>’A’,2=>’B’,5=>’C’);。在某些情况下,这不是一个问题,但是如果你需要数组的键值保持数字的序列,你可以使用一到两种方法解决键值乱序的问题。
黄啊码
2020/05/29
1.8K0
译文|用大数据重新定义客户忠诚度系统!
从以奖励为基础的尝试中建立真实的客户关系 一个忠诚度系统不应当是关于积分、奖励或地位的。虽然这些福利可以吸引消费者,但它们不能培养起忠诚度。这些系统的重点应当是,收集大量数据以便用于构建既有利于消费者又有利于品牌的关系。 在这里“有用”非常关键——因为消费者其实并不真正在乎企业是否保持数据简洁并且具有相关性。每个人在这一点或者其他某一点上可能在一项关于忠诚度的注册表上对他们的年龄撒谎,这已经不是什么秘密了。或选择不回答调查问题,故意或者无意地提供了不正确的数据,或以他们永不检查的、垃圾邮件地址作为联系方式。
CDA数据分析师
2018/02/23
7050
重新思考数据输入
在目前的产品交互中,输入数据然后程序或者产品对数据进行验证是非常常见的需求,而产品进行验证的目的性也很明确,就是为了避免脏数据进入数据库。但是从产品交互本身来讲,产品是为了让用户更加准确的、简单的使用一个功能,而不是在出错或者用户目的很明确的时候告诉他输入错误了。
RobinsonZhang
2018/10/08
6810
老旧话题:重新看看PHP的session
这基本上算是个老旧的话题了,几乎所有phper在第一次面试的时候都会被问到关于session的问题,如果不出意外,往往是如下三板斧:
老李秀
2019/11/14
1.1K0
老旧话题:重新看看PHP的session

相似问题

Android:如何通过触摸来旋转元素?

11

如何通过触摸来调整ConstraintLayout的大小?

13

如何在android中使用定点和触摸来旋转图像

20

如何在Android中通过Java调整文本大小

12

Android图像旋转和调整大小

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文