广播法则:
(1):让所有输入数组都向其中shape最长的数组看齐,shape中不足的加维度1
(2):两个数组要么在某一个维度的长度一致,要么其中一个为一
(3):当输入数组的某个维度的长度为一时,计算时沿此维度复制扩充成一样的形状
pytorch已经支持了自动广播法则
示例:
a = torch.ones(3,2)
b = torch.zeros(2,3,1)
#自动广播法则
#第一步:a为3*2,二维。b为2*3*1,三维。故在a的索引0处补维度1. a.unsqueeze(0)
#第二步:经第一步,a 为1*3*2,,b为2*3*1。a与b在第一个维度与第三个维度不等,利用广播法则扩展。
a = a.unsqueeze(0).expand(2,3,2)
b = b.expand(2,3,2)
a + b
利用pytorch实现简单的线性回归
公式:y = wx + b + e
损失函数:loss =
采用随机梯度下降法更新参数
import torch as t
from matplotlib import pyplot as plt
from IPython import display
t.manual_seed(1000)
'''产生随机数据,加噪声'''
def get_fake_data(batch_size = 8):
x = t.rand(batch_size,1) * 20
y = x * 2 + (1+t.randn(batch_size,1)) * 3
return x,y
'''初始化参数'''
w = t.rand(1,1)
b = t.zeros(1,1)
'''学习率'''
lr = 0.001
'''主函数'''
for ii in range(20000):
x,y = get_fake_data()
'''前向传播'''
y_pred = x.mm(w) + b.expand_as(y)
y = 0.5 * (y_pred - y) ** 2 #loss
loss = loss.sum
'''反向传播 ,dw,db的求法???'''
dloss = 1
dy_pred = dloss * (y_pred - y)
dw = x.t().mm(dy_pred)
db = dy_pred.sum()
'''更新参数'''
w.sub_(lr * dw)
b.sub_(lr * db)
if ii % 1000 == 0:
#画图
display.clear_output(wait = True)
x = t.arange(0,20).view(20,1)
y = x.mm(w) + b.expand_as(x)
plt.plot(x.numpy(),y.numpy())
x2,y2 = get_fake_data(batch_size = 20)
plt.scatter(x2.numpy(),y2.numpy())
plt.xlim(0,20)
plt.ylim(o,45)
plt.show()