动手学深度学习pytorch版-填坑-TypeError: normal() received an invalid combination of arguments

在8章的序列模型这里:
在这里插入图片描述

%matplotlib inline
import torch
from torch import nn
from d2l import torch as d2l
T = 1000 # 总共产⽣1000个点
time = torch.arange(1, T + 1, dtype=torch.float32)
x = torch.sin(0.01 * time) + torch.normal(0, 0.2, (T,))
d2l.plot(time, [x], 'time', 'x', xlim=[1, 1000], figsize=(6, 3))

报错:
TypeError: normal() received an invalid combination of arguments - got (int, float, tuple), but expected one of:

  • (Tensor mean, Tensor std, torch.Generator generator, Tensor out)
  • (Tensor mean, float std, torch.Generator generator, Tensor out)
  • (float mean, Tensor std, torch.Generator generator, Tensor out)

``
第8章的代码会报错,跑不了,`

在windows anaconda3环境代码的修改-亲测可行

  1. 修改torch.normal函数用np.random.normal替代(借鉴他人思想)
  2. TypeError: len() of a 0-d tensor-因为d2l包依旧是调用的matplotlib,所以利用np.array修改了原来的写法。画图成功。
    总结:失败应该是由于d2l的底层源码的一些实现问题,或者说还没更新。
import torch
from torch import nn
from d2l import torch as d2l
import numpy as np
from matplotlib import pyplot as plt
T=1000 #总共产生1000个点
time=torch.arange(1,T+1,dtype=torch.float32)
x=torch.sin(0.01*time)+torch.tensor(np.random.normal(0,0.2,size=(T,)),dtype=torch.float32)
d2l.plot(np.array(time),np.array(x),'time','x',xlim=[1,1000],figsize=(6,3))
plt.show()


在这里插入图片描述

import torch torch.manual_seed(10) #设置随机种子 # 线性算子 class Linear(Op): def __init__(self, input_size): """ 输入: - input_size:模型要处理的数据特征向量长度 """ self.input_size = input_size # 模型参数 self.params = {} self.params['w'] = torch.randn(self.input_size,1,dtype='float32') self.params['b'] = torch.zeros(shape=[1],dtype='float32') def __call__(self, X): return self.forward(X) # 前向函数 def forward(self, X): """ 输入: - X: tensor, shape=[N,D] 注意这里的X矩阵是由N个x向量的转置拼接成的,与原教材行向量表示方式不一致 输出: - y_pred: tensor, shape=[N] """ N,D = X.shape if self.input_size==0: return torch.full(shape=[N,1], fill_value=self.params['b']) assert D==self.input_size # 输入数据维度合法性验证 # 使用torch.matmul计算两个tensor的乘积 y_pred = torch.matmul(X,self.params['w'])+self.params['b'] return y_pred # 注意这里我们为了和后面章节统一,这里的X矩阵是由N个x向量的转置拼接成的,与原教材行向量表示方式不一致 input_size = 3 N = 2 X = torch.randn(2,3,dtype=torch.float32) # 生成2个维度为3的数据 model = Linear(input_size) y_pred = model(X) print("y_pred:",y_pred) #输出结果的个数也是2个报错TypeError Traceback (most recent call last) Cell In[56], line 49 47 N = 2 48 X = torch.randn(2,3,dtype=torch.float32) # 生成2个维度为3的数据 ---> 49 model = Linear(input_size) 50 y_pred = model(X) 51 print("y_pred:",y_pred) Cell In[56], line 17, in Linear.__init__(self, input_size) 15 # 模型参数 16 self.params = {} ---> 17 self.params['w'] = torch.randn(self.input_size,1,dtype='float32') 18 self.params['b'] = torch.zeros(shape=[1],dtype='float32') TypeError: randn() received an invalid combination of arguments - got (int, int, dtype=str), but expected one of: * (tuple of ints size, *, torch.Generator generator, tuple of names names, torch.dtype dtype, torch.layout layout, torch.device device, bool pin_memory, bool requires_grad) * (tuple of ints size, *, torch.Generator generator, Tensor out, torch.dtype dtype, torch.layout layout, torch.device device, bool pin_memory, bool requires_grad) * (tuple of ints size, *, Tensor out, torch.dtype dtype, torch.layout layout, torch.device device, bool pin_memory, bool requires_grad) * (tuple of ints size, *, tuple of names names, torch.dtype dtype, torch.layout layout, torch.device device, bool pin_memory, bool requires_grad) 应该怎么改
最新发布
07-22
### 回答1: 这个错误通常出现在使用PyTorch深度学习框架时,由于给定的参数不符合函数的要求,导致函数无法正常执行而产生。具体来说,这个错误提示中提到的函数是“cat()”,它的作用是将多个tensor沿着某个维度拼接在一起。这个函数要求传入多个tensor作为参数,并且还可以指定一个维度来进行拼接。但是,对于这个错误提示中的参数,我们可以看到只有一个参数,而且这个参数是一个tensor。这显然不符合“cat()”函数的要求,因为它至少需要两个tensor才能进行拼接。因此,程序会提示这个错误,告诉我们传入的参数组合无效。 为了解决这个问题,我们需要检查代码中传入“cat()”函数的参数是否符合要求,通常可以通过打印参数的类型和形状等信息来进行调试。另外,还需要查看代码中的语法是否正确,比如是否漏掉了某个逗号或者括号。如果代码没有问题,那么就需要进一步检查数据集的格式和处理方式是否正确,以及模型的架构和输入输出是否匹配等因素,有时候问题可能并不是出现在“cat()”函数这个位置上。总之,要解决这个错误需要进行耐心和仔细的调试工作,有时需要从多个方面入手才能找到问题的根源。 ### 回答2: typeerror: cat() received an invalid combination of arguments - got (tensor,。 这个错误通常是在使用PyTorch中的“torch.cat()”函数时出现的。在这个错误中,“cat()”函数被调用并且传入了一个张量作为参数,但是在调用时,传入的数据的形状(shape)与函数定义的形式不匹配。 例如,如果我们要将两个形状相同的张量连接起来,可以使用以下代码: a = torch.randn(2, 3) b = torch.randn(2, 3) torch.cat((a, b), dim=0) 在这个例子中,我们创建了两个形状相同的张量“a”和“b”,并将它们通过“torch.cat()”函数进行连接。在要连接的张量列表中,我们将它们作为一个元素传入,然后指定连接维度为“dim=0”,表示在第0个维度进行连接。 但是,当我们错误地传入了一个将所有张量堆叠为一个大张量的“torch.cat()”函数时,就会出现“TypeError: cat() got an unexpected keyword argument 'dim'”或“TypeError: cat(): argument 'tensors' (position 1) must be tuple of Tensors, not Tensor”错误。 因此,我们应该仔细检查我们传入“torch.cat()”函数的参数,确保参数的形状和类型与函数定义相匹配。这样可以避免这样的错误。 ### 回答3: Type Error: cat() 收到了无效的组合参数 - 接受了 (tensor, ... 在PyTorch中,cat()是指将张量(tensor)按指定的维度拼接为一个新的张量。这个错误是因为我们在调用cat()函数时,传入的参数组合错误导致的。 如上面的错误提示所示,我们传入的参数是(tensor, ...),而其中的三个点(...)代表后续可能还有其他参数。这说明我们在调用cat()函数时,可能传入了更多的参数,但是这些参数不符合cat()函数可以接受的参数类型或参数组合。 举例来说,如果我们想要将两个张量按照第二个维度进行拼接,即将两个形状分别为(2,3)和(2,4)的张量拼接为一个形状为(2,7)的张量,我们可以使用cat()函数进行操作: ```python import torch a = torch.randn(2, 3) b = torch.randn(2, 4) c = torch.cat([a, b], dim=1) print(c.shape) # (2,7) ``` 在这个例子中,我们将a和b两个张量沿着第二个维度(即列方向)进行拼接,并将结果赋值给变量c。注意这里cat()函数的参数是一个list,其中包含了要拼接的所有张量,以及一个指定拼接维度的dim参数。这样就可以正确地使用cat()函数进行操作了。 但是如果我们使用以下代码: ```python import torch a = torch.randn(2, 3) b = torch.randn(2, 4) c = torch.cat(a, b, dim=1) # 错误调用方式 ``` 这个错误调用方式将会给出上面提到的错误提示,因为这里我们将a和b两个张量分别作为两个参数传入cat()函数,而这样的参数组合是不合法的。正确的调用方式应该将a和b放在一个list中再传入cat()函数中。 综上所述,当cat()函数出现TypeError错误时,我们应该检查调用cat()函数时传入的参数是否符合语法规范,包括参数类型、个数、以及各参数之间的组合方式等。只有当参数符合要求时,才能正确地使用cat()函数进行张量拼接的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值