aspnet网站开发模板,百度网址名称是什么,优设,wordpress适合做商城吗目录
库函数导入
一、构建数据集 二、构建分类网络模型
三、编写训练函数
四、编写评估函数
五、网络性能调优 鲍勃开了自己的手机公司。他想与苹果、三星等大公司展开硬仗。 他不知道如何估算自己公司生产的手机的价格。在这个竞争激烈的手机市场#xff0c;你不能简单地…目录
库函数导入
一、构建数据集 二、构建分类网络模型
三、编写训练函数
四、编写评估函数
五、网络性能调优 鲍勃开了自己的手机公司。他想与苹果、三星等大公司展开硬仗。 他不知道如何估算自己公司生产的手机的价格。在这个竞争激烈的手机市场你不能简单地假设事情。为了解决这个问题他收集了各个公司的手机销售数据。
鲍勃想找出手机的特性(例如:RAM、内存等)和售价之间的关系。但他不太擅长机器学习。所以他需要你帮他解决这个问题。 在这个问题中你不需要预测实际价格而是要预测一个价格区间表明价格多高。
需要注意的是: 在这个问题中我们不需要预测实际价格而是一个价格范围它的范围使用 0、1、2、3 来表示所以该问题也是一个分类问题。
数据说明手机价格分类_数据集-阿里云天池 Mobile Price Classification
库函数导入
import torch
import torch.nn as nn
import pandas as pd
from sklearn.model_selection import train_test_split
from torch.utils.data import import Dataset,DataLoader,TensorDataset
from sklearn.preprocessing import StandardScaler
import time
一、构建数据集
数据共有 2000 条, 其中 1600 条数据作为训练集, 400 条数据用作测试集。 我们使用 sklearn 的数据集划分工作来完成。并使用 PyTorch 的 TensorDataset 来将数据集构建为 Dataset 对象方便构造数据集加载对象。
构建数据
def phone_data_set(path):# 加载本地数据文件data pd.read_csv(path)# 抽离特征和目标数据x data.iloc[:,:-1]y data.iloc[:,-1]# 标准化transfer StanderdScaler()x transfer.fit_transform(x.values)x torch.tensor(x,dtypetorch.float32)y torch.tensor(y.values,dtypetorch.int64) # 输出是分类结果所以用整型# 数据集划分x_trian,x_test,y_train,y_test train_test_split(x,y,test_size0.2,random_state42,stratifyy)return x_trian,x_test,y_train,y_testclass my_phone_data_loader(Dataset):
# TensorDataset 可取代该类的作用def __init__(self,x,y):self.x xself.y ydef __len__(self):return len(self.x)def __getitem__(self, index):return self.x[index],self.y[index]def data_loader(x_trian,y_train,batch_size16):# datamy_phone_data_loader(x_train,y_train)data TensorDataset(x_train,y_trian)data_loader DataLoader(data,batch_sizebatch_size,shuffleTrue)return data_loader 二、构建分类网络模型
构建用于手机价格分类的模型叫做全连接神经网络。它主要由数个线性层来构建在每个线性层后还需使用激活函数。
模型 构建和初始化参数
class Net(torch.nn.Module):def __init__(self,input_features,out_features):super(Net,self).__init__()# 隐藏层 LeakyReLU 激活和输出层 Softmax 激活self.hide1 nn.Sequential(nn.Linear(input_features,128),nn.LeakyReLU())self.hide2 nn.Sequential(nn.Linear(128,256),nn.LeakyReLU())self.hide3 nn.Sequential(nn.Linear(256,512),nn.LeakyReLU())self.hide4 nn.Sequential(nn.Linear(512,128),nn.LeakyReLU())self.out nn.Sequential(nn.Linear(128,out_features),nn.Softmax())self.initdata()def forward(self,input_data):# 前向传播x self.hide1(iput_data)xself.hide2(x)xself.hide3(x)xself.hide4(x)y_predself.out(x)return y_pred#分类结果,混淆矩阵 [[0.9,0.01,.02,.7],[...],...]def initdata(self):# 权重He初始化nn.init.kaiming_uniform_(self.hide1[0].weight,nonlinearityleaky_relu)nn.init.kaiming_uniform_(self.hide2[0].weight,nonlinearityleaky_relu)nn.init.kaiming_uniform_(self.hide3[0].weight,nonlinearityleaky_relu)nn.init.kaiming_uniform_(self.hide4[0].weight,nonlinearityleaky_relu)
三、编写训练函数
网络编写完成之后我们需要编写训练函数。所谓的训练函数指的是输入数据读取、送入网络、计算损失、更新参数的流程该流程较为固定。我们使用的是多分类交叉生损失函数、使用 SGD 优化方法。最终将训练好的模型持久化到磁盘中。
训练数据
# 加载数据
x_train,x_test,y_trian,y_testphone_data_set(./data/手机价格预测.csv)
def train():data_loader_data_loader(x_train,y_trian)# 模型生成x_featuresx_train.shape[1]y_featurestorch.unique(y_trian).shape[0]# 输出特征(类别的数量)modelNet(x_features,y_features)# 初始化模型参数# 默认是初始化过的torch.nn.init.kaiming_uniform_(model.linear1.weight,nonlinearityleaky_relu)torch.nn.init.kaiming_uniform_(model.linear2.weight,nonlinearityleaky_relu) # 3.损失函数loss_fntorch.nn.CrossEntropyLoss()#torch.nn.MSELoss()#虽然分类的结果也可以用均方误差来计算但是一般用交叉熵(因为计算出来的梯度更大)# 4.优化器optimtorch.optim.Adam(model.parameters(),lr1e-4)# 定义训练参数epoch100for i in range(epoch):e0count0start_timetime.time()for x,y in data_loader_:count1# 生成预测值y_predmodel(x)#执行model对象的forward# 损失计算lossloss_fn(y_pred,y)eloss# 梯度清零optim.zero_grad()# 反向传播loss.backward()# 更新参数optim.step()end_timetime.time()print(fepoch:{i},loss:{e/count},time:{end_time-start_time}) # 保存模型参数# model.linear1.weight.datatorch.save(model.state_dict(),./model/model.pth)四、编写评估函数
评估函数、也叫预测函数、推理函数主要使用训练好的模型对未知的样本的进行预测的过程。这里使用前面单独划分出来的测试集来进行评估。
评估函数
def test():# 加载数据data_loader_data_loader(x_test,y_test,batch_size16)# data_loader_DataLoader(data,batch_size4,shuffleTrue)# 加载模型# 模型生成x_test_featuresx_test.shape[1]y_test_featurestorch.unique(y_test).shape[0]# 类别数modelNet(x_test_features,y_test_features)# model.linear1.weightmodel.linear1.weight.datastate_dicttorch.load(./model/model.pth,map_locationcpu)model.load_state_dict(state_dict)total0for x,y in data_loader_:y_predmodel(x)#[0.4,0.3,0.1,0.1,0.1]y_predtorch.argmax(y_pred,dim1)# print(y,y)# print(y_pred,y_pred)totaltorch.sum(y_predy)print(f精准度:{total/len(x_test)})
五、网络性能调优
可以通过以下方面对模型进行调优 对输入数据进行标准化 调整优化方法 调整学习率 增加批量归一化层 增加网络层数、神经元个数 增加训练轮数