深度学习之循环神经网络

目录

      • 一、序列模型之循环神经网络RNN
        • 1.1定义与特点
        • 1.2场景应用
        • 1.3循环神经网络(RNN
      • 二、RNN处理字符串
        • 2.1转化字典
        • 2.2RNN处理字符串:one-hot向量格式
        • 2.3RNN处理字符串:转化字典的另外一种方式
      • 三、多样的RNN结构:LSTM、BRNN、DRNN
        • 3.1多对一
        • 3.2一对多
        • 3.3多对多
        • 3.4RNN结构中的信息丢失问题
        • 3.5长短期记忆网络(LSTM)
        • 3.6双向循环神经网络(BRNN)
        • 3.7深层循环神经网络(DRNN)
      • 四、任务
        • 4.1RNN预测股价
        • 4.2LSTM文本生成

一、序列模型之循环神经网络RNN

1.1定义与特点

  • 输入或者输出中包含有序列数据的模型叫做序列模型(序列中包含信息)
  • 输入(输出)元素之间是具有顺序关系。不同顺序,得到的结果应该是不同的,比如“不睡觉”和“睡觉不”这两个短句的意思是不同的
  • 输入输出不定长,比如聊天机器人,聊天之间的对话长度都是不定的

1.2场景应用

  • 机器翻译
  • 语音识别
  • 行为预测
  • 股价预测

1.3循环神经网络(RNN

  • 一类以序列(Sequence)数据为输入,在序列的演进方向进行递归(recursion)的神经网络
    深度学习之循环神经网络_第1张图片
    深度学习之循环神经网络_第2张图片

二、RNN处理字符串

2.1转化字典

  • 词汇数值化:建立一个词汇-数值的字典,然后把输入词汇转化为数值数据
    深度学习之循环神经网络_第3张图片

2.2RNN处理字符串:one-hot向量格式

  • 不同字符之间不存在定理关系,因此需要通过One-hot向量格式的数据来表达字符信息
    深度学习之循环神经网络_第4张图片
    深度学习之循环神经网络_第5张图片
    深度学习之循环神经网络_第6张图片

2.3RNN处理字符串:转化字典的另外一种方式

  • 对每个字母建立字典
    深度学习之循环神经网络_第7张图片

三、多样的RNN结构:LSTM、BRNN、DRNN

深度学习之循环神经网络_第8张图片

3.1多对一

  • 输入:X1,X2,X3,…Xi
  • 输出:y
  • 应用:情感识别
  • 举例 I am angry about this thing.[y=negative]

3.2一对多

  • 输入:x
  • 输出:y1,y2,y3,…,yi
  • 应用:序列数据生成器(图像字母、约了生成、文章生成)

3.3多对多

  • 输入:X1,X2,X3,…Xi
  • 输出:y1,y2,y3,…yi
  • 应用:机器翻译
  • 举例:Do you want to sing with me【y=你想和我一起唱歌吗?】

3.4RNN结构中的信息丢失问题

  • 前部序列信息在传递到后部的同时,信息权重下降,导致重要信息丢失
  • 反向传播算法进行模型求解时,梯度消失
    深度学习之循环神经网络_第9张图片

3.5长短期记忆网络(LSTM)

  • 相比于普通RNN单元通过Ai传递前部序列信息,距离越远信息丢失越多,LSTM增加了记忆细胞Ci,可以传递前部远处重要信息
  • Ai实现了序列信息传递,记忆细胞Ci则保证了重要信息不易丢失,提高预测准确性
  • 即使网络很深(很多层),前部的重要信息也能在后续预测中保留
  • 减少了普通RNN在求解过程中的梯度消失问题
    深度学习之循环神经网络_第10张图片
  • 忘记门:选择性丢弃Ai-1与Xi中不重要的信息
  • 更新门:确定给记忆细胞添加哪些信息
  • 输出门:筛选需要输出的信息
    深度学习之循环神经网络_第11张图片

深度学习之循环神经网络_第12张图片

3.6双向循环神经网络(BRNN)

  • 根据前后双项进行预测(后部序列信息也用于前部信息的预测)
    深度学习之循环神经网络_第13张图片

3.7深层循环神经网络(DRNN)

  • 对于更难提取的复杂信息,可以把单层RNN叠起来或和mlp结构结合使用
    深度学习之循环神经网络_第14张图片

四、任务

4.1RNN预测股价

  • 基于数据,建立RNN模型,使用收盘价格预测贵州茅台次日价
  • 完成基本的数据加载,可视化工作
  • 数据预处理:将数据转化为符合RNN模型输入要求的数据
  • 建立RNN模型并训练模型,计算训练集、测试集模型预测r2分数
  • 可视化预测表现(模型结构:单层RNN,5个神经元,每次使用前10个数据预测第11个数据)
  • 将测试数据预测结果保存到本地csv文件
# -*- coding: utf-8 -*-

# In[]
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

data_train=pd.read_csv('task1_data_train.csv')

price_close=data_train.loc[:,'close']

# In[]
#数据可视化
plt1 =plt.figure(figsize=(8,5))
plt.plot(price_close)
plt.title('gzmt price close')
plt.xlabel('time serice')
plt.ylabel('price')
plt.show()

# In[]
#归一化
price_n=price_close/max(price_close)
print(price_n)

# In[]
#Input_shape(samples,time_steps.features)

#samples:样本数量(可不填写)
#time_steps:序列长度,及用多少个连续样本预测一个输出
#每个样本的特征数features
# In[]
#提取出符合要求的序列数据
def extract_data(data,time_step):
    X=[]
    y=[]
    #0,1,2,3,...,10:11个样本;time_step=10;0,1...9;1,2,...,10两组(两组样本)
    for i in range(len(data)-time_step):
        X.append([a for a in data[i:i+time_step]])
        y.append(data[i+time_step])
    X=np.array(X)
    X=X.reshape(X.shape[0],X.shape[1],1)
    return X,y

# In[]
#函数功能确认
# test_data=[i for i in range(1,10)]
# test_step=5
# X,y=extract_data(test_data,test_step)
# print(test_data)
# print(X,y)

# In[]
#股票价格数据处理
time_step=10
X,y=extract_data(price_n, time_step)
X=np.array(X)
y=np.array(y)
print(X[0:2,:,:])
print(y)
print(X.shape,len(y))

# In[]
from keras.models import Sequential
from keras.layers import Dense,SimpleRNN
model=Sequential()

model.add(SimpleRNN(units=5,input_shape=(10,1),activation='relu'))

model.add(Dense(units=1,activation='linear'))


model.summary()

# In[]
#模型配置
model.compile(optimizer='adam',loss='mean_squared_error')

# In[]
#模型训练
model.fit(X,y,batch_size=30,epochs=200)



# In[]
#结果预测
y_train_predict=model.predict(X)
y_train_predict=y_train_predict*max(price_close)
print(y_train_predict)

y=y*max(price_close)


# In[]
#结构可视化
plt1 =plt.figure(figsize=(8,5))
plt.plot(y,label='real price')
plt.plot(y_train_predict,label='predict price')
plt.title('gzmt price close')
plt.xlabel('time serice')
plt.ylabel('price')
plt.legend()
plt.show()



# In[]
#模型评估
from sklearn.metrics import r2_score

r2_train=r2_score(y,y_train_predict)
print(r2_train)
# In[]
#测试集
data_test=pd.read_csv('task1_data_test.csv')
price_test=data_test.loc[:,'close']


# In[]
#归一化(使用前面数据的最大值来完成归一化)
price_test_n=price_test/max(price_close)

# In[]
#测试数据的数据提取
X_test,y_test=extract_data(price_test_n, time_step)
print(X_test.shape,len(y_test))

# In[]
#测试数据的预测
y_test_predict=model.predict(X_test)

y_test_predict=y_test_predict*max(price_close)

y_test=np.array(y_test)
y_test=y_test*max(price_close)
# In[]

plt1 =plt.figure(figsize=(8,5))
plt.plot(y_test,label='real price')
plt.plot(y_test_predict,label='predict price')
plt.title('gzmt price close')
plt.xlabel('time serice')
plt.ylabel('price')
plt.legend()
plt.show()


# In[]
r2_train=r2_score(y_test,y_test_predict)
print(r2_train)



# In[]
#数据存储
y_test_r=np.array(y_test).reshape(-1,1)
print(y_test_r.shape)
print(y_test_predict.shape)
final_result=np.concatenate((y_test_r,y_test_predict),axis=1)

final_result_df=pd.DataFrame(final_result,columns=["real price","predict price"])

final_result_df.to_csv('predict.csv')
# In[]










4.2LSTM文本生成

  • 基于数据,建立LSTM模型,生成文本
  • 加载本地文本数据,生成字典
  • 数据预处理:将数据转化为符合LSTM模型输入要求的数据,确认数据结构
  • 建立LSTM模型,进行模型训练,计算模型在训练、测试数据集的准确率
  • 预测”artificial intelligence(AI),sometimes called machine intelligence,is intelligence demostrated by machines“的后续字母
  • 模型结构:单层LSTM,30神经元
  • 每次使用前30个字母(或符号)预测第31个字母
# -*- coding: utf-8 -*-
# In[]


# In[]
#文本数据加载
data=open('LSTM_data').read()
#移除换行符
data=data.replace('\n','').replace('\r','')
print(data)
# In[]
#字符去重处理
letters=list(set(data))
print(letters)
features=len(letters)
print(features)


# In[]
#建立字典
# int to char
int_to_char={a:b for a,b in enumerate(letters)}
print(int_to_char)

#char to int
char_to_int={b:a for a,b in enumerate(letters)}
print(char_to_int)


# In[]
time_step=30

import numpy as np
from keras.utils import to_categorical
#滑动窗口提取数据
def extract_data(data, slide):    
    x = []
    y = []    
    for i in range(len(data) - slide):
        x.append([a for a in data[i:i+slide]])
        y.append(data[i+slide])        
    return x,y
#字符到数字的批量转化
def char_to_int_Data(x,y, char_to_int):    
    x_to_int = []
    y_to_int = []
    for i in range(len(x)):
        x_to_int.append([char_to_int[char] for char in x[i]])
        y_to_int.append([char_to_int[char] for char in y[i]])    
    return x_to_int, y_to_int
#实现输入字符文章的批量处理,输入整个字符、滑动窗口大小、转化字典
def data_preprocessing(data, slide, num_letters, char_to_int):    
    char_Data = extract_data(data, slide)
    int_Data = char_to_int_Data(char_Data[0], char_Data[1], char_to_int)
    Input = int_Data[0]
    Output = list(np.array(int_Data[1]).flatten())
    Input_RESHAPED = np.array(Input).reshape(len(Input), slide)
    new = np.random.randint(0,10,size=[Input_RESHAPED.shape[0],Input_RESHAPED.shape[1],num_letters])
    for i in range(Input_RESHAPED.shape[0]):
        for j in range(Input_RESHAPED.shape[1]):
            new[i,j,:] = to_categorical(Input_RESHAPED[i,j],num_classes=num_letters)
    return new, Output

# In[]
#完成字符串预处理
X,y=data_preprocessing(data,time_step,features,char_to_int)

#data:待处理的字符串
#time_step:序列的长度
#features:样本的特征数
#char_to_int:字符转数字的字典
#X:转化为one-hot格式的数组
#y:转化为字符对应数值的列表

# In[]
#确认维度

print(X.shape)
print(len(y))

#数据分离
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.1,random_state=0)
print(X.shape,X_train.shape,X_test.shape)
# In[]
#输出结果格式转化
y_train_c=to_categorical(y_train,features)
print(y_train_c)
print(y_train_c.shape)


# In[]
#建立LSTM模型
from keras.models import Sequential
from keras.layers import Dense,LSTM

model=Sequential()
model.add(LSTM(units=30,input_shape=(X_train.shape[1],X_train.shape[2]),activation='relu'))
model.add(Dense(units=features,activation='softmax'))
model.summary()


# In[]
#参数配置与训练
model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])
model.fit(X_train,y_train_c,batch_size=1000,epochs=50)


# In[]
model.fit(X_train,y_train_c,batch_size=1000,epochs=50)
# In[]
#新字符的预测
y_train_predict=model.predict_classes(X_train)
print(y_train_predict)



# In[]
#新字符串预测
new_letters='Artficial intelligence(AI),sometimes called machine intelligence,is intelligence demonstrated by machines'
X_new,y_new=data_preprocessing(new_letters,time_step,features,char_to_int)
y_new_predict=model.predict_classes(X_new)
# print(y_new_predict)


# In[]
#结果转化为字符
y_train_predict_char=[int_to_char[i] for i in y_train_predict]
# print(y_train_predict_char)


# In[]
#准确率
from sklearn.metrics import accuracy_score
accuracy_train=accuracy_score(y_train,y_train_predict)

#In[]
#测试数据的预测
y_test_predict=model.predict_classes(X_test)
y_test_predict_char=[int_to_char[i] for i in y_train_predict]
# print(y_test_predict_char)


# In[]
#准确率

accuracy_test=accuracy_score(y_test,y_test_predict)
print(accuracy_test)
# In[]
#新字符串的预测
new_letters='Artificial intelligence (AI), sometimes called machine intelligence, is intelligence demonstrated by machines'
X_new,y_new=data_preprocessing(new_letters,time_step,features,char_to_int)
print(X_new.shape,len(y_new))

# In[]
y_new_predict=model.predict_classes(X_new)
print(y_new_predict)


# In[]
y_new_predict_char=[int_to_char[i] for i in y_new_predict]
print(y_new_predict_char)
# In[]
for i in range(0,X_new.shape[0]-30):
    print(new_letters[i:i+30],'--predict new letters is >>>',y_new_predict_char[i])

你可能感兴趣的:(笔记,神经网络,深度学习)