pytorch训练权重转化为tensorflow模型的教训

news/2025/3/16 3:03:30/

模型构建时候有时候在工程量比较大的时候,不可避免使用迭代算法,迭代算法本身会让错误的追踪更加困难,因此掌握基本的框架之间的差异非常重要。以下均是在模型转换过程中出现的错误。

shuffle operation(shuffle 操作)

这个操作原本是用来将各个通道之间的信息进行打乱后,此时面临重要的问题就是,如果将通道打乱,在pytorch里面与tensorflow中间,两种通道排序是不一样的,是采用不同的通道数据排列进行的。

import tensorflow as tfdef channel_shuffle(x, groups):_, h, w, c = x.shape# c 通道进行划分x = tf.reshape(x, [-1, h, w, groups, c // groups])# 通道为基本单位的情况下,多group均采样重组x = tf.transpose(x, [0, 1, 2, 4, 3])  # 调整通道维度顺序# 混洗采样重组后再reshape变成之前的通道x = tf.reshape(x, [-1, h, w, c])return x# 示例张量
x = tf.random.normal((2, 3, 3, 8))
print("Original tensor:\n", x.numpy())# 进行通道混洗
shuffled_x = channel_shuffle(x, groups=2)
print("Shuffled tensor:\n", shuffled_x.numpy())

Pytorch下的GSBottleneck采用的Sequential具有差异

class GSBottleneck(nn.Module):# GS Bottleneck https://github.com/AlanLi1997/slim-neck-by-gsconvdef __init__(self, c1, c2, k=3, s=1):super().__init__()c_ = c2 // 2# for lightingself.conv_lighting = nn.Sequential(GSConv(c1, c_, 1, 1),GSConv(c_, c2, 1, 1, act=False))# for receptive fieldself.conv = nn.Sequential(GSConv(c1, c_, 3, 1),GSConv(c_, c2, 3, 1, act=False))self.shortcut = nn.Identity()def forward(self, x):return self.conv_lighting(x)

我遇到的坑为:

class TFGSBottleneck(tf.keras.layers.Layer):# GS Bottleneck https://github.com/AlanLi1997/slim-neck-by-gsconvdef __init__(self, c1, c2, k=3, s=1,w=None):super().__init__()c_ = c2 // 2# example# self.cv1 = TFConv(c1, c_, 1, 1, w=w.cv1)# self.cv2 = TFConv(c_, c2, 3, 1, g=g, w=w.cv2)self.conv_lighting = tf.keras.Sequential(TFGSConv(c1, c_, 1, 1,w=w.conv_lighting[0]),TFGSConv(c_, c2, 1, 1, act=False, w=w.conv_lighting[1]))# for receptive fieldself.conv = tf.keras.Sequential(TFGSConv(c1, c_, 3, 1,w=w.conv[0]),TFGSConv(c_, c2, 3, 1, act=False,w=w.conv[1]))self.shortcut = tf.keras.layers.Lambda(lambda x: x)def call(self, x):print("TFGSBottleneck input: ",x.shape)print("TFGSBottleneck output: ", self.conv_lighting(x).shape)return self.conv_lighting(x)


有以下错误

Traceback (most recent call last):File "D:\TEST\yolov5\models\tf.py", line 1078, in <module>main(opt)File "D:\TEST\yolov5\models\tf.py", line 1073, in mainrun(**vars(opt))File "D:\TEST\yolov5\models\tf.py", line 1044, in run_ = tf_model.predict(im)  # inference^^^^^^^^^^^^^^^^^^^^File "D:\TEST\yolov5\models\tf.py", line 922, in predictx = m(x)  # run^^^^File "C:\Users\Zhuliang\.conda\envs\exportyolo2\Lib\site-packages\keras\utils\traceback_utils.py", line 70, in error_handlerraise e.with_traceback(filtered_tb) from NoneFile "D:\TEST\yolov5\models\tf.py", line 383, in callm_x1 = self.m(x1)^^^^^^^^^^File "D:\TEST\yolov5\models\tf.py", line 361, in callprint("TFGSBottleneck output: ", self.conv_lighting(x).shape)^^^^^^^^^^^^^^^^^^^^^
ValueError: Exception encountered when calling layer 'tfgs_bottleneck' (type TFGSBottleneck).name for name_scope must be a string.Call arguments received by layer 'tfgs_bottleneck' (type TFGSBottleneck):• x=tf.Tensor(shape=(1, 136, 136, 8), dtype=float32)

解决方案为

错误地将两个层作为位置参数传递给tf.keras.Sequential构造函数,导致第二个参数被误解为name参数,而name必须是一个字符串,但用户传递了一个层实例。这导致在调用层时,TensorFlow无法正确创建name_scope,从而引发错误。解决方法是把这两个层放在一个列表中,作为Sequential构造函数的第一个参数。

要解决此错误,需要将传递给tf.keras.Sequential的层放在列表中,确保它们被正确解析为层序列而不是其他参数。以下是修改后的代码:

tf.keras.Sequential与tensorflow中的pytorch

class TFGSBottleneck(tf.keras.layers.Layer):# GS Bottleneck https://github.com/AlanLi1997/slim-neck-by-gsconvdef __init__(self, c1, c2, k=3, s=1, w=None):super().__init__()c_ = c2 // 2# 使用列表包裹层以正确传递self.conv_lighting = tf.keras.Sequential([TFGSConv(c1, c_, 1, 1, w=w.conv_lighting[0]),TFGSConv(c_, c2, 1, 1, act=False, w=w.conv_lighting[1])])self.conv = tf.keras.Sequential([TFGSConv(c1, c_, 3, 1, w=w.conv[0]),TFGSConv(c_, c2, 3, 1, act=False, w=w.conv[1])])self.shortcut = tf.keras.layers.Lambda(lambda x: x)def call(self, x):return self.conv_lighting(x)


http://www.ppmy.cn/news/1579468.html

相关文章

HTML 样式之 CSS 全面解析

在网页开发的世界里&#xff0c;HTML 负责搭建页面的结构&#xff0c;而 CSS&#xff08;Cascading Style Sheets&#xff0c;层叠样式表&#xff09;则承担着渲染 HTML 元素标签样式的重任&#xff0c;赋予网页丰富的视觉效果。​ 一、CSS 的魅力展现​ CSS 能够实现诸如改变…

Ubuntu22.04 安装 Isaac gym 中出现的问题

Ubuntu22.04 安装 Isaac gym 中出现的问题 1. Isaac Gym 简介2. 下载地址3.具体安装过程省略4.问题与解决 1. Isaac Gym 简介 Isaac Gym 是 NVIDIA 推出的机器人仿真与强化学习训练平台&#xff0c;支持 GPU 加速的物理仿真。本文将详细介绍其在 Ubuntu 22.04 上的安装流程。 …

Go语言为什么运行比Java快

文章目录 前言一、核心区别二、Go Vs Java1.Go 的启动比 Java 快&#xff1f;2.选 Go Or Java&#xff1f; 总结 前言 Go 和 Java 是两种广泛应用的编程语言&#xff0c;它们在语言特性、性能、生态、应用场景等方面存在显著区别。以下是它们的核心区别&#xff0c;以及在实际…

Excel 保护工作簿:它能解决哪些问题?如何正确使用?

在日常办公中&#xff0c;Excel 表格常常涉及多人协作、重要数据保护&#xff0c;甚至是避免误操作的情况。这时候&#xff0c;“保护工作簿”功能就能派上用场。它能有效防止他人修改表结构、删除工作表&#xff0c;甚至可以设置密码&#xff0c;确保数据的完整性和安全性。今…

【Go沉思录】朝花夕拾:探究 Go 接口型函数

本文目录 序1.接口型函数案例方式1 GetterFunc 类型的函数作为参数方式2 实现了 Getter 接口的结构体作为参数价值 2.net/http包中的使用场景 序 之前写Geecache的时候&#xff0c;遇到了接口型函数&#xff0c;当时没有搞懂&#xff0c;现在重新回过头研究复习Geecache的时候…

每日一题一一LeetCode1. 两数之和 - 力扣(LeetCode)

每日一题一一LeetCode1. 两数之和 - 力扣&#xff08;LeetCode&#xff09; 1. 两数之和 - 力扣&#xff08;LeetCode&#xff09; 本题的要求是给你一个数组&#xff0c;然后让你从中找出两个值&#xff0c;他们的和为target&#xff0c;然后返回这两个数的下标 暴力版本&a…

从0开始,手搓Tomcat

一、什么是Tomcat Tomcat 是一款开源的、轻量级的 Web 服务器&#xff0c;它不仅能够提供 HTTP 服务&#xff0c;还能够运行 Java Servlet 和 JavaServer Pages&#xff08;JSP&#xff09;。对于许多开发者来说&#xff0c;理解 Tomcat 的目录结构以及如何在该结构中组织应用…

如何使用postman就可以查看base64图片

一、应用场景 纯后端开发&#xff0c;想要知道自己返回的图片数据是否正常返回&#xff0c;使用简单的工具就可以解析 二、postman介绍 Postman 提供直观的图形用户界面&#xff0c;使用户能够轻松构建和发送 HTTP 请求。能够编写脚本&#xff0c;进行自动化测试&#xff0c;是…