可以从这个函数处理之后的数值要进行什么处理来理解该函数功能
self.fc_unit = nn.Sequential(
nn.Linear(in_features=6 * 6 * 248, out_features=1024),
nn.Linear(in_features=1024, out_features=2)
)
def forward(self, x):
x = self.conv_unit(x) #进行卷积操作
print("before:", x.size())
x = x.view(x.size(0), -1) # 维度变换
print("after:", x.size())
logits = self.fc_unit(x) # 维度变换后要进入到self.fc_unit(x)
pred = F.softmax(logits, dim=1)
return pred
上面是我截取一部分神经网络中的代码片段,程序输出后会得到:
before: torch.Size([256, 248, 6, 6])
after: torch.Size([256, 8928])
在全连接 self.fc_unit
中,要求输入一个二维数据,在这里要求的输入特征数(可以理解为其中的一个维度值)是 6 * 6 * 248 ,每个特征包含若干参数(这里是256个参数,可看作另一个维度值),但全连接前面的卷积操作计算出的数据是一个四维([256, 248, 6, 6] )数据 ,通过 x.view(x.size(0), -1)
之后(x.size(0)
表示第一维数据),保持第一维数据量不变,改变后面三个维度的数据,-1可以理解为将剩余维度压缩进一维,这里当然是将三维数据压缩成一维数据,最终就得到了我们想要的类型 [256, 8928] (248 * 6 * 6 = 8928)。
下面看一看 view() 不同操作对比:
随机产生一个四维数据,维度和上述相同。
import torch
x = torch.randn(256, 248, 6, 6)
x0 = x.view(x.size(0), -1)
x1 = x.view(x.size(1), -1)
x3 = x.view(x.size(3), -1)
x3_contrary = x.view(-1, x.size(3))
x4 = x.view(x.size(0), x.size(1), -1)
print("x0.size:", x0.size())
print("x1.size", x1.size())
print("x3.size", x3.size())
print("x3_contrary.size", x3_contrary.size())
print("x4.size", x4.size())
输出结果:
x0.size: torch.Size([256, 8928])
x1.size torch.Size([248, 9216])
x3.size torch.Size([6, 380928])
x3_contrary.size torch.Size([380928, 6])
x4.size torch.Size([256, 248, 36])
所以可以用该函数将不符合输入计算数据的 size
转换为我们想要的数据 size
。
具体可以查看官方文档:view