RNN的数据输入输出维度

看到这篇文章的读者朋友应该对RNN和LSTM的基本结构有了一定的认识,下面就简单快速复习一下:
首先说明一下RNN是什么,递归神经网络(recursive neural network)或者循环神经网络(Recurrent Neural Network)的缩写都是RNN,循环神经网络首先被提出,而递归神经网络是循环神经网络的推广,不过现在我们一般不加区分,叫什么都可以,两者一般通用。

下图为RNN的结构示意图:
在这里插入图片描述
或者是:
在这里插入图片描述
上述图中,,
输入,隐状态,输出等的关系如下:

在这里插入图片描述
•网络某一时刻的输入xt,和之前介绍的BP神经网络的输入一样,xt是一个n维向量,不同的是RNN(递归神经网络)的输入将是一整个序列,也就是X = [x1,…,xt-1,xt,xt+1,…xT],T表示序列的长度,这也就是说RNN中一个样本就是一个序列。对于语言模型,每一个xt将代表一个词向量,一整个序列就代表一句话(也就是一个样本),T就是这句话包含的单词数量。又由于在神经网络中,我们的输入通常是多个样本作为一个批次的,所以在RNN中数据通常是三维的,也就是[batch_size,seq_len,input_dim]或者[seq_len,batch_size,input_dim],其中,batch_size表示批次大小,也就是一个批次含有多少个序列(句子);seq_len表示一个序列(句子)的长度;input_dim表示某时刻输入数据的维度,也就是这个输入数据的特征数目(features)。
•st是时间t处的“记忆”,相当于对输入值xt和上一时刻的状态值ht-1做了一个线性变换,保留了上一时刻的信息。维度为[batch_size,num_units],batch_size是批次大小,和inputs中的意义相同,num_units表示RNN cell中的神经元数量,从矩阵的线性变换的角度来说,就是将数据转换为多少维的向量,这个向量的维度就是num_units。
• ht代表时刻t的隐藏状态,形状也为[batch_size,num_units],
• ot代表时刻t的输出,我们这里说的输出,是状态值ht先经线性变换(也就是全链接操作)后再经softmax转换得到的最终输出,有些文章也会将ht视作输出,但是其实下一步还需要进行softmax转换才能得到最终结果。
• 输入层到隐藏层之间的权重由U表示,它将我们的原始输入进行抽象作为隐藏层的输入
• 隐藏层到隐藏层的权重W,它是网络的记忆控制者,负责调度记忆。
• 隐藏层到输出层的权重V,从隐藏层学习到的表示将通过它再一次抽象,并作为最终输出。

上式中f可以是tanh,relu,sigmoid等激活函数,g通常是softmax也可以是其他。
值得注意的是,我们说递归神经网络拥有记忆能力,而这种能力就是通过W将以往的输入状态
进行总结,而作为下次输入的辅助。可以这样理解隐藏状态:h=f(现有的输入+过去记忆总结)

辨析:输入序列的序列长度(T)与时间步长(timesteps)的关系是怎么样的呢?
由上文我们可知,同一批次的序列长度是一样的,但是不同批次的序列长度可能不同,具体要看使用的是静态RNN(所有批次序列长度必须保持一致)还是动态RNN(不同批次的序列长度可以不一样),但是在具体计算时,时间步长是和序列步长相匹配的,具体可以参考
https://blog.csdn.net/qq_27825451/article/details/88991529
该文章结合代码讲解了在tensorflow,keras中两者不一致是如何处理的,纠正了网上一些不太严谨的说法,给出了清晰明确的答案。

如果感觉仍是不太明确的同学,建议参考下面这些博客:
https://blog.csdn.net/qq_27825451/article/details/88988755

https://blog.csdn.net/qq_27825451/article/details/88991529

https://blog.csdn.net/qq_27825451/article/details/89015513

通过以上博客及本文,相信你一定对RNN的输入输出维度方面的认知有了比较全面和清楚的认知。

### 创建和使用具有单输入单输出的RNN模型 在MATLAB中创建并训练一个简单的循环神经网络(RNN),用于处理时间序列数据,可以遵循以下方法。此过程涉及定义网络架构、准备数据集以及配置训练选项。 #### 定义网络结构 为了构建适合于回归任务的RNN模型,可以选择LSTM层作为主要组件之一,因为它们能够有效捕捉长时间依赖关系。下面是一个具体的例子: ```matlab layers = [ sequenceInputLayer(inputSize,'Name','input') lstmLayer(numHiddenUnits,'OutputMode','sequence','Name','lstm') fullyConnectedLayer(outputSize,'Name','fc') regressionLayer('Name','output')]; ``` 这里`inputSize`表示每个时间步的数据维度大小;`numHiddenUnits`指定了隐藏状态向量的长度;而`outputSize`则是最终预测目标的数量,在本例中等于1,即单一输出[^1]。 #### 数据预处理与划分 对于时间序列分析来说,合理地分割历史观测值至关重要。通常会采用滑动窗口机制来提取特征片段及其对应的标签值。假设已知过去若干时刻的信息有助于推测当前或未来某一刻的状态,则可以通过调整参数控制窗口宽度,如设定为12个单位的时间间隔。 ```matlab windowLength = 12; dataTrain = timetable2table(data(1:trainSize,:)); XTrain = []; YTrain = []; for i = windowLength+1:height(dataTrain) XTrain(:,:,end+1) = dataTrain{i-windowLength:i-1, 'Feature'}; YTrain(end+1,:) = dataTrain{i, 'Target'}; end ``` 上述代码展示了如何基于指定的历史记录长度构造训练样本集合 `XTrain` 和相应的期望输出 `YTrain` 。注意这里的索引是从表格形式转换而来的时间表对象中的行号。 #### 配置训练参数 接下来需指定优化器类型以及其他超参以指导整个学习流程。考虑到计算效率和平稳收敛的需求,Adam算法通常是不错的选择。此外,均方误差(MSE)适合作为目标函数衡量实际结果同理论值之间的差距程度。 ```matlab options = trainingOptions('adam',... 'MaxEpochs',maxEpochs,... 'MiniBatchSize',miniBatchSize,... 'InitialLearnRate',initialLearnRate,... 'GradientThreshold',gradientThreshold,... 'Verbose',false,... 'Plots','training-progress'); ``` 其中`maxEpochs`, `miniBatchSize`, `initialLearnRate`, 及其他变量应依据具体应用场景灵活调节,确保获得满意的泛化性能的同时避免过拟合现象的发生。 #### 训练模型 准备好一切之后就可以调用内置命令启动迭代更新权重的过程了: ```matlab net = trainNetwork(XTrain,YTrain,layers,options); ``` 完成以上步骤后便得到了经过充分训练后的RNN实例——`net` ,可用于后续的新数据推断环节。 #### 进行预测 最后一步便是利用已经建立好的模型对未来趋势做出估计。这可通过简单地传递待测序列至forward pass接口实现: ```matlab YPred = predict(net,XTest); ``` 通过这种方式即可得到针对测试集中各条目的预期响应值 `YPred` 。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值