1.RNN模型概述
RNN大致可以分为4种,输出和输入序列不同数量rnn可以有多种不同的结构,不同结构自然就有不同的引用场合。
如下图所示:
one to one 结构: 仅仅只是简单的给一个输入得到一个输出,此处并未体现序列的特征,例如图像分类场景。
one to many 结构:给一个输入得到一系列输出,这种结构可用于生产图片描述的场景。
many to one 结构: 给一系列输入得到一个输出,这种结构可用于文本情感分析,对一些列的文本输入进行分类,看是消极还是积 极情感。
many to many 结构: 给一些列输入得到一系列输出,这种结构可用于翻译或聊天对话场景,对输入的文本转换成另外一些列文本。
同步 many to many 结构: 它是经典的rnn结构,前一输入的状态会带到下一个状态中,而且每个输入都会对应一个输出,我们最熟悉的就是用于字符预测了,同样也可以用于视频分类,对视频的帧打标签。
2.seq2seq 简介
seq2seq是一个重要的RNN变种,属于many to many。同时这种结构又叫Encoder-Decoder模型。原始的N vs N RNN要求序列等长,然而我们遇到的大部分问题序列都是不等长的,如机器翻译中,源语言和目标语言的句子往往并没有相同的长度。
为此,我们先用Encoder 将输入编码映射到语义空间(下图左侧部分),得到一个个固定维数的向量(下图C),这个向量就表示输入的语义。然后我们使用Decoder进行解码,便获得所需的输出。
它的特点很明显,就是不限制输入输出,故有很广泛的应用。如机器翻译,智能对话等。
3. seq2seq预测股票
我们利用seq2seq对股票收盘价进行了预测,关于代码的详细说明,参见注释,需要数据的同学可以加我qq,请备注csdn_seq2seq。
# -*- coding: utf-8 -*-
"""
seq2seq stock
"""
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
'''
1.样本数据产生
'''
#pandas 链式赋值警告:a=b=c=1,凡事出现链式赋值的情况,
#pandas都是不能够确定到底返回的是一个引用还是一个拷贝。 所以遇到这种情况就干脆报warning
pd.options.mode.chained_assignment = None # default='warn'
def loadstock(window_size):
names = ['date', #日期
'code', #股票代码
'name', #名字
'Close', # 收盘价
'top_price', #最高价
'low_price', #最低价
'opening_price', #开盘价
'bef_price',
'floor_price',
'floor',
'exchange',
'Volume',
'amount',
'总市值',
'流通市值']
data