热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一个最基本的RNN训练框架用于多元回归(基于pytorch)

0.摘要本文主要描述如何搭建一个RNN的基本训练架构.主要从如何读取CSV文件中的数据,构建数据管道.如何搭建模型,如何在主函数中开启训练.未完,待更新
0. 摘要

本文主要描述如何搭建一个RNN的基本训练架构.主要从如何读取CSV文件中的数据,构建数据管道. 如何搭建模型,如何在主函数中开启训练.

未完,待更新

1. RNN的基础知识

一个最简单的RNN结构展开图, X(t)表示循环神经网络在时刻t的输入,H是循环神经网络的主体结构,循环的过程就是H被不断执行的过程.O(t)代表t时刻循环神经网路的输出.

简单描述一下具体的过程:

在t时刻,H会读取输入层的输入x(t),并输出一个值O(t),同时H的状态值会从当前步传递到下一步.

也就是讲:H的输入除了来自输入层的输入x(t),还依赖于上一时刻的H(t-1).

一般情况下,输入层的x为下图所示:

为了研究方便,下文的叙述令in_putsize = 1.下面使用

2. 一个RNN小实验

2.1 数据集准备

链接:https://pan.baidu.com/s/1HorFNE5mlDgAvFXU6_JXfQ
提取码:x521
train_data: 里面包含6列数据, 每一行作为一个训练输入, 其对应的输出在train_label所对应的行.

train_label: 里面包含1列数据

2.2 设计设计pytorch的数据管道

设计dataloader    data_loader.py

import torch
import numpy as np
class ImageFolder(torch.utils.data.Dataset):
def __init__(self, train_data):
self.data_sorce = np.array(train_data.iloc[:, 0:6])
self.data_lable = np.array(train_data.iloc[:, 6:7])
def __getitem__(self, index): # index = 0
id_data = list(self.data_sorce)[index] # id_data = list(data_sorce)[index]
id_lable = list(self.data_lable)[index] # list(data_lable)[index]
data = torch.Tensor(id_data).unsqueeze(1)
label = torch.Tensor(id_lable)
return data, label
def __len__(self):
return len(list(self.data_lable))

简单讲解一些这段代码:

这个是pytorch的 快速数据管道的构造的基本 架构, 一般情况下需要重新构造下面三个方法

__init__(self, train_data):  类初始化的时候, 需要传入一个靶向文件

__getitem__(self, index):  这个方法会在程序运行的时候,自动调用函数体里面的相关内容,同样也是构造子类的输出

__len__(self): 就如同名字一样,返回的数据集的长度

 

搭建模型文件, modelnet.py

import torch
from torch import nn
class Rnn(nn.Module):
def __init__(self, INPUT_SIZE):
super(Rnn, self).__init__()
self.hidden_size = 20
self.num_layers = 2
self.rnn = nn.RNN(
input_size=INPUT_SIZE,
hidden_size=self.hidden_size,
num_layers=self.num_layers,
batch_first=True
)
self.out = nn.Linear(self.hidden_size, 1)
def forward(self, x):
r_out, h_state = self.rnn(x, None)#
outs = []
for time in range(r_out.size(1)):
outs.append(self.out(r_out[:, time, :]))
return torch.stack(outs, dim=1), h_state

modelnet.py文件中的输入参数有:

INPUT_SIZE:(非超参数) 该参数应等于 输入序列的特征的维度

self.hidden_size:(超参数)=>输出结果特征层的维度

self.num_layers:(超参数)=>循环神经网络的层数

由于每个时间间隔的输入都会对应相应的输出(输出也具有维度[hadden_sizes]的向量), 本文中hadden_sizes设置大于1,

通过一个全连接层将输出的特征向量转换为标量作为最终的输出,当然可以根据具体的需求来转化.转换过程如下代码所示.

outs = []
for time in range(r_out.size(1)):
outs.append(self.out(r_out[:, time, :]))

for循环,可以得到每一个时间间隔所对应的 输出. last_result = torch.stack(outs, dim=1) 的size为[batch,time_setp,1]

 

下面贴主函数的代码: main.py

import numpy as np
import matplotlib.pyplot as plt
import torch
from torch import nn
from modelnet import Rnn
from sklearn.model_selection import train_test_split
import pandas as pd
from data_loader import ImageFolder
from tqdm import trange
'''1.数据准备阶段
'''
# 导入训练数据文件
data_path = './Zhou_X.csv'
label_path = './Zhou_Y.csv'
# 指定输出的文件
txt_path = 'Zhou_X.txt'
# 定义一些超参数
INPUT_SIZE = 1 # 输入序列的特征维度
LR = 0.0001 # 学习率
BATCHSIZE_PER_CARD = 1 # batch_size
total_epoch = 40 # 总的训练循环次数
# 读取csv文件, sep = ' '代表表中的数据分割方式是' ' header = None是文件中没有关键字
data_train = pd.read_csv(data_path,sep = ' ',header=None)
data_label = pd.read_csv(label_path,header=None)
# 训练数据 和 标签放在同一个容器中, axis是按列拼接
data_get = pd.concat([data_train,data_label], axis=1)
# data.iloc[:, 0:13] # 按位置取某几列
# 将数据集 划分为训练集 和测试集
train_data, test_data = train_test_split(data_get,\
train_size=0.7,random_state=0.1,\
shuffle=False)
#################################################################
'''2.开始构造 训练框架'''
# 2.1构造pipe line
train_batchsize = torch.cuda.device_count() * BATCHSIZE_PER_CARD
val_batchsize = torch.cuda.device_count() * BATCHSIZE_PER_CARD
train_dataset = ImageFolder(train_data)
test_dataset = ImageFolder(test_data)
data_loader = torch.utils.data.DataLoader(
train_dataset,
batch_size=train_batchsize,
shuffle=True,
num_workers=0)
val_data_loader = torch.utils.data.DataLoader(
test_dataset,
batch_size=val_batchsize,
shuffle=True,
num_workers=0)
# 2.2 选择模型
model = Rnn(INPUT_SIZE)
print(model)
# 2.3 定义优化器和损失函数
optimizer = torch.optim.Adam(model.parameters(), lr=LR)
loss_func = nn.MSELoss()
# loss_func = nn.CrossEntropyLoss()
# 2.4 启动训练
global_step = 1
for epoch in range(1, total_epoch + 1):
print('\n---------- Epoch:' + str(epoch) + ' ----------')
data_loader_iter = iter(data_loader)
train_epoch_loss = 0
test_epoch_loss = 0
with trange(len(data_loader_iter)) as t:
for index in t:
train_data_input, train_data_label = data_loader_iter.next()
# x = torch.from_numpy(train_data_input)

prediction, h_state = model(train_data_input)
loss = loss_func(prediction[:,-1,:][0], train_data_label[0])
optimizer.zero_grad()
loss.backward()
optimizer.step()

global_step +=1
train_epoch_loss = train_epoch_loss + loss
t.set_postfix(step= global_step,loss = loss.data.numpy(), aver_loss= train_epoch_loss.data.numpy()/(index+1), learing_rate = LR)
data_loader_iter = iter(val_data_loader)
with trange(len(data_loader_iter)) as t:
for index in t:
with torch.no_grad():
train_data_input, train_data_label = data_loader_iter.next()
prediction, h_state = model(train_data_input)
loss = loss_func(prediction[:,-1,:][0], train_data_label[0])
test_epoch_loss = test_epoch_loss + loss
t.set_postfix(step= global_step,loss = loss.data.numpy(), aver_loss= test_epoch_loss.data.numpy()/(index+1), learing_rate = LR)
# 整体预测
all_data = ImageFolder(data_get)
all_data_loader = torch.utils.data.DataLoader(
all_data,
batch_size=1,
shuffle=False,
num_workers=0)
data_loader_iter = iter(all_data_loader)
input_caclaue = []
loss_caclaue = []
result = []
with trange(len(data_loader_iter)) as t:
for index in t:
with torch.no_grad():
train_data_input, train_data_label = data_loader_iter.next()
prediction, h_state = model(train_data_input)
loss = loss_func(prediction[:,-1,:][0], train_data_label[0])

input_caclaue.append([train_data_input.data.numpy(),train_data_label.data.numpy()])
result.append(prediction[:,-1,:][0].data.numpy())
loss_caclaue.append(loss.data.numpy())
t.set_postfix(step = index,loss = loss.data.numpy(), aver_loss= test_epoch_loss/(index+1))
with open(txt_path,"w") as f:

for index in range(len(result)):
pass # index = 0
str1 = ''
for iterm in input_caclaue[index][0][0]:
str1 = str1 + str(iterm[0]) + ' '
str2 = str(input_caclaue[index][1][0][0])

str3 = str(result[index][0])

str4 = str(loss_caclaue[index])

str_all = str1 + str2 + ' ' + str3 + ' ' + str4 + '\n'

f.write(str_all) # 自带文件关闭功能,不需要再写f.close()

 


推荐阅读
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 网址:https:vue.docschina.orgv2guideforms.html表单input绑定基础用法可以通过使用v-model指令,在 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
  • 如何优化Webpack打包后的代码分割
    本文介绍了如何通过优化Webpack的代码分割来减小打包后的文件大小。主要包括拆分业务逻辑代码和引入第三方包的代码、配置Webpack插件、异步代码的处理、代码分割重命名、配置vendors和cacheGroups等方面的内容。通过合理配置和优化,可以有效减小打包后的文件大小,提高应用的加载速度。 ... [详细]
  • tcpdump 4.5.1 crash 深入分析
    tcpdump 4.5.1 crash 深入分析 ... [详细]
  • 颜色迁移(reinhard VS welsh)
    不要谈什么天分,运气,你需要的是一个截稿日,以及一个不交稿就能打爆你狗头的人,然后你就会被自己的才华吓到。------ ... [详细]
  • 在本教程中,我们将看到如何使用FLASK制作第一个用于机器学习模型的RESTAPI。我们将从创建机器学习模型开始。然后,我们将看到使用Flask创建AP ... [详细]
  • 感谢大家对IT十八掌大数据的支持,今天的作业如下:1.实践PreparedStament的CRUD操作。2.对比Statement和PreparedStatement的大批量操作耗时?(1 ... [详细]
  • Opencv提供了几种分类器,例程里通过字符识别来进行说明的1、支持向量机(SVM):给定训练样本,支持向量机建立一个超平面作为决策平面,使得正例和反例之间的隔离边缘被最大化。函数原型:训练原型cv ... [详细]
  • 数学建模入门python绘制频率直方图
    文章目录例题数据处理绘图操作调用演示例题数据处理将以下的数据保存到磁盘上17275169551696417165167471716216867165521696216865 ... [详细]
author-avatar
手机用户2602935395
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有