边写代码边学习之RNN

这篇具有很好参考价值的文章主要介绍了边写代码边学习之RNN。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 什么是 RNN

循环神经网络(Recurrent Neural Network,RNN)是一种以序列数据为输入来进行建模的深度学习模型,它是 NLP 中最常用的模型。其结构如下图:

边写代码边学习之RNN,学习,rnn,人工智能

 x是输入,h是隐层单元,o为输出,L为损失函数,y为训练集的标签.
这些元素右上角带的t代表t时刻的状态,其中需要注意的是,因策单元h在t时刻的表现不仅由此刻的输入决定,还受t时刻之前时刻的影响。V、W、U是权值,同一类型的权连接权值相同。
有了上面的理解,前向传播算法其实非常简单,对于t时刻:
                                       边写代码边学习之RNN,学习,rnn,人工智能

其中为激活函数,一般来说会选择tanh函数,b为偏置。
t时刻的输出就更为简单:
                                                     边写代码边学习之RNN,学习,rnn,人工智能
最终模型的预测输出为:
                                                          
其中为激活函数,通常RNN用于分类,故这里一般用softmax函数。

2. 实验代码

2.1. 搭建一个只有一层RNN和Dense网络的模型。

def simple_rnn_layer():

    # Create a dense layer with 10 output neurons and input shape of (None, 20)
    model = Sequential()
    model.add(SimpleRNN(units=3, input_shape=(3, 2),))  # 3 units in the RNN layer, input_shape=(timesteps, features)
    model.add(Dense(1))  # Output layer with one neuron

    # Print the summary of the dense layer
    print(model.summary())
if __name__ == '__main__':
    simple_rnn_layer()

输出

Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 simple_rnn (SimpleRNN)      (None, 3)                 18        
                                                                 
 dense (Dense)               (None, 1)                 4         
                                                                 
=================================================================
Total params: 22
Trainable params: 22
Non-trainable params: 0
_________________________________________________________________
None

2.2. 验证RNN里的逻辑

边写代码边学习之RNN,学习,rnn,人工智能

写代码验证这个过程,看看结果是不是一样的。

import keras.optimizers.optimizer
import numpy as np
from keras.models import Sequential
from keras.layers import SimpleRNN, Dense
def change_weight():
    # Create a simple Dense layer
    rnn_layer = SimpleRNN(units=3, input_shape=(3, 2), activation=None, return_sequences=True)

    # Simulate input data (batch size of 1 for demonstration)
    input_data = np.array([
                [[1.0, 2], [2, 3], [3, 4]],
                [[5, 6], [6, 7], [7, 8]],
                [[9, 10], [10, 11], [11, 12]]
        ])

    # Pass the input data through the layer to initialize the weights and biases
    _ = rnn_layer(input_data)

    # Access the weights and biases of the dense layer
    kernel, recurrent_kernel, biases = rnn_layer.get_weights()

    # Print the initial weights and biases
    print("recurrent_kernel:", recurrent_kernel) # (3,3)
    print('kernal:',kernel) #(2,3)
    print('biase: ',biases) # (3)

    kernel = np.array([[1, 0, 2], [2, 1, 3]])
    recurrent_kernel = np.array([[1, 2, 1.0], [1, 0, 1], [0, 1, 0]])
    biases = np.array([0, 0, 1.0])

    rnn_layer.set_weights([kernel, recurrent_kernel, biases])
    print(rnn_layer.get_weights())

    test_data = np.array([
        [[1.0, 3], [1, 1], [2, 3]]
    ])

    output = rnn_layer(test_data)

    print(output)

if __name__ == '__main__':
    change_weight()

输出结果如下:可以看到结果是我手算的是一致的。

recurrent_kernel: [[ 0.06973135  0.40464386  0.9118119 ]
 [ 0.6186313  -0.7345941   0.27868783]
 [ 0.7825809   0.5446422  -0.3015495 ]]
kernal: [[-0.48868906  0.52718353 -0.08321357]
 [-1.0569452  -0.9872779   0.72809434]]
biase:  [0. 0. 0.]
[array([[1., 0., 2.],
       [2., 1., 3.]], dtype=float32), array([[1., 2., 1.],
       [1., 0., 1.],
       [0., 1., 0.]], dtype=float32), array([0., 0., 1.], dtype=float32)]
tf.Tensor(
[[[ 7.  3. 12.]
  [13. 27. 16.]
  [48. 45. 54.]]], shape=(1, 3, 3), dtype=float32)

2.3 代码实现一个简单的例子

import keras.optimizers.optimizer
import numpy as np
import tensorflow as tf
from keras.models import Sequential
from keras.layers import SimpleRNN, Dense

# Sample sequential data
# Each sequence has three timesteps, and each timestep has two features
data = np.array([
    [[1, 2], [2, 3], [3, 4]],
    [[5, 6], [6, 7], [7, 8]],
    [[9, 10], [10, 11], [11, 12]]
])


print('data.shape= ',data.shape)
# Define the RNN model
model = Sequential()
model.add(SimpleRNN(units=4, input_shape=(3, 2), name="simpleRNN"))  # 4 units in the RNN layer, input_shape=(timesteps, features)
model.add(Dense(1, name= "output"))  # Output layer with one neuron

# Compile the model
model.compile(loss='mse', optimizer=keras.optimizers.Adam(learning_rate=0.01))

# Print the model summary
model.summary()

before_RNN_weight = model.get_layer("simpleRNN").get_weights()
print('before train ', before_RNN_weight)

# Train the model
model.fit(data, np.array([[10], [20], [30]]), epochs=2000, verbose=1)

RNN_weight = model.get_layer("simpleRNN").get_weights()
print('after train ', len(RNN_weight),)

for i in range(len(RNN_weight)):
    print('====',RNN_weight[i].shape, RNN_weight[i])


# Make predictions
predictions = model.predict(data)
print("Predictions:", predictions.flatten())

代码输出文章来源地址https://www.toymoban.com/news/detail-628136.html

data.shape=  (3, 3, 2)
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 simpleRNN (SimpleRNN)       (None, 4)                 28        
                                                                 
 output (Dense)              (None, 1)                 5         
                                                                 
=================================================================
Total params: 33
Trainable params: 33
Non-trainable params: 0
_________________________________________________________________
before train  [array([[-0.00466371,  0.53100157,  0.5298798 ,  0.05514288],
       [-0.08896947,  0.43185067,  0.7861788 , -0.80616236]],
      dtype=float32), array([[-0.10712242, -0.03620092, -0.02182053, -0.9933471 ],
       [-0.6549012 , -0.02620655,  0.7532524 ,  0.05503315],
       [-0.01986913,  0.9989996 ,  0.02001702, -0.03470401],
       [-0.74781984,  0.00159313, -0.657065  ,  0.09502006]],
      dtype=float32), array([0., 0., 0., 0.], dtype=float32)]
2023-08-05 16:02:44.111298: W tensorflow/tsl/platform/profile_utils/cpu_utils.cc:128] Failed to get CPU frequency: 0 Hz
Epoch 1/2000
....
Epoch 1999/2000
1/1 [==============================] - 0s 11ms/step - loss: 0.0071
Epoch 2000/2000
1/1 [==============================] - 0s 13ms/step - loss: 0.0070
after train  3
==== (2, 4) [[ 0.27645147  0.6025058   1.6083356  -0.38382724]
 [ 0.11586202  0.32901326  1.4760928  -1.2268958 ]]
==== (4, 4) [[-0.99628973 -2.444563    1.7412992  -1.5265529 ]
 [ 0.80340594  0.9488743   2.44552    -0.7439341 ]
 [-0.1827681  -1.3091801   1.547736   -0.6644555 ]
 [-0.5724374   2.3090494  -2.1779017   0.35992467]]
==== (4,) [-0.40184066 -1.2391611   0.33460653 -0.29144585]
1/1 [==============================] - 0s 78ms/step
Predictions: [10.000422 19.999924 29.85534 ]

到了这里,关于边写代码边学习之RNN的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 人工智能:CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的知识梳理

    卷积神经网络(CNN),也被称为ConvNets或Convolutional Neural Networks,是一种深度学习神经网络架构,主要用于处理和分析具有网格状结构的数据,特别是图像和视频数据。CNN 在计算机视觉任务中表现出色,因为它们能够有效地捕获和识别图像中的特征,具有平移不变性(transla

    2024年02月05日
    浏览(68)
  • “AI Earth”人工智能创新挑战赛:助力精准气象和海洋预测Baseline[3]:TCNN+RNN模型、SA-ConvLSTM模型

    【机器学习入门与实践】入门必看系列,含数据挖掘项目实战:模型融合、特征优化、特征降维、探索性分析等,实战带你掌握机器学习数据挖掘 专栏详细介绍:【机器学习入门与实践】合集入门必看系列,含数据挖掘项目实战:数据融合、特征优化、特征降维、探索性分析

    2024年02月11日
    浏览(37)
  • 深度学习RNN,GRU,LSTM文本生成解码器的训练损失讲解(附代码)

    以下以GRU为例讲解RNN作为解码器时如何根据用户、商品特征信息 hidden 生成评价。 解码器部分代码如下: 在训练时,解码器会有两个输入:一是编码器提取的用户、商品特征,二是用户对商品的评价。 评价是文字,在训练开始前已经转换成了Token ID, 比如 I love this item , 每个

    2024年04月12日
    浏览(41)
  • 【Qt】边学边写之Qt教程(零基础)

    打开Qt Creator 界面选择 New Project或者选择菜单栏 【文件】-【新建文件或项目】菜单项 弹出New Project对话框,选择Qt Widgets Application, 选择【Choose】按钮,弹出如下对话框 设置项目名称和路径,按照向导进行下一步, 选择编译套件 向导会默认添加一个继承自QMainWindow的类,可

    2024年01月23日
    浏览(41)
  • 【深度学习】RNN学习笔记

     将单词序列转换为向量,这里有五个单词,然后对于每一个单词都进行独热编码,编码成一个特定的向量。 对于RNN网络,需要一次性读取多个句子,那么涉及到batch_size,这里第二个表达就是:batch,单词,单词的表达方式  这里生成一个5 x 100的向量,对于每一个单词我们都

    2024年02月15日
    浏览(43)
  • 深度学习--RNN基础

    ​RNN(Recurrent Neutral Network,循环神经网络),主要应用于自然语言处理NLP。 因为Pytorch中没有String类型数据,需要引入序列表示法(sequence representation)对文本进行表示。 ​表示方法:[seq_len:一句话的单词数,feature_len:每个单词的表示方法] 文本信息的表达方式: one-hot:多少个

    2023年04月25日
    浏览(32)
  • 深度学习——RNN解决回归问题

    2024年02月16日
    浏览(38)
  • 写点东西《边学边写7 种常见的攻击前端的安全性攻击》

    随着网络应用程序对业务运营变得越来越关键,它们也成为网络攻击更具吸引力的目标。但不幸的是,许多网络开发人员在构建安全前端方面落后于他们的后端和 DevOps 同行。这种差距增加了破坏性数据泄露的风险。 最近发生的事件,例如 Balancer Protocol 漏洞,揭示了攻击者在

    2024年02月02日
    浏览(46)
  • 机器学习&&深度学习——循环神经网络RNN

    👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习深度学习—语言模型和数据集 📚订阅专栏:机器学习深度学习 希望文章对你们有所帮助 在之前介绍了n元语法模型,其中单词xt在时间步t的概率仅取决于前n-1个单词。对于时间步t-(n-1)之前

    2024年02月13日
    浏览(55)
  • 深度学习(2)---循环神经网络(RNN)

     1. 在深度学习中,序列数据(Sequence data)是指具有 前后顺序关联 的数据。常见的时间序列数据、文本数据(单词序列或字符序列)、语音数据等。这种数据不仅十分常见,而且往往具有很高的应用价值,比如我们可以通过过去的天气数据来预测未来的天气状况,通过以往

    2024年02月07日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包