深度学习(10)-Keras项目详解(递归神经网络)

一.递归神经网络基础概念

递归神经网络(Recursive Neural Network, RNN)可以解决有时间序列的问题,处理诸如树、图这样的递归结构。

CNN主要应用在计算机视觉CV中,RNN主要应用在自然语言处理NLP中。

1.h0,h1.....ht对应的是不同输入得到的中间结果。

2.处理自然语言I am GodFishhh or AFish:

则对应的输入为X0 -- I,X1 -- am,X2 -- GodFishhh,X3 -- or,X4 -- AFish,再通过一定的方法将自然语言输入转换为计算机能够理解的形式(例如Word2Vec方法,将文本中的词语转换为向量形式)。

3.RNN网络最后输出的结果会考虑之前所有的中间结果,记录的数据太多可能会产生误差或者错误。

LSTM长短记忆网络是一种特殊的递归神经网络,可以解决上述记录数据太多的问题:

在普通的RNN中,t-1时刻得到的输出值h(t-1)会被简单的复制到t时刻,并与t时刻的输入值X(t)整合再经过一个tanh函数后形成输出。

而在LSTM中,对于t-1时刻得到的输出值h(t-1)会有更加复杂的操作。

二.项目介绍

通过LSTM长短记忆网络实现预测股票的趋势

三.项目流程详解

3.1.项目架构

3.2.导入所需要的工具包

import os
import json
import time
import math
import matplotlib.pyplot as plt
import numpy as np
from core.data_processor import DataLoader
from core.model import Model
from keras.utils import plot_model

plot_model库的使用:

通过plot_model库可以使模型可视化

使用plot_model库需要安装pydot和graphviz库:

from keras.utils import plot_model

通过下述代码检测是否安装了pydot和grapviz库

import pydot
print(pydot.find_graphviz())

 

相关库的安装可以参考博主写的安装教程:

深度学习(9)-pydot库和graphviz库安装流程详解-CSDN博客

3.3.读取所需参数和数据

    # 读取所需参数configs = json.load(open('config.json', 'r'))if not os.path.exists(configs['model']['save_dir']):os.makedirs(configs['model']['save_dir'])# 读取数据data = DataLoader(os.path.join('data', configs['data']['filename']),configs['data']['train_test_split'],configs['data']['columns'])

利用json文件来保存所需要的参数

data_processor文件中定义了DataLoader类:

import math
import numpy as np
import pandas as pdclass DataLoader():"""A class for loading and transforming data for the lstm model"""def __init__(self, filename, split, cols):dataframe = pd.read_csv(filename)i_split = int(len(dataframe) * split)self.data_train = dataframe.get(cols).values[:i_split]self.data_test  = dataframe.get(cols).values[i_split:]self.len_train  = len(self.data_train)self.len_test   = len(self.data_test)self.len_train_windows = Nonedef get_test_data(self, seq_len, normalise):'''Create x, y test data windowsWarning: batch method, not generative, make sure you have enough memory toload data, otherwise reduce size of the training split.'''data_windows = []for i in range(self.len_test - seq_len):data_windows.append(self.data_test[i:i+seq_len])data_windows = np.array(data_windows).astype(float)data_windows = self.normalise_windows(data_windows, single_window=False) if normalise else data_windowsx = data_windows[:, :-1]y = data_windows[:, -1, [0]]return x,ydef get_train_data(self, seq_len, normalise):'''Create x, y train data windowsWarning: batch method, not generative, make sure you have enough memory toload data, otherwise use generate_training_window() method.'''data_x = []data_y = []for i in range(self.len_train - seq_len):x, y = self._next_window(i, seq_len, normalise)data_x.append(x)data_y.append(y)return np.array(data_x), np.array(data_y)def generate_train_batch(self, seq_len, batch_size, normalise):'''Yield a generator of training data from filename on given list of cols split for train/test'''i = 0while i < (self.len_train - seq_len):x_batch = []y_batch = []for b in range(batch_size):if i >= (self.len_train - seq_len):# stop-condition for a smaller final batch if data doesn't divide evenlyyield np.array(x_batch), np.array(y_batch)i = 0x, y = self._next_window(i, seq_len, normalise)x_batch.append(x)y_batch.append(y)i += 1yield np.array(x_batch), np.array(y_batch)def _next_window(self, i, seq_len, normalise):'''Generates the next data window from the given index location i'''window = self.data_train[i:i+seq_len]window = self.normalise_windows(window, single_window=True)[0] if normalise else windowx = window[:-1]y = window[-1, [0]]return x, ydef normalise_windows(self, window_data, single_window=False):'''Normalise window with a base value of zero'''normalised_data = []window_data = [window_data] if single_window else window_datafor window in window_data:normalised_window = []for col_i in range(window.shape[1]):normalised_col = [((float(p) / float(window[0, col_i])) - 1) for p in window[:, col_i]]normalised_window.append(normalised_col)normalised_window = np.array(normalised_window).T # reshape and transpose array back into original multidimensional formatnormalised_data.append(normalised_window)return np.array(normalised_data)

3.4.创建RNN模型

    # 创建RNN模型model = Model()mymodel = model.build_model(configs)# 生成模型的结构,并保存在model.png中plot_model(mymodel, to_file='model.png', show_shapes=True)

model文件中定义了Model类:

import os
import math
import numpy as np
import datetime as dt
from numpy import newaxis
from core.utils import Timer
from keras.layers import Dense, Activation, Dropout, LSTM
from keras.models import Sequential, load_model
from keras.callbacks import EarlyStopping, ModelCheckpointclass Model():"""LSTM 模型"""def __init__(self):self.model = Sequential()def load_model(self, filepath):print('[Model] Loading model from file %s' % filepath)self.model = load_model(filepath)def build_model(self, configs):timer = Timer()timer.start()for layer in configs['model']['layers']:neurons = layer['neurons'] if 'neurons' in layer else Nonedropout_rate = layer['rate'] if 'rate' in layer else Noneactivation = layer['activation'] if 'activation' in layer else Nonereturn_seq = layer['return_seq'] if 'return_seq' in layer else Noneinput_timesteps = layer['input_timesteps'] if 'input_timesteps' in layer else Noneinput_dim = layer['input_dim'] if 'input_dim' in layer else Noneif layer['type'] == 'dense':self.model.add(Dense(neurons, activation=activation))if layer['type'] == 'lstm':self.model.add(LSTM(neurons, input_shape=(input_timesteps, input_dim), return_sequences=return_seq))if layer['type'] == 'dropout':self.model.add(Dropout(dropout_rate))self.model.compile(loss=configs['model']['loss'], optimizer=configs['model']['optimizer'])print('[Model] Model Compiled')timer.stop()return self.modeldef train(self, x, y, epochs, batch_size, save_dir):timer = Timer()timer.start()print('[Model] Training Started')print('[Model] %s epochs, %s batch size' % (epochs, batch_size))save_fname = os.path.join(save_dir, '%s-e%s.h5' % (dt.datetime.now().strftime('%d%m%Y-%H%M%S'), str(epochs)))callbacks = [EarlyStopping(monitor='val_loss', patience=2),ModelCheckpoint(filepath=save_fname, monitor='val_loss', save_best_only=True)]self.model.fit(x,y,epochs=epochs,batch_size=batch_size,callbacks=callbacks)self.model.save(save_fname)print('[Model] Training Completed. Model saved as %s' % save_fname)timer.stop()def train_generator(self, data_gen, epochs, batch_size, steps_per_epoch, save_dir):timer = Timer()timer.start()print('[Model] Training Started')print('[Model] %s epochs, %s batch size, %s batches per epoch' % (epochs, batch_size, steps_per_epoch))save_fname = os.path.join(save_dir, '%s-e%s.h5' % (dt.datetime.now().strftime('%d%m%Y-%H%M%S'), str(epochs)))callbacks = [ModelCheckpoint(filepath=save_fname, monitor='loss', save_best_only=True)]self.model.fit_generator(data_gen,steps_per_epoch=steps_per_epoch,epochs=epochs,callbacks=callbacks,workers=1)print('[Model] Training Completed. Model saved as %s' % save_fname)timer.stop()def predict_point_by_point(self, data):print('[Model] Predicting Point-by-Point...')predicted = self.model.predict(data)predicted = np.reshape(predicted, (predicted.size,))return predicteddef predict_sequences_multiple(self, data, window_size, prediction_len,debug=False):if debug == False:print('[Model] Predicting Sequences Multiple...')prediction_seqs = []for i in range(int(len(data)/prediction_len)):curr_frame = data[i*prediction_len]predicted = []for j in range(prediction_len):predicted.append(self.model.predict(curr_frame[newaxis,:,:])[0,0])curr_frame = curr_frame[1:]curr_frame = np.insert(curr_frame, [window_size-2], predicted[-1], axis=0)prediction_seqs.append(predicted)return prediction_seqselse :print('[Model] Predicting Sequences Multiple...')prediction_seqs = []for i in range(int(len(data)/prediction_len)):print (data.shape)curr_frame = data[i*prediction_len]print (curr_frame)predicted = []for j in range(prediction_len):predict_result = self.model.predict(curr_frame[newaxis,:,:])print (predict_result)final_result = predict_result[0,0]predicted.append(final_result)curr_frame = curr_frame[1:]print (curr_frame)curr_frame = np.insert(curr_frame, [window_size-2], predicted[-1], axis=0)print (curr_frame)prediction_seqs.append(predicted)def predict_sequence_full(self, data, window_size):print('[Model] Predicting Sequences Full...')curr_frame = data[0]predicted = []for i in range(len(data)):predicted.append(self.model.predict(curr_frame[newaxis,:,:])[0,0])curr_frame = curr_frame[1:]curr_frame = np.insert(curr_frame, [window_size-2], predicted[-1], axis=0)return predicted

utils文件中定义了Timer()类:

import datetime as dtclass Timer():def __init__(self):self.start_dt = Nonedef start(self):self.start_dt = dt.datetime.now()def stop(self):end_dt = dt.datetime.now()print('Time taken: %s' % (end_dt - self.start_dt))

3.5.加载训练数据并训练模型

    #加载训练数据x, y = data.get_train_data(seq_len=configs['data']['sequence_length'],normalise=configs['data']['normalise'])print (x.shape)print (y.shape)#训练模型model.train(x,y,epochs = configs['training']['epochs'],batch_size = configs['training']['batch_size'],save_dir = configs['model']['save_dir'])

3.6.展示测试结果

   #测试结果x_test, y_test = data.get_test_data(seq_len=configs['data']['sequence_length'],normalise=configs['data']['normalise'])#展示测试效果predictions = model.predict_sequences_multiple(x_test, configs['data']['sequence_length'], configs['data']['sequence_length'],debug=False)print (np.array(predictions).shape)plot_results_multiple(predictions, y_test, configs['data']['sequence_length'])

四.完整代码

import os
import json
import time
import math
import matplotlib.pyplot as plt
import numpy as np
from core.data_processor import DataLoader
from core.model import Model
from keras.utils import plot_model# 绘图展示结果
def plot_results(predicted_data, true_data):fig = plt.figure(facecolor='white')ax = fig.add_subplot(111)ax.plot(true_data, label='True Data')plt.plot(predicted_data, label='Prediction')plt.legend()#plt.show()plt.savefig('results_1.png')def plot_results_multiple(predicted_data, true_data, prediction_len):fig = plt.figure(facecolor='white')ax = fig.add_subplot(111)ax.plot(true_data, label='True Data')plt.legend()for i, data in enumerate(predicted_data):padding = [None for p in range(i * prediction_len)]plt.plot(padding + data, label='Prediction')#plt.show()plt.savefig('results_multiple_1.png')#RNN时间序列
def main():#读取所需参数configs = json.load(open('config_2.json', 'r'))if not os.path.exists(configs['model']['save_dir']): os.makedirs(configs['model']['save_dir'])#读取数据data = DataLoader(os.path.join('data', configs['data']['filename']),configs['data']['train_test_split'],configs['data']['columns'])#创建RNN模型model = Model()mymodel = model.build_model(configs)plot_model(mymodel, to_file='model.png',show_shapes=True)#加载训练数据x, y = data.get_train_data(seq_len=configs['data']['sequence_length'],normalise=configs['data']['normalise'])print (x.shape)print (y.shape)#训练模型model.train(x,y,epochs = configs['training']['epochs'],batch_size = configs['training']['batch_size'],save_dir = configs['model']['save_dir'])#测试结果x_test, y_test = data.get_test_data(seq_len=configs['data']['sequence_length'],normalise=configs['data']['normalise'])#展示测试效果predictions_multiseq = model.predict_sequences_multiple(x_test, configs['data']['sequence_length'], configs['data']['sequence_length'])predictions_pointbypoint = model.predict_point_by_point(x_test,debug=True)        plot_results_multiple(predictions_multiseq, y_test, configs['data']['sequence_length'])plot_results(predictions_pointbypoint, y_test)if __name__ == '__main__':main()

五.数据预测结果

5.1.config_1参数的预测结果

网络模型:

根据0-50时间长度数据预测1-51时间长度数据的预测图(一个一个点预测):

根据0-50时间长度数据预测51-100时间长度数据的预测图(一个一个序列预测):

5.2.config_2参数的预测结果

网络模型:

根据0-50时间长度数据预测1-51时间长度数据的预测图(一个一个点预测):

根据0-50时间长度数据预测51-100时间长度数据的预测图(一个一个序列预测):

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/666377.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

debian12 解决 github 访问难的问题

可以在 /etc/hosts 文件中添加几个域名与IP对应关系&#xff0c;从而提高 github.com 的访问速度。 据搜索了解&#xff08;不太确定&#xff09;&#xff0c;可以添加这几个域名&#xff1a;github.com&#xff0c;github.global.ssl.fastly.net&#xff0c;github.global.fa…

银河麒麟 aarch64 Mysql环境安装

一、操作系统版本信息 组件版本操作系统Kylin V10 (SP3) /(Lance)-aarch64-Build23/20230324Kernel4.19.90-52.22.v2207.ky10.aarch64MySQLmysql-8.3.0JDK1.8.0_312 二、MySQL下载 官网下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/ 三、MySQL 安装 3.1 删…

年终奖,还得是腾讯。。。

腾讯年终奖 什么是真正的好公司&#xff1f; 一年到头&#xff0c;出不了几次裁员等劳务纠纷的吃瓜新闻。 只有到年底了&#xff0c;才因为年终奖远高于行业水平&#xff0c;实在没法低调了&#xff0c;"被迫"上热搜。 最近网友爆料了腾讯头牌部门的年终奖&#xff1…

JavaSE——流程控制-循环结构(for循环、while循环、小案例、do-while循环、死循环、循环嵌套)

目录 for循环 while循环 小案例 do-while循环 死循环 循环嵌套 for循环 for(int i 0; i < 5; i) {System.out.println("Hello world"); } 执行的流程&#xff1a; 循环一开始&#xff0c;执行int i0 一次。此时 i 0&#xff0c;接着计算机执行循环条件…

下载RTSP播放器

1.网站1 2.海康播放器 在海康官网上选择【服务支持】【工具软件】&#xff0c;往下滚动&#xff0c;打开VSPlayer_x64

陪女朋友学习计算机二级之栈和队列

栈 栈(堆栈)的定义 堆栈又名栈(stack),它是一种线性表。限定仅在表尾进行插入和删除操作的线性表。是一种后进先出的线性表. 空栈:不含任何元素的空表。 栈顶和栈底 进行插入和删除的这一端(表尾)被称为栈顶&#xff0c;相对地&#xff0c;把另一端称为栈底。 入栈和出栈 …

大小姐驾到!高德地图联合《王者荣耀》推出孙尚香导航语音包

“大小姐驾到&#xff01;统统闪开&#xff01;”如果你是一个手游爱好者&#xff0c;多半会对这句话耳熟能详&#xff0c;来自于国内手游界顶流《王者荣耀》中的高人气角色——孙尚香&#xff0c;并成为一代玩家们的记忆。 如今&#xff0c;随着高德地图与《王者荣耀》达成合…

java之ReentrantLock

在讲RentrantLock之前需要先讲一下AQS和LockSupport&#xff0c;因为rentrantLock底层是用AQS实现的&#xff0c;而AQS中获取阻塞和唤醒底使用LockSupport实现的。 1、LockSupport实现 下面代码中&#xff0c;LockSupport.park方法是当前线程等待&#xff0c;直到获得许可&am…

Istio-解决Zipkin对项目的侵入性问题

Istio采用SideCar模式注入的Enovy代理在某些情况下不能完全解决对项目的无侵入性&#xff0c;比如需要用到Istio的链路追踪功能的时候。需要在代码中手动注入链路追踪需要的header&#xff0c;这样就出现了Istio对业务功能的侵入性。 istio服务网格的调用链跟踪需要依赖在服务之…

大数据环境搭建(一)-Hive

1 hive介绍 由Facebook开源的,用于解决海量结构化日志的数据统计的项目 本质上是将HQL转化为MapReduce、Tez、Spark等程序 Hive表的数据是HDFS上的目录和文件 Hive元数据 metastore&#xff0c;包含Hive表的数据库、表名、列、分区、表类型、表所在目录等。 根据Hive部署模…

axios二次封装用法

axios二次封装 一、request.js import axios from axios import router from "/router";const request axios.create({baseURL: http://localhost:9090,timeout: 5000 })// request 拦截器 // 可以自请求发送前对请求做一些处理 // 比如统一加token&#xff0c;对…

什么是进销存?一文读懂进销存管理系统

阅读本文&#xff0c;你将了解&#xff1a;一、什么是进销存&#xff1b;二、什么是进销存管理系统&#xff1b;三、为什么有必要使用进销存管理系统&#xff1b;四、进销存管理系统的优势&#xff1b;五、好用的进销存管理系统。 这是我们公司搭建好的免费进销存系统模版&…

近屿智能引领行业前沿,精心打造AIGC大模型工程师和产品经理的进阶之路(附完整版学习路径图)

近屿智能&#xff0c;倾力打造了一套独特的AIGC大模型工程师和产品经理学习路径图。该路径图清晰地展示了从初学者到专家水平的技能进阶过程&#xff0c;为工程师和产品经理提供了明确的学习目标和成长路径。 这套学习路径图适用于不同背景和经验的学习者&#xff0c;无论您是初…

GPT在地学、GIS、气象、农业、生态、环境等领域中的高级应用

详情点击公众号&#xff1a;技术科研吧 链接&#xff1a;GPT在地学、GIS、气象、农业、生态、环境等领域中的高级应用 一开启大模型 1 开启大模型 1)大模型的发展历程与最新功能 2)大模型的强大功能与应用场景 3)国内外经典大模型&#xff08;ChatGPT、LLaMA、Gemini、DAL…

Python创建类的成员并访问

在Python中&#xff0c;类是面向对象编程的核心概念之一。通过类的定义&#xff0c;可以创建对象并定义对象的属性和方法。本文将介绍在Python中如何创建类的成员&#xff08;包括属性和方法&#xff09;&#xff0c;以及如何访问类的成员。 1. 创建类的属性 在Python…

【XR806开发板试用】TCP通信测试 Ping 命令测试

1.工程准备 由于要使用wifi功能&#xff0c;直接从wlan_demo复制一份出来&#xff0c;然后修改。 源文件只留下 main.c 就可以了。 BUILD.gn文件 import("//device/xradio/xr806/liteos_m/config.gni")static_library("app_mying") {configs []sources…

2024美赛C题完整解题教程及代码 网球运动的势头

2024 MCM Problem C: Momentum in Tennis &#xff08;网球运动的势头&#xff09; 注&#xff1a;在网球运动中&#xff0c;"势头"通常指的是比赛中因一系列事件&#xff08;如连续得分&#xff09;而形成的动力或趋势&#xff0c;这可能对比赛结果产生重要影响。球…

STL常用容器—list容器(链表)

STL常用容器—list容器&#xff08;链表&#xff09; 一、list容器基本概念二、list容器基本操作与常用方法1. list构造函数2. ☆list 插入和删除3. list 获取头尾数据4. list 大小操作5. list赋值和交换6. list 反转和排序 三、排序案例 参考博文1: &#xff1c;C&#xff1e;…

计算机视觉中的目标跟踪

从保护我们城市的监控系统到自动驾驶车辆在道路上行驶&#xff0c;目标跟踪已经成为计算机视觉中的一项基础技术。本文深入探讨了目标跟踪&#xff0c;探索了其基本原理、多样化的方法以及在现实世界中的应用。 什么是目标跟踪&#xff1f; 目标跟踪是深度学习在计算机视觉中广…

JAVA Web 学习(四)RabbitMQ、Zookeeper

十、消息队列服务器——RabbitMQ RabbitMQ是使用Erlang语言开发的开源消息队列系统&#xff0c;基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、 安全。AMQP协议更多用在企业系统内&#xff0c;对数据一致性、稳定性和可靠性要求…