探索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()更简便。

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

相关推荐
GISer_Jing4 小时前
AI自动化工作流:智能驱动未来(升级研究生项目!!!)
人工智能·前端框架·自动化
草捏子4 小时前
Agent Skills:让 AI 一次学会、永远记住的能力扩展方案
人工智能
NocoBase5 小时前
【2.0 教程】第 1 章:认识 NocoBase ,5 分钟跑起来
数据库·人工智能·开源·github·无代码
后端小肥肠5 小时前
OpenClaw实战|从识图到公众号内容自动化,我跑通了完整链路
人工智能·aigc·agent
猿界零零七5 小时前
pip install mxnet 报错解决方案
python·pip·mxnet
Elastic 中国社区官方博客5 小时前
快速 vs. 准确:衡量量化向量搜索的召回率
大数据·人工智能·elasticsearch·搜索引擎·ai·全文检索
qq_381338505 小时前
【技术日报】2026-03-18 AI 领域重磅速递
大数据·人工智能
NocoBase5 小时前
开源项目管理工具选型指南(2026年最新)
人工智能·开源·无代码
feasibility.5 小时前
AI 爬虫高手养成:Openclaw+Scrapling 手动部署 + 采集策略(以Walmart 电商平台为例)
人工智能·爬虫·科技·机器人·agi·openclaw·scrapling
程序员老猫5 小时前
前端菜鸡狂喜!DeepSeek+Gemini,嘴炮出完整博客方案
人工智能