当前位置: 首页 > news >正文

pytorch价格案例全解释

# 1.导入相关模块
import torch
from torch.utils.data import TensorDataset
from torch.utils.data import DataLoader
import torch.nn as nn
import torch.optim as optim
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import timefrom torchsummary import summary#  每一行代表一个样本,每一列代表一个特征  ,最后一列代表价格类别(如 0=低价、1=中价、2=高价、3=超高价)# 2.构建数据集
def create_dataset():# 使用pandas读取数据 --- 导入 Pandas,简写为 pd,用于读取 CSV 文件并处理表格数据。data = pd.read_csv('dataset/手机价格预测.csv')# 特征值和目标值  x(特征矩阵): 含义:输入特征,包含每条样本的所有特征(如手机的内存、存储、屏幕尺寸等) # 维度:2 维矩阵(DataFrame/NumPy 数组)   形状:[样本数, 特征数],例如 [1000, 20] 表示 1000 条样本,每条 20 个特征# x = data.iloc[:, :-1]:取除最后一列外的所有列 → 特征矩阵 # y  含义:目标值/类别标签,每条样本对应的价格类别(如 0=低价、1=中价、2=高价、3=超高价)# 维度:1 维向量(Series/NumPy 数组)  形状:[样本数],例如 [1000] 表示 1000 个标签值# y = data.iloc[:, -1]:取最后一列 → 标签向量x, y = data.iloc[:, :-1], data.iloc[:, -1]# 类型转换:特征值,目标值x = x.astype(np.float32)y = y.astype(np.int64)# 数据集划分 --train_test_split,用于将数据集划分为训练集和验证集(或测试集)'''使用 train_test_split 将数据随机划分为训练集和验证集:80% 数据做训练(train_size=0.8)20% 数据做验证random_state=88 固定随机种子,使划分结果可复现。'''x_train, x_valid, y_train, y_valid = train_test_split(x, y, train_size=0.8, random_state=88)# 构建数据集,转换为pytorch的形式---torch.from_numpy是PyTorch中用于将NumPy数组转换为Tensor的函数,核心特性是‌共享底层内存‌,无需数据复制。# torch.tensor(...):拷贝生成一个新的张量(与 from_numpy 略有不同)  # 将特征和标签打包  TensorDataset 内部存储: [(x1, y1), (x2, y2), (x3, y3), ...]train_dataset = TensorDataset(torch.from_numpy(x_train.values), torch.tensor(y_train.values))valid_dataset = TensorDataset(torch.from_numpy(x_valid.values), torch.tensor(y_valid.values))# 返回结果'''train_dataset:训练集 TensorDatasetvalid_dataset:验证集 TensorDatasetx_train.shape[1]:特征维度(列数),后续作为模型输入维度 input_dim   shape[0] = 行数(样本数) shape[1] = 列数(特征数)模型第一层需要知道输入特征数,才能定义 nn.Linear(input_dim, 128)len(np.unique(y)):标签中不同类别的数量,即分类数 class_num,后续作为模型输出维度 np.unique(y):返回 y 中所有不重复的值(类别)   len(...):统计类别数量  为什么作为输出维度:多分类需要输出每个类别的得分(logits),输出维度 = 类别数()例如:4 个类别 → output_dim = 4 → 最后一层 nn.Linear(256, 4) → 输出 [batch_size, 4]'''return train_dataset, valid_dataset, x_train.shape[1], len(np.unique(y))# 3.构建网络模型
class PhonePriceModel(nn.Module):def __init__(self, input_dim, output_dim):super(PhonePriceModel, self).__init__()# 1. 第一层:输入维度:20,输出维度:128self.linear1 = nn.Linear(input_dim, 128)# 2. 第二层:输入维度:128,输出维度:256self.linear2 = nn.Linear(128, 256)# 3. 第三层:输入维度:256,输出维度:4self.linear3 = nn.Linear(256, output_dim)def forward(self, x):# 前向传播过程x = torch.relu(self.linear1(x))x = torch.relu(self.linear2(x))output = self.linear3(x)# 获取数据结果return output# 4.模型训练
def train(train_dataset, input_dim, class_num, ):# 固定随机数种子 -- 设置 PyTorch 的随机数种子为 0,以保证每次运行初始化、打乱等操作结果相同(在同一环境下)。
    torch.manual_seed(0)# 初始化模型model = PhonePriceModel(input_dim, class_num)# 损失函数criterion = nn.CrossEntropyLoss()# 优化方法 --- lr=1e-3:学习率设为 0.001optimizer = optim.SGD(model.parameters(), lr=1e-3)# 训练轮数num_epoch = 50# 遍历每个轮次的数据for epoch_idx in range(num_epoch):# 初始化数据加载器dataloader = DataLoader(train_dataset, shuffle=True, batch_size=8)# 训练时间start = time.time()# 计算损失 --- 用于累积当前 epoch 中所有 batch 的损失值之和。total_loss = 0.0total_num = 1# 遍历每个batch数据进行处理 --- x:特征张量,形状大致为 [batch_size, input_dim]    y:标签张量,形状为 [batch_size]# x 是 batch 的特征,y 是 batch 的标签for x, y in dataloader:# 将数据送入网络中进行预测 --- 模型只负责前向计算,输入特征 x,输出预测 logits;标签 y 不进入模型,只用于计算损失output = model(x)# 计算损失 --- 用交叉熵损失计算当前 batch 的损失值:output:形状 [batch_size, class_num]   y:形状 [batch_size],每个元素为类别索引#得到一个标量 loss(tensor)。loss = criterion(output, y)# 梯度归零
            optimizer.zero_grad()# 反向传播  对当前损失执行反向传播,计算 loss 对每个参数的梯度,即 ∂loss/∂θ
            loss.backward()# 参数更新 --- 根据梯度和学习率,按 SGD 算法更新模型参数。
            optimizer.step()# 损失计算total_num += 1total_loss += loss.item()# 打印损失变换结果 --- 打印当前 epoch 训练信息:  epoch_idx + 1:显示为从 1 开始的轮次   # total_loss / total_num:计算平均损失,用 %.2f 保留两位小数 # time.time() - start:该 epoch 训练总耗时(秒)print('epoch: %4s loss: %.2f, time: %.2fs' % (epoch_idx + 1, total_loss / total_num, time.time() - start))# 模型保存 --- 在所有 epoch 完成后,将模型参数(state_dict)保存到 'model/phone.pth' 文件中。   后续测试时会加载这个文件进行推理。# 注意:确保 model 目录存在,否则会报错。torch.save(model.state_dict(), 'model/phone.pth')def test(valid_dataset, input_dim, class_num):# 加载模型和训练好的网络参数 --- 同样创建一个 PhonePriceModel 实例,其结构必须和训练时一致model = PhonePriceModel(input_dim, class_num)# 使用 torch.load 从文件 'model/phone.pth' 中读取已保存的模型参数     model.load_state_dict(...) 将这些参数加载到新建的 model 实例中。# 这样就得到一个和训练后状态一致的模型,用于评估。model.load_state_dict(torch.load('model/phone.pth'))# 构建加载器 --- 将验证集构建成 DataLoader   shuffle=False:验证时一般不打乱顺序。 # TensorDataset 将特征和标签打包成 (x, y) 对,DataLoader 迭代时返回该对dataloader = DataLoader(valid_dataset, batch_size=8, shuffle=False)# 评估测试集correct = 0# 遍历测试集中的数据for x, y in dataloader:# 将其送入网络中 --- 模型只负责前向计算,输入特征 x,输出预测 logits;标签 y 不进入模型,只用于计算损失output = model(x)# 获取类别结果 --- 沿 dim=1(类别维度)取最大值的索引:# output 形状为 [batch_size, class_num]# torch.argmax(..., dim=1) 得到形状 [batch_size] 的预测类别索引。# 参数: input:输入张量  dim:沿哪个维度找最大值(None 表示展平后找全局最大值)   keepdim:是否保持维度y_pred = torch.argmax(output, dim=1)# 获取预测正确的个数correct += (y_pred == y).sum()# 求预测精度print('Acc: %.5f' % (correct.item() / len(valid_dataset)))if __name__ == '__main__':# 1.获取数据train_dataset, valid_dataset, input_dim, class_num = create_dataset()print("输入特征数:", input_dim)print("分类个数:", class_num)# 2.模型实例化model = PhonePriceModel(input_dim, class_num)# 从 torchsummary 导入 summary 函数,用于打印模型结构和参数量,在 __main__ 中会用来展示网络。'''使用 torchsummary.summary 打印模型结构:函数作用:打印模型结构、每层输出形状、参数量等信息,便于检查网络设计model:要分析的模型实例input_size=(input_dim,):指定单个样本的输入形状为一维向量(元组)(长度 input_dim)  (input_dim,) 表示一维向量,长度为 input_dim batch_size=16:仅用于展示参数中使用的 batch 大小,不影响模型本身结构。这会输出每层的输出形状和参数数量,有助于检查网络设置是否合理。'''summary(model, input_size=(input_dim,), batch_size=16)# 3.模型训练# train(train_dataset, input_dim, class_num)# 4.模型预测test(valid_dataset, input_dim, class_num)

 

http://www.zskr.cn/news/65385.html

相关文章:

  • 阴道干涩什么原因?幻颜之约水光凝胶/生物蛋白凝胶与润养精华露的保湿方案
  • 五年一贯制专转本机构哪家靠谱?多维度分析与参考
  • 私护凝胶哪个牌子好?深度评测幻颜之约KY23与水光凝胶的真实功效
  • 05-自动生成设备节点的字符设备驱动
  • 内置私护益生菌管用吗?幻颜之约黑白片益生菌如何精准调理菌群
  • 幻颜之约是正规品牌吗?从研发实验室到10万级车间的品质承诺
  • 2025最新成都装修公司最新top5实力榜!装修/整装/家装/全包装修/房屋装修,全案定制,行业数据、市场口碑及选择指南
  • 广州诚信的展会大巴出租公司推荐排行榜单? 展会大巴出租品牌 展会大巴出租公司 展会大巴出租服务商 展会大巴出租平台 展会大巴出租渠道
  • 比较好的少儿训练供应商推荐排行榜单?少儿训练供应商 少儿训练代理商 少儿训练代理 少儿训练渠道商 少儿训练渠道 少儿训练品牌代理商 少儿训练系统代理商
  • 靠谱的城际网约车公司推荐排行榜单? 城际网约车品牌 城际网约车公司 城际网约车服务商 城际网约车渠道
  • 2025年低压电缆厂权威推荐榜单:中压电缆/防火电缆/电线电缆源头厂家精选
  • 深入解析:Spring Boot常见问题
  • 渲染管线
  • Xbox Video Player Kodi All In One
  • 比较好的空间品牌设计服务商推荐排行榜单?空间品牌设计服务商 空间品牌设计品牌 空间品牌设计公司 空间品牌设计服务商 空间品牌设计平台 空间品牌设计渠道
  • 办公室装修公司推荐:行业优质服务团队解析
  • 市面上符合越南标准防火卷帘门厂家排名有哪些
  • 2025年新疆高三艺术补习班学校权威推荐榜单:新建高三艺术集训班/新疆高三复读学校/新疆高三艺术学校精选
  • 可靠的雨棚品牌哪家靠谱?雨棚品牌 雨棚公司 雨棚产品 雨棚供应厂家 雨棚工厂 雨棚厂家 雨棚生产厂家 雨棚源头厂家
  • FFmpeg开发笔记(八十九)基于FFmpeg的直播视频录制工具StreamCap
  • 2025年11月湖南长沙数字营销 /企业自媒体线上代运营/全域运营/GEO/搜荐服务/AI搜索/抖音推广自媒体运营公司推荐榜单及选择指南
  • 市面上靠谱的瑜伽垫品牌推荐排行榜单?瑜伽垫品牌 瑜伽垫公司 瑜伽垫供应厂家 瑜伽垫工厂 瑜伽垫厂家 瑜伽垫生产厂家 瑜伽垫源头厂家 瑜伽垫供应商 瑜伽垫销售厂家
  • 行业内靠谱的AI营销公司有哪些?AI营销公司 AI营销公司品牌 AI营销公司产品 AI营销公司服务商 AI营销公司渠道 AI营销公司机构
  • 保湿滋润天花板!2025身体乳榜单揭晓,干皮救星终结皮肤干燥且止痒
  • 7款抖音保存视频去除抖音印记工具实测:免费无广谁称王?
  • 市面上两导轨数控车床供应商口碑推荐榜单?两导轨数控车床供应商 两导轨数控车床销售厂家 两导轨数控车床制造商 两导轨数控车床加工厂 两导轨数控车床优质厂家 两导轨数控车床实力厂家
  • 2025美白护肤品用什么好?权威榜单请查收
  • 实测10款快手怎么免费去水印工具:免费无广谁称王?
  • 工业级MOS管并联应用与可靠性设计深度解析-ASIM阿赛姆
  • 中医师承选哪个机构靠谱?——在杭州做了三个月功课后的真实对比结论