目录
1.模块
模块本身是一个类(nn.Module)
class model1(nn.Module):
def __init__(self,....): ...传入参数
super(model1,self).__init__()
def forward(self,...):
return ...
简单线性回归类
class linearmodel(nn.Module):
def__init__(self,ndim):
supper(linearmodel,self).__init__()
self.ndim=ndim
self.weight=nn.Parameter(torch.randn(ndim,1))
self.bias=nn.Parameter(torch.randn(1))
def forward(self,x):
return x.mm(self.weight)+self.bias
损失函数和优化器
(1)损失函数
函数形式、模块形式
函数形式:torch.nn.functional库中的函数 处于神经网络预测值和目标值来计算损失函数
模块形式:torch.nn库中的模块,新建一个模块的实例,跳过调用模块的方法来计算最终的损失函数。
回归:torch.nn.MSELoss
简单示例:
boston=load_boston() #data
lm=Linearmodel(13) #model
creterion=nn.MSELoss() #loss function
optim=torch.optim.SGD(lm.parameters(),lr=1e-6) #定义优化器
data=torch.tensor(boston['data'],requires_grad=True) #输入的数据,设置为True,实现前向传播和后向传播
target=torch.tensor(boston['target'],dtype=torch.float32)
for step in range(1000):
predict=lm(data)
loss=creterion(predict,target)
if step and step %1000 ==0:
print("loss:{:.3f}".format(loss.item()))
optim.zero_gard() # 清零梯度
loss.backward() # 反向传播
lenet 网络训练和测试代码
#一个迭代期的训练过程
model=lenet() #定义一个模型
model.train() #模型切换到训练状态
lr=0.01 # 定义学习率
creterion=nn.CrossEntropyLoss() #定义损失函数
optimizer=optim.SGD(model.parameters(),lr=lr,....) #定义优化器
train_loss=0
correct=0
total=0
for batch_idx,(inputs,targets) in enumerate(data_train_loader):
optimizer.zero_grad()
outputs=model(inputs)
loss=creterion(outputs,targets)
loss.backward()
optimizer.step()
train_loss += loss.item()
_,predicted=outputs.max(1)
total += predicted.eq(targets).sum().item()
print(batch_idx,len(train_loader),'loss:%.3f|acc : %.3f(%d/%/d)'
%(trin_loss/(batch_idx+1),100*correct/total,correct,total))