📚博客主页:knighthood2001
✨公众号:认知up吧 (目前正在带领大家一起提升认知,感兴趣可以来围观一下)
🎃知识星球:【认知up吧|成长|副业】介绍
❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️
🙏笔者水平有限,欢迎各位大佬指点,相互学习进步!
这篇文章适用于初学者,因为我就是这么过来的,最开始连网络中的参数为什么这么设置的都不知道。但是本文没有讲太多这方面的知识。
首先需要说明的是:
在PyTorch中,神经网络模型的输入通常需要是张量(tensor)
类型。虽然你可以将元组作为输入传递给神经网络模型,但实际上在模型内部处理时,最终还是需要将数据转换为张量。
PyTorch的神经网络层(如nn.Linear
、nn.Conv2d
等)的输入和输出都是张量。因此,在实际使用中,你需要确保将任何非张量类型的数据(如列表、元组等)转换为张量,以便能够在神经网络中进行计算。
经过我的一点点测试,发现好像pytorch中好像只能输入tensor格式的数据,而不能是tuple或者list数据类型。
import torch
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.f1 = nn.Linear(2, 32)
self.f2 = nn.Linear(32, 4)
def forward(self, x):
x = self.f1(x)
x = F.relu(x)
action = self.f2(x)
return action
这里我定义了两层网络,简单实现一个神经网络。
接下来我定义了一些数据类型,比如a是元组,c是列表,b和d都是经过转换成tensor张量格式的数据。
net = Net()
a = (4, 4)
b = torch.FloatTensor(a)
print(b)
print(net(b))
c = [4, 4]
d = torch.FloatTensor(c)
print(d)
print(net(d))
可以发现他们经过转换后长得一样了,然后才能把他们喂到神经网络中,否则就会出现上面的报错。
从中我们可以看出来,b和d都是包含两个数据的一维张量。这里好像是因为PyTorch 在执行 net(b)
时会自动将 1 维的输入张量 b 视作大小为 (1, 2) 的 batch,并将其送入神经网络进行前向传播计算。
所以可能将其变为二维张量输入网络比较好(个人观点),如下。
如果你想要将 b 转换为二维张量,可以使用 b.view(1, -1) 方法,这样 b 就会变成一个包含一个行和两列的二维张量。同理,d也是这样处理。这里的-1表示的就是,系统会根据总的数据数以及其他维度需要的数量,然后计算出-1所在的维度的数量。
m = b.view(1, -1)
print(m)
print(net(m))
发现结果一样,就是反向传播的梯度下降函数不同。
我查询了一下:
在 PyTorch 中,ViewBackward0 和 AddmmBackward0 是两种不同类型的 Autograd
Function,用于反向传播计算梯度。
ViewBackward0:
- ViewBackward0 是View 操作的反向传播函数。View 操作用于改变张量的形状,但不改变张量的数据内容。ViewBackward0 的作用是将梯度传播回 View
操作之前的张量,以便在反向传播过程中正确更新梯度。- ViewBackward0 的主要功能是处理从 View 操作反向传播回来的梯度,确保梯度在形状变换后能够正确传播并更新。
AddmmBackward0:
- AddmmBackward0 是 addmm 操作(矩阵相加和矩阵乘法)的反向传播函数。addmm 函数用于计算矩阵相加和矩阵乘法的结果。AddmmBackward0 的作用是计算 addmm 操作对输入张量的梯度。
- AddmmBackward0 主要负责处理 addmm 操作的反向传播过程,根据输出的梯度计算输入张量的梯度,并将其传播到上游的节点。
总的来说,ViewBackward0 用于处理 View 操作的反向传播,而 AddmmBackward0 用于处理 addmm
操作的反向传播。它们都是 Autograd Function 的一部分,负责计算和传播梯度,以支持 PyTorch 的自动微分功能。
本文的全部代码如下:
import torch
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.f1 = nn.Linear(2, 32)
self.f2 = nn.Linear(32, 4)
def forward(self, x):
x = self.f1(x)
x = F.relu(x)
action = self.f2(x)
return action
net = Net()
a = (4, 4)
b = torch.FloatTensor(a)
print(b)
print(net(b))
m = b.view(1, -1)
print(m)
print(net(m))
c = [4, 4]
d = torch.FloatTensor(c)
print(d)
print(net(d))