- A.模型的定义,(举例:定义线性回归模型)
- B.指定迭代参数,学习率和损失函数
- C.进行模型的训练
- D.模型保存
- E.模型加载和使用
- F.完整代码
首先我们要清楚在开发pytorch深度学习的时候,要进行的以下几步,
重要的是要清楚其背后的数学原理,至少要了解
主要分为以下几个步骤: A.模型的定义,(举例:定义线性回归模型)
首先继承nn.Module(),其次我们要声明神经网络用到的层,然后定义层与层之间的关系
关于模型定义,其实主要是进行层的声明,以及层与层关系之间的定义,距离是一个简单的线性回归的全链接模型,距离理解可以看注释
''' **注释部分:** 因为这个层实现的功能是:y=weights*sqrt(x2+bias),所以有两个参数: 权值矩阵weights 偏置矩阵bias 输入 x 的维度是(in_features,) 输出 y 的维度是(out_features,) 故而 bias 的维度是(in_fearures,),注意这里为什么是in_features,而不是out_features,注意体会这里和Linear层的区别所在 weights 的维度是(in_features, out_features)注意这里为什么是(in_features, out_features),而不是(out_features, in_features),注意体会这里和Linear层的区别所在 ''' class LinearRegression(nn.Module):#通过继承nn.Module,来获取父类的一些特性,同时实现父类的方法,其中两个重要的方法是__init__()和forward(),当然还有其他方法功能,可以看我另外一篇文章 def __init__(self): super(LinearRegression, self).__init__() self.linear = nn.Linear(in_features=1, out_features=1) def forward(self, x): out = self.linear(x) return outB.指定迭代参数,学习率和损失函数
epochs=1000#训练次数 learning_rate=0.01 #学习率 optimizer=torch.optim.SGD(model,parameters(),lr=learning_rate)#采用SGD优化器,优化谁呢把参数传递进去 criterion = nn.MSELoss()#指定损失函数,分类任务用交叉熵,回归任务用MSE损失函数C.进行模型的训练
for epoch in range(epochs): epoch += 1 #每一次梯度要进行清零 optimizer.zero_grad() #向前传播,传播后的值不一定准确 outputs = model(x_train) #计算损失值 loss = criterion(outputs, y_train) #反向传播 loss.backward() #权重更新 optimizer.step() if epoch % 50 == 0: print(epoch) print(loss.item()) plt.scatter(x_trainData, y_trainData, c="r") plt.plot(x_train.data.numpy(), outputs.data.numpy()) plt.show()D.模型保存
直接将训练好的模型类进行保存
torch.save(model.state_dict(), "./Liner.pth")#模型保存 model.load_state_dict(torch.load("./Liner.pth"))#模型加载E.模型加载和使用
首先我们要考虑,是将模型加载到哪个神经网络里,所以我们要建立一个和模型一样的神经网络
class LinearRegression(nn.Module):#实际这里通过import导入在模型训练时候搭建的神经网络模型也是可以的,也可以不用重新写这个类 def __init__(self): super(LinearRegression, self).__init__() self.linear = nn.Linear(in_features=1, out_features=1) def forward(self, x): out = self.linear(x) return out
然后我们进行神经网络实例的生成,然后进行模型加载
pre_model= LinearRegression()#实例生成 pre_model.load_state_dict(torch.load("./Liner.pth"))#模型加载 y = pre_model.forward(torch.from_numpy(x_trainData))#前向传播,预测值 plt.scatter(x_trainData, y.data.numpy(), color="r")#绘制数据点 plt.show()#现实数据F.完整代码
1.神经网络的搭建和模型训练以及模型保存
import torch from torch import nn,optim from torch.autograd import Variable import numpy as np import matplotlib.pyplot as plt x_trainData = np.array([[3.3], [4.4], [5.5], [6.71], [6.93], [4.168], [9.779], [6.182], [7.59], [2.167], [7.042], [10.791], [5.313], [7.997], [3.1]],dtype=np.float32) y_trainData = np.array([[1.7], [2.76], [2.09], [3.19], [1.694], [1.573], [3.366], [2.596], [2.53], [1.221], [2.827], [3.465], [1.65], [2.904], [1.3]], dtype=np.float32) x_train = torch.from_numpy(x_trainData) y_train = torch.from_numpy(y_trainData) class LinearRegression(nn.Module): def __init__(self): super(LinearRegression, self).__init__() self.linear = nn.Linear(in_features=1, out_features=1) def forward(self, x): out = self.linear(x) return out model = LinearRegression() epochs = 10000 leaning_rate = 0.01 optimizer = torch.optim.SGD(model.parameters(), lr=leaning_rate) criterion = nn.MSELoss() for epoch in range(epochs): epoch += 1 optimizer.zero_grad() outputs = model(x_train) loss = criterion(outputs, y_train) loss.backward() optimizer.step() if epoch % 50 == 0: print(epoch) print(loss.item()) plt.scatter(x_trainData, y_trainData, c="r") plt.plot(x_train.data.numpy(), outputs.data.numpy()) plt.show() # predicted = model(x_train.requires_grad()).data.numpy() torch.save(model.state_dict(), "./Liner.pth") #model.load_state_dict(torch.load("./Liner.pth"))
2.神经网络的搭建和模型加载,前向传播数据的预测
import torch from torch import nn import numpy as np import matplotlib.pyplot as plt x_trainData = np.array([[3.3], [4.4], [5.5], [6.71], [6.93], [4.168], [9.779], [6.182], [7.59], [2.167], [7.042], [10.791], [5.313], [7.997], [3.1]],dtype=np.float32) class LinearRegression(nn.Module): def __init__(self): super(LinearRegression, self).__init__() self.linear = nn.Linear(in_features=1, out_features=1) def forward(self, x): out = self.linear(x) return out pre_model= LinearRegression() pre_model.load_state_dict(torch.load("./Liner.pth")) y = pre_model.forward(torch.from_numpy(x_trainData)) plt.scatter(x_trainData, y.data.numpy(), color="r") plt.show()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)