python · pytorch | NN 训练常用代码存档
1 pandas 读 csv
import torch
from torch import nn
import numpy as np
import pandas as pd
from copy import deepcopy
device = "cuda" if torch.cuda.is_available() else "cpu"
# 读 csv
data_all = pd.read_csv('./CFD_data/record_data0.csv')
# 提取某一列
colume = np.array(data_all[['colume_name']], dtype=np.float32).reshape(-1, 1)
# 提取某一个值
value = data[data['食物种类']=='主食']['卡路里'].item()
# 数据操作
c = np.concatenate([a[1:], b[:-1]], axis=1)
c = torch.cat([a, b], axis=1)
# 存 csv
c.to_csv('./CFD_data/flow_rate.csv', index=False)
2 NN 的搭建、训练与评估
搭建:使用 nn.Sequential 。
# model
NN_model = nn.Sequential(
nn.Linear(6, 256),
nn.ReLU(),
nn.Linear(256, 256),
nn.ReLU(),
nn.Linear(256, 256),
nn.ReLU(),
nn.Linear(256, 1),
)
# 优化器
optimizer = torch.optim.Adam(NN_model.parameters(), lr=0.001)
训练:
def NN_train(train_x, train_y, model, loss_fn, optimizer, epoches, batch_size, save_path):
"""
训练网络
输入:
train_x, train_y: 训练集
model: 网络模型
loss_fn: 损失函数
optimizer: 优化器
epoches: epoches 个数
batch_size: mini batch 大小
save_path: 模型保存路径
"""
# 切换到train模式
model.train()
losses = []
for epoch in range(epoches):
batch_loss = []
for start in range(0, len(train_x), batch_size): # mini batch
end = start + batch_size if start + batch_size < len(train_x) else len(train_x)
xx = torch.tensor(train_x[start:end], dtype=torch.float, requires_grad=True)
yy = torch.tensor(train_y[start:end], dtype=torch.float, requires_grad=True)
xx, yy = xx.to(device), yy.to(device) # 加载到 device
pred = model(xx) # 输入数据到模型里得到输出
loss = loss_fn(pred, yy) # 计算输出和标签的 loss
optimizer.zero_grad() # 清零
loss.backward() # 反向推导
optimizer.step() # 步进优化器
batch_loss.append(loss.data.numpy())
if epoch % max(1, epoches//8) == 0:
print(f"Training Error in epoch {epoch}: {np.mean(batch_loss):>8f}")
torch.save(model.state_dict(), save_path) # 保存模型
测试:
def NN_test(test_x, test_y, model, save_path, loss_fn):
"""
测试网络
输入:
test_x, test_y: 测试集
model: 网络模型
loss_fn: 损失函数
save_path: 模型保存路径
"""
model.load_state_dict(torch.load(save_path)) # 加载模型
model.eval() # 切换到测试模型
MSE_loss_fn = nn.MSELoss() # MSE loss function
test_loss, MSE = 0, 0 # 记录 loss 和 MSE
# 梯度截断
with torch.no_grad():
test_x, test_y = torch.tensor(test_x).to(device), torch.tensor(test_y).to(device) # 加载到 device
pred = model(test_x) # 输入数据到模型里得到输出
test_loss = loss_fn(pred, test_y).item() # 计算输出和标签的 loss
MSE = MSE_loss_fn(pred, test_y).item() # MSE
print(f"Test Error: \n Avg loss: {test_loss:>8f}, MSE: {MSE:>8f}\n")
print(f"Test Result: \n Prediction: {pred[:5]}, \n Y: {test_y[:5]}, \n diff: {test_y[:5]-pred[:5]}\n")
测试 ensemble model(平均值):
def NN_test_ensemble(test_x, test_y, loaded_model_list, loss_fn):
for model in loaded_model_list:
model.eval() # 切换到测试模型
MSE_loss_fn = nn.MSELoss() # MSE loss function
test_loss, MSE = 0, 0 # 记录 loss 和 MSE
# 梯度截断
with torch.no_grad():
test_x, test_y = torch.tensor(test_x).to(device), torch.tensor(test_y).to(device) # 加载到 device
pred = torch.zeros(test_y.shape)
for model in loaded_model_list:
pred += model(test_x) # 输入数据到模型里得到输出
pred /= len(loaded_model_list)
test_loss = loss_fn(pred, test_y).item() # 计算输出和标签的 loss
MSE = MSE_loss_fn(pred, test_y).item() # MSE
print(f"Test Error: \n Avg loss: {test_loss:>8f}, MSE: {MSE:>8f}\n")
print(f"Test Result: \n Prediction: {pred[:5]}, \n Y: {test_y[:5]}, \n diff: {test_y[:5]-pred[:5]}\n")
打印梯度,debug:
for name, param in model.named_parameters():
print(name, param.grad)
python · pytorch | NN 训练常用代码存档的更多相关文章
- PyTorch常用代码段整理合集
PyTorch常用代码段整理合集 转自:知乎 作者:张皓 众所周知,程序猿在写代码时通常会在网上搜索大量资料,其中大部分是代码段.然而,这项工作常常令人心累身疲,耗费大量时间.所以,今天小编转载了知乎 ...
- PyTorch 常用代码段整理
基础配置 检查 PyTorch 版本 torch.__version__ # PyTorch version torch.version.cuda ...
- 【转载】GitHub 标星 1.2w+,超全 Python 常用代码合集,值得收藏!
本文转自逆袭的二胖,作者二胖 今天给大家介绍一个由一个国外小哥用好几年时间维护的 Python 代码合集.简单来说就是,这个程序员小哥在几年前开始保存自己写过的 Python 代码,同时把一些自己比较 ...
- Pytorch之训练器设置
Pytorch之训练器设置 引言 深度学习训练的时候有很多技巧, 但是实际用起来效果如何, 还是得亲自尝试. 这里记录了一些个人尝试不同技巧的代码. tensorboardX 说起tensorflow ...
- Python机器学习笔记:常用评估指标的用法
在机器学习中,性能指标(Metrics)是衡量一个模型好坏的关键,通过衡量模型输出y_predict和y_true之间的某种“距离”得出的. 对学习器的泛化性能进行评估,不仅需要有效可行的试验估计方法 ...
- Python实现NN(神经网络)
Python实现NN(神经网络) 参考自Github开源代码:https://github.com/dennybritz/nn-from-scratch 运行环境 Pyhton3 numpy(科学计算 ...
- python爬虫:一些常用的爬虫技巧
python爬虫:一些常用的爬虫技巧 1.基本抓取网页 get方法: post方法: 2.使用代理IP 在开发爬虫过程中经常会遇到IP被封掉的情况,这时就需要用到代理IP; 在urllib2包中有Pr ...
- NSIS常用代码整理
原文 NSIS常用代码整理 这是一些常用的NSIS代码,少轻狂特意整理出来,方便大家随时查看使用.不定期更新哦~~~ 1 ;获取操作系统盘符 2 ReadEnvStr $R0 SYSTEMDRIVE ...
- 第六章:Python基础の反射与常用模块解密
本课主题 反射 Mapping 介绍和操作实战 模块介绍和操作实战 random 模块 time 和 datetime 模块 logging 模块 sys 模块 os 模块 hashlib 模块 re ...
- Python SQLAlchemy基本操作和常用技巧包含大量实例,非常好python
http://www.makaidong.com/%E8%84%9A%E6%9C%AC%E4%B9%8B%E5%AE%B6/28053.shtml "Python SQLAlchemy基本操 ...
随机推荐
- linux 上安装kapacitor
转载请注明出处: 1.通过安装包安装 1.使用以下命令下载安装包: wget https://dl.influxdata.com/kapacitor/releases/kapacitor_1.6.3- ...
- 新手友好、轻量级的C#/.NET万能工具库
前言 今天分享一个基于MIT License协议开源.免费.新手友好.轻量级的C#/.NET万能工具库.帮助类库(支持.NET和.NET Core,可以帮助开发者们减少常见重复功能方法查找,提高开发工 ...
- 华企盾DSC苹果电脑右键菜单不显示问题
1.检查认证的用户是否给了对应的权限(如:手动加密.手动解密.申请解密) 2.系统偏好设置--键盘--快捷键中开通的权限是否有勾选 3.系统服务中允许的菜单数超出了最大值
- C# 获取另一程序控件,改变值,触发事件
[DllImport("User32.dll", EntryPoint = "FindWindow")]private static extern IntPtr ...
- 从零玩转Nginx
01[熟悉]实际开发中的问题? 现在我们一个项目跑在一个tomcat里面 当一个tomcat无法支持高的并发量时.可以使用多个tomcat 那么这多个tomcat如何云分配请求 |-nginx 02[ ...
- STM32CubeMX教程3 GPIO输入 - 按键响应
1.准备材料 开发板(STM32F407G-DISC1) ST-LINK/V2驱动 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) 2 ...
- Android 蓝牙使用
原文地址: Android 蓝牙使用 - Stars-One的杂货小窝 公司项目需求需要实现监听蓝牙耳机连接,且要获取蓝牙耳机电量功能,翻了不少官方文档,记录下技术调研代码 注:本文没有研究蓝牙配对功 ...
- Luogu P1298 最接近的分数 做题记录
算是水紫,不过也学到一些有用的东西. 题意 给定正小数 \(N\).求分子不大于 \(n\),分母不大于 \(m\) 的分数 \(\dfrac{n}{m}\),使得 \(\dfrac{n}{m}\) ...
- 斯坦福 UE4 C++ ActionRoguelike游戏实例教程 07.在C++中使用UMG
斯坦福 UE4 C++ ActionRoguelike游戏实例教程 07.在C++中使用UMG 斯坦福课程 UE4 C++ ActionRoguelike游戏实例教程 0.绪论 概述 本篇文章的目标是 ...
- 文心一言 VS 讯飞星火 VS chatgpt (49)-- 算法导论6.2 1题
一.参照图6-2的方法,说明 MAX-HEAPIFY(A,3)在数组 A=(27,17,3,16,13,10,1,5,7,12,4,8,9,0)上的操作过程. 文心一言: 下面是 MAX-HEAPIF ...