算法需要自动扩充,并不是无法计算
用mini-batch构造数据集的时候,x和y必须是矩阵。
构造计算图时,知道x和y就会知道w和b的维度。
Module类中的Linear模块,能够实现wx+b
即为如下计算图。
***Linear模块的构造函数如下:
bias是否要加偏执量,默认加偏执量为True,否则为false.
补充知识点
class Foobar:
def __init__(self):
pass
def __call__(self, *args, **kwargs):
pass
def func(a,b,c,x,y):
pass
func(1,2,3,x=3,y=5)
def fun(*args,x,y):#调用函数时不确定有输入几个数值
print(args)
fun(1,2,3,3,x=3,y=5)
def function(*args,**kwargs):#会把xy变成词典
print(kwargs)
function(1,1,x=3,y=9)
MSELoss计算损失函数,size_average是否要求平均值,reduce是否要降维度(一般不考虑reduce)
为什么调用如此复杂,如下图所示
print(‘w=’,model.linear.weight.item())
print(‘b=’,model.linear.bias.item())
值得注意的是,迭代次数的选择在考虑训练的损失值不断减少,但对于测试集,可能出现过拟合,所以综合考虑,避免出现过拟合
torch中的优化器
import torch
#准备数据集
x_data =torch.Tensor([[1.0],[2.0],[3.0]])
y_data = torch.Tensor([[2.0],[4.0],[6.0]])
#定义模型--模板
class LinearModel(torch.nn.Module):#继承Module模块
def __init__(self):#构造函数,初始化对象
super(LinearModel,self).__init__() #调用父类的initial,必须要有的一步
self.linear = torch.nn.Linear(1,1) #构造一个对象,Linear是Module的一个模块。nn是神经网络
def forward(self,x): #实现前馈过程中,所要执行的计算,实际上是一个override
y_pred = self.linear(x)#实现了可调用的对象,实现了w*x+b
return y_pred
#没有写backward()反馈,用Module构建的对象,自动的根据计算图,帮你去实现backward()的过程。
model = LinearModel() #实例化,可以直接被调用的即为model(x)
#构造损失函数和优化器
criterion = torch.nn.MSELoss(size_average=False)#继承nn下的Module的
optimizer = torch.optim.SGD(model.parameters(),lr=0.01)#model.parameters()是最简单的方法,无论模型多复杂,都可以把参数取出来。lr代表学习率。
#得到的optimizer对象可以知道要对哪些参数做优化,直接调用去对整个模型进行优化
#训练循环
for epoch in range(1000):
y_pred=model(x_data)#计算前馈值
loss = criterion(y_pred,y_data)#计算损失
print(epoch,loss)
optimizer.zero_grad()#梯度归零
loss.backward()#反向传播
optimizer.step()#更新
#打印权重的值
print('w=',model.linear.weight.item())
print('b=',model.linear.bias.item())
#Test Model
x_test = torch.Tensor([4.0])
y_test = model(x_test)
print('y_pred',y_test.data)