tensorflow中的RNN与LSTM函数异同点分析

本文通过具体示例对比了循环神经网络(RNN)与长短期记忆网络(LSTM)的不同之处,包括它们如何处理变长数据、是否能添加遗忘值及输入输出的维度差异。
import tensorflow as tf
import numpy as np

# X = np.random.randn(2, 5, 2)
X = np.array([[[0.1,0.2],[0.3,0.4],[0.5,0.6],[0.7,0.8],[0.9,0.1]],[[0.1,0.9],[0.8,0.7],[0.6,0.5],[0.4,0.3],[0.2,0.1]]])

#################################################################################
################                  测试RNN                        ################

xRNN = tf.unstack(X,axis=1)  # 转为成list             input [batch_size, input_size]

cellRNN = tf.contrib.rnn.BasicRNNCell(4)

outputsRNN, last_statesRNN = tf.contrib.rnn.static_rnn(
    cell=cellRNN,
    dtype=tf.float64,
    sequence_length=None,
    inputs=xRNN)
resultRNN = tf.contrib.learn.run_n(
    {"outputs": outputsRNN, "last_states": last_statesRNN},
    n=1,
    feed_dict=None)
print 'RNN的输入情况:'
print len(resultRNN)
print resultRNN[0]
print



#################################################################################
################                  测试LSTM                        ################
xLSTM = X                                       # input [batch_size,max_time, input_size]
# 第二个example长度为3
xLSTM[1,3:] = 0
xLSTM_lengths = [5, 3]

cellLSTM = tf.contrib.rnn.BasicLSTMCell(num_units=4, state_is_tuple=True)
outputsLSTM, last_statesLSTM = tf.nn.dynamic_rnn(
    cell=cellLSTM,
    dtype=tf.float64,
    sequence_length=xLSTM_lengths,
    inputs=xLSTM)

resultLSTM = tf.contrib.learn.run_n(
    {"outputs": outputsLSTM, "last_states": last_statesLSTM},
    n=1,
    feed_dict=None)
print 'LSTM的输入情况:'
print len(resultLSTM)
print resultLSTM[0]
print


不同点:

1,是否可以处理变长数据的情况

2,是否可以添加遗忘值

3,输入的维度不一样


RNN

很明显,这个输入是一个list,len(list)=步长 list[0].shape=[batch,input]
这个输出和输入一样是个list,len(list)=步长,list[0].shape=[batch,hidden]
所以output=outputs[-1] 就取到了最后一步的ouput



LSTM

输入是    [[batch,步长,input]
输出是   [batch,n_steps,n_hidden]
需要tf.transpose(outputs, [1, 0, 2]),这样就可以取到最后一步的output

 outputs = tf.unstack(tf.transpose(outputs, [1, 0, 2])) # 将tensor解开成list
 results = tf.matmul(outputs[-1],weights['out']) + biases['out']


### LSTM 和 随机森林回归模型的异同 #### 不同 1. **模型本质** - LSTM 是一种特殊的循环神经网络(RNN),专门设计用于捕捉序列数据中的长期依赖关系。它通过引入遗忘门、输入门和输出门等机制,有效缓解了传统 RNN 的梯度消失问题[^1]。 - 随机森林是一种基于决策树的集成学习方法,通过对多棵决策树的结果进行投票或取平均值来提高预测性能。它的核心在于利用 bagging 技术降低单棵树的方差。 2. **适用场景** - LSTM 更适合处理具有时间依赖性的序列数据,例如股票价格预测、语音识别和自然语言处理等领域。由于其能够记住历史信息并将其融入当前预测中,因此在时序建模方面表现出色[^1]。 - 随机森林适用于结构化表格数据的任务,在分类和回归问题上均有良好表现。对于非时序数据或者不需要考虑顺序关系的情况,随机森林通常是一个高效的选择[^1]。 3. **计算复杂度** - 训练一个 LSTM 模型往往需要更多的计算资源和时间,尤其是当序列长度较长时。这是因为 LSTM 中存在复杂的矩阵运算以及反向传播过程中对参数更新的要求较高。 - 相比之下,随机森林虽然也需要一定的时间构建多颗树,但总体来说训练速度更快,尤其是在小型到中型规模的数据集上更加明显。 4. **可解释性** - LSTM 属于典型的黑箱模型,内部工作机制较为抽象难以直观理解。尽管可以通过一些技术手段部分揭示其工作原理,但对于大多数用户而言仍然不够透明。 - 而随机森林提供了较高的可解释性,比如可以直接查看每棵树的分裂规则或是特征重要性得分,这有助于业务人员更好地理解和应用模型结果。 5. **过拟合风险** - 如果没有适当调节超参如正则化强度,则容易发生过拟合现象;另外还需要小心设置层数数目以免造成容量过大而无法泛化新样本。 - 对于随机森林,默认情况下不容易出现严重的过拟合状况因为每次抽样都是独立完成并且采用了bootstrap aggregating策略减少了个体偏差带来的影响。 #### 相同 1. **目标一致** - 无论是LSTM还是随机森林,它们的主要目的都是为了从给定的数据集中找出潜在规律,并据此对未来未知事件作出合理推测即解决监督学习下的回归任务需求。 2. **都需要调优过程** - 这两种算法都涉及众多超参数调整环节以达到最佳效果。例如针对LSTM需确定隐层大小、激活函数种类、dropout比例等等;而对于随机森林则是估计树木总数目、最大深度限制等因素。 3. **支持多种损失函数定义方式** - 用户可以根据具体应用场景定制相应的代价衡量标准指导优化方向。像均方误差(MSE)就是两者常用的一个选项用来评估连续数值型输出的质量高低差异程度如何接近真实值水平线上下波动范围内的精确度表现情况怎样等问题解答思路如下所示代码片段展示了一个简单的例子说明如何分别实现这两种方法来进行房价估值预测操作演示: ```python from sklearn.ensemble import RandomForestRegressor import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import LSTM, Dense # Random Forest Example rf_model = RandomForestRegressor(n_estimators=100, random_state=42) # LSTM Example lstm_model = Sequential([ LSTM(50, activation='relu', input_shape=(n_timesteps, n_features)), Dense(1) ]) lstm_model.compile(optimizer='adam', loss='mse') ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值