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

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

相关推荐
火山引擎开发者社区10 小时前
Agent Plan、Coding Plan限时优惠:2.5折畅享多模型!
人工智能
冬奇Lab11 小时前
AI Workflow 定义的四次演进:从 Markdown 到 JS 脚本,再到分布式多 Agent
javascript·人工智能·agent
冬奇Lab11 小时前
每日一个开源项目(第136篇):OpenMemory - 给 AI Agent 真正的认知记忆引擎
人工智能
黄啊码12 小时前
【黄啊码】微信 AI 把聊天功能和 Vibe Coding打通了,创业者:我又白干了
人工智能
IT_陈寒12 小时前
React的useState居然还有这种坑?我差点删库跑路
前端·人工智能·后端
用户4130622582913 小时前
给AI回答加引用角标citation:RAG前端实现
人工智能
金銀銅鐵14 小时前
[Python] 从《千字文》中随机挑选汉字
后端·python
米小虾14 小时前
WAIC 2026 倒计时30天:300+ AI 产品全球首发,今年看点全解析
人工智能