[自然语言处理]RNN

1 传统RNN模型与LSTM

python 复制代码
import torch
import torch.nn as nn

torch.manual_seed(6)


# todo:基础RNN模型
def dem01():
    '''
    参数1:input_size 每个词的词向量维度(输入层神经元的个数)
    参数2:hidden_size 隐藏层神经元的个数
    参数3:hidden_layer 隐藏层的层数
    '''
    rnn = nn.RNN(5, 6, 1)
    '''
    参数1:sequence_length 每个样本的句子长度
    参数2:batch_size 每个批次的样本数量
    参数3:input_size 每个词的词向量维度(输入层神经元的个数)
    '''
    input = torch.randn(1, 3, 5)
    '''
    参数1:hidden_layer 隐藏层的层数
    参数2:batch_size 每个批次的样本数量
    参数3:hidden_size 隐藏层神经元的个数
    '''
    h0 = torch.randn(1, 3, 6)
    output, hn = rnn(input, h0)
    print(f'output {output}')
    print(f'hn {hn}')
    print(f'RNN模型 {rnn}')


# todo:增加输入的sequence_length
def dem02():
    '''
    参数1:input_size 每个词的词向量维度(输入层神经元的个数)
    参数2:hidden_size 隐藏层神经元的个数
    参数3:hidden_layer 隐藏层的层数
    '''
    rnn = nn.RNN(5, 6, 1)
    '''
    参数1:sequence_length 每个样本的句子长度
    参数2:batch_size 每个批次的样本数量
    参数3:input_size 每个词的词向量维度(输入层神经元的个数)
    '''
    input = torch.randn(4, 3, 5)
    '''
    参数1:hidden_layer 隐藏层的层数
    参数2:batch_size 每个批次的样本数量
    参数3:hidden_size 隐藏层神经元的个数
    '''
    h0 = torch.randn(1, 3, 6)
    output, hn = rnn(input, h0)
    print(f'output {output}')
    print(f'hn {hn}')
    print(f'RNN模型 {rnn}')


# todo:增加隐藏层的个数
def dem03():
    '''
    参数1:input_size 每个词的词向量维度(输入层神经元的个数)
    参数2:hidden_size 隐藏层神经元的个数
    参数3:hidden_layer 隐藏层的层数
    '''
    rnn = nn.RNN(5, 6, 2)
    '''
    参数1:sequence_length 每个样本的句子长度
    参数2:batch_size 每个批次的样本数量
    参数3:input_size 每个词的词向量维度(输入层神经元的个数)
    '''
    input = torch.randn(4, 3, 5)
    '''
    参数1:hidden_layer 隐藏层的层数
    参数2:batch_size 每个批次的样本数量
    参数3:hidden_size 隐藏层神经元的个数
    '''
    h0 = torch.randn(2, 3, 6)
    output, hn = rnn(input, h0)
    print(f'output {output}')
    print(f'hn {hn}')
    print(f'RNN模型 {rnn}')


# todo:一个一个地向模型输入单词-全零初始化
def dem04_1():
    '''
    参数1:input_size 每个词的词向量维度(输入层神经元的个数)
    参数2:hidden_size 隐藏层神经元的个数
    参数3:hidden_layer 隐藏层的层数
    '''
    rnn = nn.RNN(5, 6, 1)
    '''
    参数1:sequence_length 每个样本的句子长度
    参数2:batch_size 每个批次的样本数量
    参数3:input_size 每个词的词向量维度(输入层神经元的个数)
    '''
    input = torch.randn(4, 1, 5)
    print(f'input {input}')
    '''
    参数1:hidden_layer 隐藏层的层数
    参数2:batch_size 每个批次的样本数量
    参数3:hidden_size 隐藏层神经元的个数
    '''
    # 每个样本一次性输入神经网络
    hn = torch.zeros(1, 1, 6)
    print(f'hn1 {hn}')
    output, hn = rnn(input, hn)
    print(f'output1 {output}')
    print(f'hn1 {hn}')
    print(f'RNN模型1 {rnn}')
    print('*' * 80)
    # 每个样本逐词送入神经网络
    hn = torch.zeros(1, 1, 6)
    print(f'hn2 {hn}')
    for i in range(4):
        tmp = input[i][0]
        print(f'tmp.shape {tmp.shape}')
        output, hn = rnn(tmp.unsqueeze(0).unsqueeze(0), hn)
        print(f'{i}-output {output}')
        print(f'{i}-hn {hn}')


# todo:一个一个地向模型输入单词-全一初始化
def dem04_2():
    '''
    参数1:input_size 每个词的词向量维度(输入层神经元的个数)
    参数2:hidden_size 隐藏层神经元的个数
    参数3:hidden_layer 隐藏层的层数
    '''
    rnn = nn.RNN(5, 6, 1)
    '''
    参数1:sequence_length 每个样本的句子长度
    参数2:batch_size 每个批次的样本数量
    参数3:input_size 每个词的词向量维度(输入层神经元的个数)
    '''
    input = torch.randn(4, 1, 5)
    print(f'input {input}')
    '''
    参数1:hidden_layer 隐藏层的层数
    参数2:batch_size 每个批次的样本数量
    参数3:hidden_size 隐藏层神经元的个数
    '''
    # 每个样本一次性输入神经网络
    hn = torch.ones(1, 1, 6)
    print(f'hn1 {hn}')
    output, hn = rnn(input, hn)
    print(f'output1 {output}')
    print(f'hn1 {hn}')
    print(f'RNN模型1 {rnn}')
    print('*' * 80)
    # 每个样本逐词送入神经网络
    hn = torch.ones(1, 1, 6)
    print(f'hn2 {hn}')
    for i in range(4):
        tmp = input[i][0]
        print(f'tmp.shape {tmp.shape}')
        output, hn = rnn(tmp.unsqueeze(0).unsqueeze(0), hn)
        print(f'{i}-output {output}')
        print(f'{i}-hn {hn}')


# todo:一个一个地向模型输入单词-随机初始化
def dem04_3():
    '''
    参数1:input_size 每个词的词向量维度(输入层神经元的个数)
    参数2:hidden_size 隐藏层神经元的个数
    参数3:hidden_layer 隐藏层的层数
    '''
    rnn = nn.RNN(5, 6, 1)
    '''
    参数1:sequence_length 每个样本的句子长度
    参数2:batch_size 每个批次的样本数量
    参数3:input_size 每个词的词向量维度(输入层神经元的个数)
    '''
    input = torch.randn(4, 1, 5)
    print(f'input {input}')
    '''
    参数1:hidden_layer 隐藏层的层数
    参数2:batch_size 每个批次的样本数量
    参数3:hidden_size 隐藏层神经元的个数
    '''
    # 每个样本一次性输入神经网络
    hn = torch.randn(1, 1, 6)
    print(f'hn1 {hn}')
    output, hn = rnn(input, hn)
    print(f'output1 {output}')
    print(f'hn1 {hn}')
    print(f'RNN模型1 {rnn}')
    print('*' * 80)
    # 每个样本逐词送入神经网络
    hn = torch.randn(1, 1, 6)
    print(f'hn2 {hn}')
    for i in range(4):
        tmp = input[i][0]
        print(f'tmp.shape {tmp.shape}')
        output, hn = rnn(tmp.unsqueeze(0).unsqueeze(0), hn)
        print(f'{i}-output {output}')
        print(f'{i}-hn {hn}')


# todo:设置batch_first=True
def dem05():
    '''
    参数1:input_size 每个词的词向量维度(输入层神经元的个数)
    参数2:hidden_size 隐藏层神经元的个数
    参数3:hidden_layer 隐藏层的层数
    '''
    rnn = nn.RNN(5, 6, 1, batch_first=True)
    '''
    参数1:batch_size 每个批次的样本数量
    参数2:sequence_length 每个样本的句子长度
    参数3:input_size 每个词的词向量维度(输入层神经元的个数)
    '''
    input = torch.randn(3, 4, 5)
    '''
    参数1:hidden_layer 隐藏层的层数
    参数2:batch_size 每个批次的样本数量
    参数3:hidden_size 隐藏层神经元的个数
    '''
    h0 = torch.randn(1, 3, 6)
    output, hn = rnn(input, h0)
    print(f'output {output}')
    print(f'hn {hn}')
    print(f'RNN模型 {rnn}')


# todo:基础LSTM模型
def dem06_1():
    '''
    参数1:input_size 每个词的词向量维度(输入层神经元的个数)
    参数2:hidden_size 隐藏层神经元的个数
    参数3:hidden_layer 隐藏层的层数
    '''
    rnn = nn.LSTM(5, 6, 2)
    '''
    参数1:batch_size 每个批次的样本数量
    参数2:sequence_length 每个样本的句子长度
    参数3:input_size 每个词的词向量维度(输入层神经元的个数)
    '''
    input = torch.randn(1, 3, 5)
    '''
    参数1:hidden_layer 隐藏层的层数
    参数2:batch_size 每个批次的样本数量
    参数3:hidden_size 隐藏层神经元的个数
    '''
    h0 = torch.randn(2, 3, 6)
    '''
    参数1:hidden_layer 隐藏层的层数
    参数2:batch_size 每个批次的样本数量
    参数3:hidden_size 隐藏层神经元的个数
    '''
    c0 = torch.randn(2, 3, 6)
    output, (hn, cn) = rnn(input, (h0, c0))
    print(f'output {output}')
    print(f'hn {hn}')
    print(f'cn {cn}')

# todo:双向LSTM模型
def dem06_2():
    '''
    参数1:input_size 每个词的词向量维度(输入层神经元的个数)
    参数2:hidden_size 隐藏层神经元的个数
    参数3:hidden_layer 隐藏层的层数
    '''
    rnn = nn.LSTM(5, 6, 2,bidirectional=True)
    '''
    参数1:batch_size 每个批次的样本数量
    参数2:sequence_length 每个样本的句子长度
    参数3:input_size 每个词的词向量维度(输入层神经元的个数)
    '''
    input = torch.randn(1, 3, 5)
    '''
    参数1:hidden_layer 隐藏层的层数
    参数2:batch_size 每个批次的样本数量
    参数3:hidden_size 隐藏层神经元的个数
    '''
    h0 = torch.randn(4, 3, 6)
    '''
    参数1:hidden_layer 隐藏层的层数
    参数2:batch_size 每个批次的样本数量
    参数3:hidden_size 隐藏层神经元的个数
    '''
    c0 = torch.randn(4, 3, 6)
    output, (hn, cn) = rnn(input, (h0, c0))
    print(f'output {output}')
    print(f'hn {hn}')
    print(f'cn {cn}')


if __name__ == '__main__':
    # dem01()
    # dem02()
    # dem03()
    # dem04_1()
    # dem04_2()
    # dem04_3()
    # dem05()
    # dem06_1()
    dem06_2()
bash 复制代码
D:\nlplearning\nlpbase\python.exe D:\nlpcoding\rnncode.py 
output tensor([[[ 0.0207, -0.1121, -0.0706,  0.1167, -0.3322, -0.0686],
         [ 0.1256,  0.1328,  0.2361,  0.2237, -0.0203, -0.2709],
         [-0.2668, -0.2721, -0.2168,  0.4734,  0.2420,  0.0349]]],
       grad_fn=<MkldnnRnnLayerBackward0>)
hn tensor([[[ 0.1501, -0.2106,  0.0213,  0.1309,  0.3074, -0.2038],
         [ 0.3639, -0.0394, -0.1912,  0.1282,  0.0369, -0.1094],
         [ 0.1217, -0.0517,  0.1884, -0.1100, -0.5018, -0.4512]],

        [[ 0.0207, -0.1121, -0.0706,  0.1167, -0.3322, -0.0686],
         [ 0.1256,  0.1328,  0.2361,  0.2237, -0.0203, -0.2709],
         [-0.2668, -0.2721, -0.2168,  0.4734,  0.2420,  0.0349]]],
       grad_fn=<StackBackward0>)
cn tensor([[[ 0.2791, -0.7362,  0.0501,  0.2612,  0.4655, -0.2338],
         [ 0.7902, -0.0920, -0.4955,  0.3865,  0.0868, -0.1612],
         [ 0.2312, -0.3736,  0.4033, -0.1386, -1.0151, -0.5971]],

        [[ 0.0441, -0.2279, -0.1483,  0.3397, -0.5597, -0.4339],
         [ 0.2154,  0.4119,  0.4723,  0.4731, -0.0284, -1.1095],
         [-0.5016, -0.5146, -0.4286,  1.5299,  0.5992,  0.1224]]],
       grad_fn=<StackBackward0>)

Process finished with exit code 0

2 GRU

python 复制代码
import torch
import torch.nn as nn


# todo:基础GRU
def dem01():
    gru = nn.GRU(5, 6, 1)
    input = torch.randn(4, 3, 5)
    h0 = torch.randn(1, 3, 6)
    output, hn = gru(input, h0)
    print(f'output {output}')
    print(f'hn {hn}')


if __name__ == '__main__':
    dem01()
相关推荐
学术头条2 小时前
清华、智谱团队:探索 RLHF 的 scaling laws
人工智能·深度学习·算法·机器学习·语言模型·计算语言学
18号房客2 小时前
一个简单的机器学习实战例程,使用Scikit-Learn库来完成一个常见的分类任务——**鸢尾花数据集(Iris Dataset)**的分类
人工智能·深度学习·神经网络·机器学习·语言模型·自然语言处理·sklearn
Ven%2 小时前
如何在防火墙上指定ip访问服务器上任何端口呢
linux·服务器·网络·深度学习·tcp/ip
IT猿手2 小时前
最新高性能多目标优化算法:多目标麋鹿优化算法(MOEHO)求解TP1-TP10及工程应用---盘式制动器设计,提供完整MATLAB代码
开发语言·深度学习·算法·机器学习·matlab·多目标算法
强哥之神3 小时前
Nexa AI发布OmniAudio-2.6B:一款快速的音频语言模型,专为边缘部署设计
人工智能·深度学习·机器学习·语言模型·自然语言处理·音视频·openai
18号房客3 小时前
一个简单的深度学习模型例程,使用Keras(基于TensorFlow)构建一个卷积神经网络(CNN)来分类MNIST手写数字数据集。
人工智能·深度学习·机器学习·生成对抗网络·语言模型·自然语言处理·tensorflow
神秘的土鸡3 小时前
神经网络图像隐写术:用AI隐藏信息的艺术
人工智能·深度学习·神经网络
数据分析能量站3 小时前
神经网络-LeNet
人工智能·深度学习·神经网络·机器学习
Jaly_W3 小时前
用于航空发动机故障诊断的深度分层排序网络
人工智能·深度学习·故障诊断·航空发动机
FL16238631294 小时前
钢材缺陷识别分割数据集labelme格式693张4类别
深度学习