Pytorch神经网络-元组/列表如何喂到神经网络中

📚博客主页:knighthood2001

公众号:认知up吧 (目前正在带领大家一起提升认知,感兴趣可以来围观一下)

🎃知识星球:【认知up吧|成长|副业】介绍

❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️

🙏笔者水平有限,欢迎各位大佬指点,相互学习进步!

这篇文章适用于初学者,因为我就是这么过来的,最开始连网络中的参数为什么这么设置的都不知道。但是本文没有讲太多这方面的知识。

首先需要说明的是:

在PyTorch中,神经网络模型的输入通常需要是张量(tensor)类型。虽然你可以将元组作为输入传递给神经网络模型,但实际上在模型内部处理时,最终还是需要将数据转换为张量。

PyTorch的神经网络层(如nn.Linearnn.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,用于反向传播计算梯度。

  1. ViewBackward0:

    • ViewBackward0 是View 操作的反向传播函数。View 操作用于改变张量的形状,但不改变张量的数据内容。ViewBackward0 的作用是将梯度传播回 View
      操作之前的张量,以便在反向传播过程中正确更新梯度。
    • ViewBackward0 的主要功能是处理从 View 操作反向传播回来的梯度,确保梯度在形状变换后能够正确传播并更新。
  2. 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))
  • 20
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

knighthood2001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值