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基本操 ...
随机推荐
- 【论文阅读】HTTP 流量和恶意 URL 的异常检测
Part 1关于论文 基本信息 题目:HTTP 流量和恶意 URL 的异常检测 源码:sec2vec源代码 摘要 在本文中,我们将展示如何利用自然语言处理(NLP)中已知 的方法来检测 HTTP 请求 ...
- vscode下载
vscode下载 想下载官网可以直接去官网下载(速度超慢~) 百度网盘链接: 链接:https://pan.baidu.com/s/14DfWI5b2HA_J_kHBcu8JQw?pwd=yyds 提 ...
- ASR项目实战-后处理
本文深入探讨后处理环节. 在本环节要处理的重要特性有分词.断句.标点符号.大小写.数字等的格式归一等. 分词 和NLP.搜索等场景下的分词含义不同.对于拼音类的语言,比如英语.法语等,句子由多个单词组 ...
- 【1】从零玩转OSS阿里云存储服务之阿里云平台等操作-1-cong-ling-wan-zhuan-oss-a-li-yun-cun-chu-fu-wu-zhi-a-li-yun-ping-tai-deng-cao-zuo
title: [1]从零玩转OSS阿里云存储服务之阿里云平台等操作 date: 2021-06-09 17:21:12.037 updated: 2021-12-26 17:43:18.92 url: ...
- 【GIT-精讲】从零玩转Git-基础理论
关于版本控制 一.什么是版本控制 版本控制(Version Control Systems)版本控制(Revision control)是一种软件工程技巧 在开发的过程中,确保由不同人所编辑的同一档案 ...
- 【JVM】一文掌握JVM垃圾回收机制
作为Java程序员,除了业务逻辑以外,随着更深入的了解,都无法避免的会接触到JVM以及垃圾回收相关知识.JVM调优是一个听起来很可怕,实际上很简单的事. 感到可怕,是因为垃圾回收相关机制都在JVM的C ...
- MyBatis入门操作
MyBatis入门操作,其实是我只想验证一下instanceof是否能在xml中使用 根据官网,下面我创建一个普通Maven项目,引入依赖: <dependency> <groupI ...
- 浅谈树形DP
树形DP是动态规划中最难也最常考的内容.具有DP和图论相结合的特点. 但从本质上来说,树形DP只不过是一种线性DP,只是将它与搜索结合起来了而已. 树形DP的基本步骤 读图 树形DP的题目中,通常会给 ...
- [Python急救站]含义GUI的学生管理系统
这个管理系统是含有GUI界面的学生管理系统,比较方便. import tkinter as tk class Student: def __init__(self, name, student_id, ...
- curl使用小记(二)——远程下载一张图片
目录 1. 概述 2. 实例 3. 参考 1. 概述 在之前的文章<curl使用小记(一)>中论述了命令行工具curl的基本使用.除此之外,curl还提供了能够直接供程序调用的模块库接口l ...