24 篇文章 2 订阅
5 篇文章 0 订阅
2 篇文章 0 订阅

# 0.前言

def synthetic_data(w, b, num_examples):
"""生成 y = Xw + b + 噪声。"""
X = torch.normal(0, 1, (num_examples, len(w)))
y = torch.matmul(X, w) + b
y += torch.normal(0, 0.01, y.shape)
return X, y.reshape((-1, 1))

true_w = torch.tensor([2, -3.4])
true_b = 4.2
features, labels = synthetic_data(true_w, true_b, 1000)

TypeError                                 Traceback (most recent call last)
<ipython-input-14-13b36a1f7ef4> in <module>
8 true_w = torch.tensor([2, -3.4])
9 true_b = 4.2
---> 10 features, labels = synthetic_data(true_w, true_b, 1000)

<ipython-input-14-13b36a1f7ef4> in synthetic_data(w, b, num_examples)
1 def synthetic_data(w, b, num_examples):
2     """生成 y = Xw + b + 噪声。"""
----> 3     X = torch.normal(0, 1, (num_examples, len(w)))
4     y = torch.matmul(X, w) + b
5     y += torch.normal(0, 0.01, y.shape)

TypeError: normal() received an invalid combination of arguments - got (int, int, tuple), but expected one of:
* (Tensor mean, Tensor std, torch.Generator generator, Tensor out)
* wei
* (float mean, Tensor std, torch.Generator generator, Tensor out)

torch.normal(mean, std, out=None) → Tensor

Tensor mean, Tensor std

torch.normal(mean, std=1.0, out=None) → Tensor

Tensor mean, float std

torch.normal(mean=0.0, std, out=None) → Tensor

float mean, Tensor std

# 1.torch.normal()函数的另外两种格式介绍

### torch.normal(mean, std, *, generator=None, out=None) → Tensor

torch.normal(mean, std, *, generator=None, out=None) → Tensor

mean 是一个张量，具有每个输出元素正态分布的均值

std 是一个张量，每个输出元素的正态分布的标准差

mean 和 std 的形状不需要匹配，但是每个张量中的元素总数需要相同。

mean (Tensor) –每个元素平均值的张量

std (Tensor) –每个元素标准偏差的张量

generator (torch.Generator, optional) –用于采样的伪随机数生成器

out (Tensor, optional) –输出张量

### torch.normal(mean, std, size, *, out=None) → Tensor

torch.normal(mean, std, size, *, out=None) → Tensor

mean (float)-所有分布的平均值

std（float）–所有分布的标准偏差

size (int...)–定义输出张量形状的整数序列。

out（张量，可选）–输出张量。

# 2.对代码的修改（记录的错误代码及笔记）

torch.normal(mean, std, size, *, out=None)

def synthetic_data(w, b, num_examples):
"""生成 y = Xw + b + 噪声。"""
X = torch.normal(0., 1., (num_examples, len(w)))
#X = torch.normal(mean = 0.,std= 1., size =(num_examples, len(w)))
#尝试上述也不行
y = torch.matmul(X, w) + b
y += torch.normal(0., 0.01, y.shape)
return X, y.reshape((-1, 1))

true_w = torch.tensor([2, -3.4])
true_b = 4.2
features, labels = synthetic_data(true_w, true_b, 1000)

# 3.结论以及代码其它修改过程记录（也是错误的代码）

def synthetic_data(w, b, num_examples):
"""生成 y = Xw + b + 噪声。"""
X = torch.normal(torch.tensor([0]), 1.)
y = torch.matmul(X, w) + b
y += torch.normal(torch.tensor([0]), 0.01)
return X, y.reshape((-1, 1))

true_w = torch.tensor([2, -3.4])
true_b = 4.2
features, labels = synthetic_data(true_w, true_b, 1000)

RuntimeError: _th_normal is not implemented for type torch.LongTensor

def synthetic_data(w, b, num_examples):
"""生成 y = Xw + b + 噪声。"""
a1 = torch.tensor([0],dtype=torch.float32)#直接放函数里会报错，故使用a1先生成好

X = torch.normal(a1, 1.)
y = torch.matmul(X, w) + b
y += torch.normal(a1, 0.01)
return X, y.reshape((-1, 1))

true_w = torch.tensor([2, -3.4])
true_b = 4.2
features, labels = synthetic_data(true_w, true_b, 1000)

RuntimeError                              Traceback (most recent call last)
<ipython-input-48-e254f9fc8d52> in <module>
10 true_w = torch.tensor([2, -3.4],dtype=torch.float32)
11 true_b = 4.2
---> 12 features, labels = synthetic_data(true_w, true_b, 1000)

<ipython-input-48-e254f9fc8d52> in synthetic_data(w, b, num_examples)
4
5     X = torch.normal(a1, 1.)
----> 6     y = torch.matmul(X, w) + b
7     y += torch.normal(a1, 0.01)
8     return X, y.reshape((-1, 1))
RuntimeError: inconsistent tensor size, expected tensor [1] and src [2] to have the same number of elements, but got 1 and 2 elements respectively

def synthetic_data(w, b, num_examples):
"""生成 y = Xw + b + 噪声。"""
a1 = torch.tensor([0,0],dtype=torch.float32)#直接放函数里会报错，故使用a1先生成好

X = torch.normal(a1, 1.)
y = torch.matmul(X, w) + b
y += torch.normal(a1,1.)
return X, y.reshape((-1, 1))

true_w = torch.tensor([2, -3.4])
true_b = 4.2
features, labels = synthetic_data(true_w, true_b, 1000)

RuntimeError                              Traceback (most recent call last)
<ipython-input-36-915e79a2fa26> in <module>
10 true_w = torch.tensor([2, -3.4])
11 true_b = 4.2
---> 12 features, labels = synthetic_data(true_w, true_b, 1000)

<ipython-input-36-915e79a2fa26> in synthetic_data(w, b, num_examples)
5     X = torch.normal(a1, 1.)
6     y = torch.matmul(X, w) + b
----> 7     y += torch.normal(a1,1.)
8     return X, y.reshape((-1, 1))
9

RuntimeError: output with shape [] doesn't match the broadcast shape [2]

由于广播机制等原因，张量的 y+=a y=a+y 的运算是有区别的，故修改代码如下：

def synthetic_data(w, b, num_examples):
"""生成 y = Xw + b + 噪声。"""
a1 = torch.tensor([0,0],dtype=torch.float32)#直接放函数里会报错，故使用a1先生成好

X = torch.normal(a1, 1.)
y = torch.matmul(X, w) + b
y = torch.normal(a1,1.) + y
return X, y.reshape((-1, 1))

true_w = torch.tensor([2, -3.4])
true_b = 4.2
features, labels = synthetic_data(true_w, true_b, 1000)

print('features:', features[0], '\nlabel:', labels[0])

features: tensor(-0.9737)
label: tensor([7.3704])

与课程中输出不一样，：如下

features: tensor([-0.0748, -0.3831])
label: tensor([5.3410])

后来反思之后发现陷入误区，不能根据错误而该程序，应该从课程中要设计个什么函数而写代码，以上代码仅仅是思考的过程笔记，都不是正确的，正确代码从第4节开始。

==============================分界线=================================

### ==============补充函数torch.matmul()介绍=================

torch.matmul(tensor1, tensor2, out=None) → Tensor

tensor1（张量）–要相乘的第一个张量

tensor2（张量）–要相乘的第二个张量

out（张量，可选）–输出张量

====================================================================

==============================分界线=================================

====================================================================

# 4.最终程序如下（正确修改后的代码）：

import numpy as np

def synthetic_data(w, b, num_examples):
"""生成 y = Xw + b + 噪声。"""
#X = torch.normal(0, 1, (num_examples, len(w)))
#原本老师定义size 为（num_examples=1000，len(w)=2）
X = torch.tensor(np.random.normal(0, 1, size=(num_examples, len(w))), dtype=torch.float32)

#或者使用下面代码与上面代码差不多效果
#X = torch.randn(num_examples, len(w), dtype=torch.float32)
#以下代码创建一个形状为 (3, 4) 的张量。其中的每个元素都从均值为0、标准差为1的标准高斯（正态）分布中随机采样。
#参考自https://zh-v2.d2l.ai/chapter_preliminaries/ndarray.html#id2
#的torch.randn(3, 4)函数

# numpy.random.normal(loc=0,scale=1e-2,size=shape)
#参数loc(float)：正态分布的均值，对应着这个分布的中心。loc=0说明这一个以Y轴为对称轴的正态分布
#参数scale(float)：正态分布的标准差，对应分布的宽度，scale越大，正态分布的曲线越矮胖，scale越小，曲线越高瘦
#参数size(int 或者整数元组)：输出的值赋在shape里，默认为None

#补充 （w,b）的初始化  若维数为d
#可以证明，如果X服从正态分布，均值为0，方差为1，且各个维度线性无关，而（w,b）是
#（-1/(d的根号)，1/(d的根号)）的均匀分布，则 (W^T)X+b 是均值为0，方差为1/3的正态分布
#原因：若(W^T)X+b很大或很小会导致梯度趋近于0，造成梯度消失现象

y = torch.matmul(X, w) + b
#若input维度1D，other维度2D，则先将1D的维度扩充到2D（1D的维数前面+1），
#然后得到结果后再将此维度去掉，得到的与input的维度相同。
#即使作扩充（广播）处理，input的维度也要和other维度做对应关系

#y += torch.normal(0, 0.01, y.shape)
#其中噪声项 ϵ  服从均值为0、标准差为0.01的正态分布。
y += torch.tensor(np.random.normal(0, 0.01, size=y.size()), dtype=torch.float32)

return X, y.reshape((-1, 1))

true_w = torch.tensor([2, -3.4])
true_b = 4.2
features, labels = synthetic_data(true_w, true_b, 1000)
print('features:', features[0], '\nlabel:', labels[0])

输出

features: tensor([-0.7966, -0.0960])
label: tensor([2.9413])
d2l.set_figsize()
d2l.plt.scatter(features[:, (1)].detach().numpy(),
labels.detach().numpy(), 1);

================================补充================================

d2l.synthetic_data(true_w, true_b, 1000)

TypeError                                 Traceback (most recent call last)
<ipython-input-2-296d220dc8b5> in <module>
7 true_w = torch.tensor([2, -3.4])
8 true_b = torch.tensor(4.2)
----> 9 features, labels = d2l.synthetic_data(true_w, true_b, 1000)
10 #D:\Anaconda3\lib\site-packages\d2l\torch.py in synthetic_data(w, b, num_examples)
11 #对代码进行了修改

D:\1learnsoft\2PyTorch\Anaconda3\lib\site-packages\d2l\torch.py in synthetic_data(w, b, num_examples)
130     """Generate y = Xw + b + noise"""
131
--> 132     X = d2l.normal(0, 1, (num_examples, len(w)))
133
134     y = d2l.matmul(X, w) + b

TypeError: normal() received an invalid combination of arguments - got (int, int, 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)


def synthetic_data(w, b, num_examples):

"""Generate y = Xw + b + noise.由于pytorch版本使用的1.0故进行以下修改"""
X = torch.tensor(np.random.normal(0, 1, size=(num_examples, len(w))), dtype=torch.float32)
#X = d2l.normal(0, 1, (num_examples, len(w)))

y = d2l.matmul(X, w) + b

y += torch.tensor(np.random.normal(0, 0.01, size=y.size()), dtype=torch.float32)
#y += d2l.normal(0, 0.01, y.shape)

return X, d2l.reshape(y, (-1, 1))

TabError: inconsistent use of tabs and spaces in indentation

================================结束================================

• 48
点赞
• 65
收藏
• 打赏
• 6
评论
08-14 1464
09-21 388
04-21 1万+
01-20 3888
08-12 5117
10-31 380
05-01 1963
03-30 4143

### “相关推荐”对你有帮助么？

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

¥2 ¥4 ¥6 ¥10 ¥20

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