手机网站制作平台免费,辽阳微网站建设,蜜淘app在那个网站做的,网站建设兆金手指排名系列文章目录 文章目录 系列文章目录建模过程一、数据输入二、网络搭建三、定义损失函数四、定义优化器五、训练与测试1. 训练2. 损失函数3.测试4.模型生成与调用 建模过程 就像机器学习一样#xff0c;我们建模分为#xff1a;数据处理#xff0c;网络搭建#xff0c;损失…系列文章目录 文章目录 系列文章目录建模过程一、数据输入二、网络搭建三、定义损失函数四、定义优化器五、训练与测试1. 训练2. 损失函数3.测试4.模型生成与调用 建模过程 就像机器学习一样我们建模分为数据处理网络搭建损失函数定义、优化、训练。下面我们将逐一用代码实战讲解为了减少代码冗余大家把代码按照顺序复制就能实现。至于数据集点击大家自取。
一、数据输入
代码
import torch
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 一、读入数据
# 1. 加载数据
data pd.read_csv(boston.csv)
X data.iloc[:, :-1] # 所有列除最后一列作为特征
y data.iloc[:, -1] # 最后一列作为目标值# 3. 划分数据集保持类别分布
X_train, X_test, y_train, y_test train_test_split(X,y,test_size0.2, # 测试集占20%random_state42, # 固定随机种子stratifyy if len(y.unique())10 else None # 分类问题才分层
)# 4. 验证划分结果
print(f训练集形状: {X_train.shape}, 测试集形状: {X_test.shape})
print(f训练集目标分布:\n{pd.Series(y_train).value_counts(normalizeTrue)})
print(f测试集目标分布:\n{pd.Series(y_test).value_counts(normalizeTrue)})这是代码的第一个模块进行数据处理这个可以作为一个通用的模板。过程氛围三个 使用 pandas 读入数据划分特征 X ,和分类或者回归数值 y划分训练集和测试集 二、网络搭建
代码
class Net(torch.nn.Module):def __init__(self,n_feature,n_output): # 初始化参数super(Net, self).__init__() # super 继承父类方便使用其中的函数self.predict torch.nn.Linear(n_feature, n_output) # 定义predict,一个线性函数也就是回归模型# 前向传播def forward(self, x):out self.predict(x) # 计算结果return out# 初始化网络第一个是特征的数量第二个是输出类型的数量
net Net(13,1)定义网络只有一个隐藏层的神经网络线性关系.需要初始化参数传入的特征数目和输出值的数目。继承父类是为了方便使用其中的方法预测向前计算的核心就是 self.predict 这句前向传播就调用这个方法然后返回结果。net Net(13,1) 初始化调用网络。
三、定义损失函数
# 三、定义损失函数,均方误差的损失函数
loss_func torch.nn.MSELoss()说是定义损失函数我们一般研究搭建什么样的网络损失函数一般根据自己的实际情况进行选择。此处我们选择均方误差的损失函数
四、定义优化器
# 四、定义优化器
optimizer torch.optim.SGD(net.parameters(),lr0.01)优化器采用随机梯度下降算法,具体还是根据自己的情况选择。
五、训练与测试
1. 训练
# 五、训练过程 1000次
for i in range(1000):x_data torch.tensor(X_train.values,dtypetorch.float32) # 把numpy 转化成 Tensory_data torch.tensor(Y_train.values,dtypetorch.float32)# 获取predict注意在线性模式中二维的输出计算loss必须进行维度统一。pred net.forward(x_data)pred torch.squeeze(pred)# 计算损失函数loss loss_func(pred, y_data) * 0.001# 调用优化器# st1. 把梯度归零optimizer.zero_grad()# 反向传播优化参数loss.backward()# 优化好的参数进行网络更新optimizer.step()# 打印得带次数和lossprint(item:{},loss:{}\n.format(i,loss))print(预测的前十个值\n,pred[0:10])print(真实值\n,y_data[0:10])训练的过程很有说法。我们开始读入的数据是 numpy 格式或者是pandas中的格式pytorch 并不能使用我们需要把输入数据转化到可训练的 tensor 类型。然后调用前向传播 forward 进行计算注意这里的维度可能变成二维的输出会与下一步计算损失函数 loss 发生维度不匹配因此需要降维。一般而言维度是两个一维的数据计算 loss。
2. 损失函数 计算损失函数还要设计到优化问题步骤如下 初步前向传播获得输出维度统一计算损失函数。optimizer.zero_grad()选择优化函数梯度归零。后向传播。loss.backward()优化器更新参数.optimizer.step() 我们把训练的损失函数的值以及前十个预测数据打印出来和标准数据对比如图 图 1 训练结果 从结果中可以看出我们的预测值与真实值之间的差异很大这种情况叫做欠拟合。为了解决这种方法通常采取 加大迭代次数1000 次改成10000次.减少学习率减小 loss,真实的loss还需要乘以相应的倍数还原用于作图可视化。 3.测试 x_data torch.tensor(X_test.values,dtypetorch.float32) # 把numpy 转化成 Tensory_data torch.tensor(Y_test.values,dtypetorch.float32)# 获取predict注意在线性模式中二维的输出计算loss必须进行维度统一。pred net.forward(x_data)pred torch.squeeze(pred)# 计算损失函数loss loss_func(pred, y_data) * 0.001# 打印得带次数和lossprint(item:{},loss:{}\n.format(i,loss))测试和训练差不多数据 tensor 化使用训练集的数据。模型的数据已经生成所以只需要前向传播生成预测数据就行。为了评价预测结果的稳定性和精准性还需要调用损失函数loss来预测在此之前少不了统一维度这一步骤。
4.模型生成与调用
保存模型
# 保存模型
# 方法一全部保存
torch.save(net,model/model.pkl)
# # 使用
# torch.load(model/model)
#
# # 第二种方法,只保存参数
# torch.save(net.state_dict(),params.pkl)
# # 调用前需要定义网络结构
# torch.load_state_dict(torch.load(params.pkl))第一个方法保存的内容要丰富一点保存了网络的结构第二个方法仅仅保存了训练好模型的参数。保存模型的文件夹路径一定要存在并且正确。
调用模型
import torch
import numpy as np
import pandas as pd
import refrom sklearn.model_selection import train_test_splitclass Net(torch.nn.Module):def __init__(self,n_feature,n_output): # 初始化参数super(Net, self).__init__() # super 继承父类方便使用其中的函数# 你可以多调用两层每层计算之后都处理一下。self.predict torch.nn.Linear(n_feature, n_output) # 定义predict,一个线性函数也就是回归模型# 前向传播def forward(self, x):out self.predict(x) # 计算结果return out# 初始化网络第一个是特征的数量第二个是输出类型的数量# 第一步 解析数据
data pd.read_csv(../boston.csv)
X data.iloc[:, :-1] # 所有列除最后一列作为特征
Y data.iloc[:, -1] # 最后一列作为目标值X_column data.shape[1] - 1
Y_column 1
print(x 和 y 的列数,X_column,Y_column)# 3. 划分数据集保持类别分布
X_train, X_test, Y_train, Y_test train_test_split(X,Y,test_size0.2, # 测试集占20%random_state42, # 固定随机种子stratifyY if len(Y.unique())10 else None # 分类问题才分层
)# 第二步加载模型
net torch.load(model.pkl)
# 第三步损失函数
loss_functorch.nn.MSELoss()# 测试的过程直接复制训练的过程
x_data torch.tensor(X_test.values,dtypetorch.float32) # 把numpy 转化成 Tensor
y_data torch.tensor(Y_test.values,dtypetorch.float32)
# 获取predict注意在线性模式中二维的输出计算loss必须进行维度统一。
pred net.forward(x_data)
pred torch.squeeze(pred)
# 计算损失函数
loss_test loss_func(pred, y_data) * 0.001
# 优化好的参数进行网络更新
print(loss:{}\n.format(loss_test))
此处采用第一种方法调用模型的步骤 定义该网络结构不用初始化网络。使用numpy 和 pandas 读入数据进行数据预处理方式很多收集模板就行。加载模型 net torch.load(model.pkl) ,文件路径要正确。定义损失函数测试 我们发现调用模型就是直接预测省去了训练的过程。因为我们训练的过程就是为了调整参数保存的模型就已经把训练好的参数保存下来直接调用就行。我们这里的数据太少只有 500 多条远远不够但作为一个学习的例子却是一个好实例。 最后现在电商太卷了PDD平台又不给我推流希望大家看完觉得有帮助帮我进店看看点击可能需要登录PDD万分感谢