探索flatten的其他参数用法及对报错异常进行修正

1 问题

  1. 对flatten的其他参数的用法进行进一步了解

  2. 探索torch.flatten()与torch.nn.flatten()的区别

  3. 在代码调式时,遇到报错问题,进行修正并了解原因。

2 方法

  1. flatten的中文含义为"扁平化",具体怎么理解呢?假设你的数据为1维数据,那么这个数据天然就已经扁平化了,如果是2维数据,那么扁平化就是将2维数据变为1维数据,如果是3维数据,那么就要根据你自己所选择的"扁平化程度"来进行操作,假设需要全部扁平化,那么就直接将3维数据变为1维数据,如果只需要部分扁平化,那么有一维的数据不会进行扁平操作。

    torch.flatten()方法有三个参数,分别:

    input tensor:该方法的输入

    start_dim:开始flatten的维度

    end_dim:结束flatten的维度

    torch.flatten(t, start_dim=0, end_dim=-1)

    t表示的时要展平的tensor,start_dim是开始展平的维度,end_dim是结束展平的维度,它的作用就是将输入tensor的第start_dim维到end_dim维之间的数据"拉平"成一维tensor.

  2. (1) 默认的dim不同,torch.flatten()默认的dim=0,而nn.Flatten()默认的dim=1,例如输入数据的尺寸是3,1,4,4,经过torch.flatten()展开后的尺寸变为48,而经过nn.Flatten()后得到的结果是3, 16;

    (2) nn.Flatten是一个类,而torch.flatten()则是一个函数。

    对于torch.nn.Flatten(),因为其被用在神经网络中,输入为一批数据,第一维为batch,通常要把一个数据拉成一维,而不是将一批数据拉为一维。所以torch.nn.Flatten()默认从第二维开始平坦化。

  3. 发生异常: AttributeError

cannot assign module before Module.init() call

问题原因: 属性错误,模块不能在初始化之前赋值, 继承了父类(nn.Module)后子类重写了__init__,但是没有调用super初始化父类的构造函数。在类的初始化里面没有加上父类的初始化。

解决方法: super(XXX, self).init()

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| class MyNet(nn.Module): ''' 定义神经网络有哪些层,不含输入层 ''' def init(self): ''' 发生异常: AttributeError cannot assign module before Module.init() call ''' super(MyNet,self).init() self.fc1 = nn.Linear( in_features=784, #前一层的神经元个数 out_features=512 ,#当前层的神经元个数 ) self.fc2 = nn.Linear( in_features=512, #前一层的神经元个数 out_features=10,#当前层的神经元个数 ) ''' 定义数据的前向传播方式 x:前面的train_dataloader的一个batch数据 ''' def forward(self,x): #x的shape是B,C,H,W,例32,1,28,28 #32不拉伸 #问题:探索flatten的其他参数用法 #拉伸展开成一维向量 x = torch.flatten(x,start_dim=1)#索引为1的开始拉伸 x = self.fc1(x) out = self.fc2(x) return out #人为造一些数据来测试网络的正确性 x = torch.rand(size = (32,1,28,28)) net = MyNet() #实例化对象 print(net) #问题:此处net(x)为什么可以? out = net(x) print(out.shape) #torch.Size(32,10) device = ( 'cuda' if torch.cuda.is_available() else 'mps' if torch.backends.mps.is_available() else 'cpu' ) print(device) #cpu |

3 结语

针对问题一,对flatten的参数用法进一步了解,在对使用torch.flatten()与torch.nn.flatten()时,需注意俩者的差别,相对而言,对二维数据进行扁平化类nn.flatten()更简便。

针对问题二,对报错问题进行搜索,即可获取正确答案。也要对其含义及遇到类似问题可以解决。

相关推荐
人工智能AI技术2 分钟前
模型越强越翻车?GPT-6 旧配置踩坑深度避坑指南
人工智能
小酒星小杜2 分钟前
【AI+Gpt-Image2.5】我偷偷把同事做成了虚拟角色,结果被发现了
人工智能·程序员·产品
ElfBoard6 分钟前
作品展示|基于RK3588的复杂空间下自主导航无人机与多传感器 AI 融合环境监测分析
大数据·人工智能·单片机·嵌入式硬件·团队开发
hoaxxcj8 分钟前
DeepSeek Harness 本地部署与第三方插件排障实录:从 fetch failed 到 preset not found
人工智能·windows·开源·ai agent·deepseek
鲜于言悠9059 分钟前
AgentLoop
人工智能
statistican_ABin11 分钟前
中国互联网与数字生活分析报告—基于1990-2023年世界银行互联网数据的多维度分析
python
猫哥随身wifi14 分钟前
AI 手机越智能,随身网络越关键|AI 终端带来的网络新需求
网络·人工智能·智能手机
Mr数据杨16 分钟前
arkav1920多标签文本分类实战解析与建模思路
人工智能·数据分析·kaggle竞赛
明月_清风17 分钟前
MHS:AI Agent 开始连接物理世界
人工智能·后端·网络协议
乱世刀疤20 分钟前
Claude Code实用开发案例:远程控制软件IP中继版
人工智能·claude code