如何构建RNN神经网络的输入

普通的RNN:
rnn
因为这个左边图中间循环的箭头难以理解,所以将其按照时间轴展开成多个单元。网络只有一个,网络只有一个,网络只有一个, 并不是想右边那样画的。右边的图只不过是不同时刻的输入。因为每个时刻RNN会产生两个输出,一个output和一个state,上一个时刻state和当前作为输入给当前网络,就如右图所示。上图很容易造成了误解。

全连接成的输入
图出自: https://zhuanlan.zhihu.com/p/36455374

对于时间序列,引入时间步的概念: Xt表示时间步(time_step),每个时间步上的输入对应序列上的特征。比如有个3通道的声音的序列为64*3,64表示序列的长度,时间步也是64, 每一步时间步输入只是3通道上一个数值。

图出自: https://zhuanlan.zhihu.com/p/36455374

上图RNN展开的正确理解方式是这样的:

再理解几个概念:sequence length,input size, hidden unit
序列长度(sequence length)也可以理解为时间步(time step)比较好理解。比如一个语音输入,语音的长度就是序列长度。
input size表示一次输入的特征向量的大小。比如上面的全连接层神经网络,当batch_size为1是,输入的shape就是1x3。

x = tf.placeholder(tf.float32, shape=[None, 3])

hidden unit 指的就是有多少个LSTM cell或者GRU。

全连接神经网络的输入与RNN的输入比较:
diff
知乎 隔壁小王 的回答:链接:https://www.zhihu.com/question/41949741/answer/342218083
例如这样一个数据集合,总共100条句子,每个句子20个词,每个词都由一个80维的向量表示。在lstm中,单个样本即单条句子输入下(shape是 [1 , 20, 80]),假如设定每一个time step的输入是一个词(当然这不一定,你也可以调成两个词或者更多个数的词),则在t0时刻是第一个时间步,输入x0则为代表一条句子(一个样本)中第1个词的80维向量,t1是第二个时间步,x1表示该句子中第2个词的80维向量,依次类推t19输入是最后一个词即第20个词的向量表示。常见的tf或者keras中lstm的参数(samples, timestep, input_dim),samples是指批量训练样本的数量, timestep是时间步(这个时间步可自己设置)比如上面说的20,input-dim是每个time step的输入shape。

知乎 撸猫的大王 的回答: https://www.zhihu.com/question/41949741/answer/232424403
假如数据集是(5000,28,128),其中5000指的是样本个数,(28,128)便是具体每个样本的行列数,28就是lstm中的时间步数;假如定义一个lstm层为 LSTM(output_dim= 256,activation=,input_shape= (28,128)),那么每个时间步输出的是一个元素个数为256的一阶向量,所有时间步集合起来就是(28,256)的二阶向量。至于模型是用所有时间步的输出,还是只用最后一个,就看具体怎么设计了。

知乎 EDU GUO 的回答:
lstm

实际应用中,我们通常使用的是Tensorflow中定义好的单元搭建RNN,或者直接使用keras。那么这两个框架中的输入形式是怎样?

使用LSTM单元静态搭建一个RNN
tf.contrib.rnn.static_rnn(cell, inputs, initial_state=None, dtype=None, sequence_length=None, scope=None):

关注参数inputs
inputs:A length T list of inputs, each a Tensor of shape [batch_size, input_size], or a nested tuple of such elements.输入数据形状为[batch_size,input_size]

使用LSTM单元动态搭建一个RNN
tf.nn.dynamic_rnn(cell, inputs, sequence_length=None, 
     initial_state=None, dtype=None, parallel_iterations=None, 
       swap_memory=False, time_major=False, scope=None):

inputs:If time_major == False (default), this must be a Tensor of shape:[batch_size, max_time, depth], or a nested tuple of such elements. If time_major == True, this must be a Tensor of shape: [max_time, batch_size, depth], or a nested tuple of such elements. 输入数据,是一个张量,默认是三维张量,[batch_size, max_time, depth],batch_size 表示一个批次数量,max_time:表示时间序步总数,后面是一个时序输入数据的维度。
在默认情况下,time_major默认值是False,网络输出结果是[batch_size,max_time,depth]形式的张量。
这是一个批次优先的矩阵,当我们需要取最后一个时序的输出,需要转置成时间优先的形式。

outputs = tf.transpose(outputs,[1,0,2]
keras使用recurrent layers实现RNN

Input shape:
3D tensor with shape (batch_size, timesteps, input_dim).
这个输入的形式和Tensorflow动态搭建一个RNN的输入形式是一样的。

  • 15
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个基本的RNN神经网络模型,使用Python和TensorFlow实现。 首先,我们需要导入必要的库: ```python import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, SimpleRNN ``` 然后,我们可以定义一个简单的RNN模型: ```python model = Sequential() model.add(SimpleRNN(units=64, input_shape=(None, 1))) model.add(Dense(units=1)) ``` 在这个模型中,我们使用了一个包含64个神经元的SimpleRNN层,输入形状为(None, 1),表示输入的时间序列长度不确定,每个时间步只有一个特征。然后,我们添加了一个Dense层,输出一个单一的标量值,用于回归任务。 我们还可以添加其他层,如LSTM或GRU,或添加多个RNN层来构建更复杂的模型,具体取决于任务的要求。 接下来,我们可以编译模型并指定损失函数、优化器和评估指标: ```python model.compile(optimizer='adam', loss='mse', metrics=['mae']) ``` 在这个例子中,我们使用了Adam优化器和均方误差(MSE)损失函数。我们还使用平均绝对误差(MAE)作为评估指标。 最后,我们可以训练模型: ```python model.fit(X_train, y_train, epochs=100, batch_size=32, validation_data=(X_val, y_val)) ``` 在这个例子中,我们使用X_train和y_train来训练模型,使用X_val和y_val来验证模型。我们训练100个epochs,每个batch包含32个样本。 这就是一个简单的RNN神经网络模型,您可以根据需要进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值