PyTorch中的循环神经网络RNN函数及词嵌入函数介绍

技术交流QQ群:1027579432,欢迎你的加入!

一、pytroch中的RNN相关函数介绍

  • 1.对于简单的RNN结构,有两种方式进行调用:


    RNN基本结构.png

    RNN展开形式.png
    • 1.1 torch.nn.RNN():可以接收一个序列的输入,默认会传入全0的隐藏状态,也可以自己定义初始的隐藏状态
      • 参数介绍:
        • input_size:输入x的特征数量
        • hiddien_size:隐藏层的特征数量
        • num_layers:RNN的层数
        • nonlinearity:指定使用的非线性激活函数是tanh还是relu,默认是tanh
        • bias:如果是False,那么RNN层就不会使用偏置权重b_ih和b_hh,默认是True
        • batch_first:如果是True,那么输入的Tensor的shape是[batch_size, time_step, feature],输出也是[batch_size, time_step, feature],默认是False,即[time_step, batch_size, feature]
        • dropout:如果值是非零,那么除最后一层外,其他层的输出都会套上一个dropout层
        • bidirectional:如果是True,将是一个双向RNN,默认是False
      • RNN的输入:(input, h_0)
        • input shape: [time_step, batch_size, feature]
        • h_0 shape: [num_layers*num_directions, batch_size, hidden_size] # num_directions参数的值由参数bidirectional决定
      • RNN的输出: (output, h_n)
        • output shape: [time_step, batch_size, hidden_sizenum_directions]
          对于输入序列的每个元素,RNN每层的计算公式是: h_t = tanh((w_ih
          x_t+b_ih)+(w_hh*h_t-1+b_hh))
      • RNN的模型参数:
        • w_ih:第k层的input-hidden权重 [input_size,hidden_size]
        • w_hh:第k层的hidden-hidden权重 [hidden_size,hidden_size]
        • b_ih:第k层的input-hidden偏置 [hidden_size]
        • b_hh:第k层的hidden-hidden偏置 [hidden_size]
            import torch
            import torch.nn as nn
            import torch.optim as optim
            import torch.nn.functional as F
            import numpy as np
        
            rnn = nn.RNN(10, 20, 1)
            inputs = torch.randn(5, 3, 10)
            h0 = torch.randn(1, 3, 20)
            output, hn = rnn(inputs, h0)
            print("RNN的输出:\n", output)
            for param in list(rnn.parameters()):
                  print("{} shape的大小是:{}".format(param, param.size()))
        
  • 1.2 torch.nn.RNNCell():只能接收序列中的单步的输入,且必须传入隐藏状态
    • 参数介绍:
      • input_size:输入特征的数量
      • hidden_size: 隐藏层特征的数量
      • bias:默认是True,如果是Flase,RNN cell中将不会加入bias
      • nonlinearity:指定使用的非线性激活函数是tanh还是relu,默认是tanh
    • RNNCell的输入: (input, hidden)
      • input shape:[batch_size, input_size]
      • hidden shape:[batch_size, hidden_size]
    • RNNCell的输出:h
      • h shape:[batch, hidden_size] 下一个时刻的隐藏状态
        对于输入序列的每个元素,RNNCell每层的计算公式是: h_t = tanh((w_ihx+b_ih)+(w_hhh+b_hh))
    • RNNCell的模型参数:
      • w_ih:input-hidden权重 [input_size,hidden_size]
      • w_hh:hidden-hidden权重 [hidden_size,hidden_size]
      • b_ih:input-hidden偏置 [hidden_size]
      • b_hh:hidden-hidden偏置 [hidden_size]
        rnncell = nn.RNNCell(input_size=10, hidden_size=20)
        inputs = torch.randn(6, 3, 10)  # 6表示下面循环6次
        h = torch.randn(3, 20)
        output = []
        for i in range(6):
            h = rnncell(inputs[i], h)
            output.append(h)
        print("RNNCell的输出:\n", output)
        for param in list(rnncell.parameters()):
                print("{} shape的大小是:{}".format(param, param.size()))
      
  • 2.对于简单的LSTM结构,有两种方式进行调用:


    lstm.gif
    • 2.1 torch.nn.LSTM()
      • 参数:
        • input_size:输入特征的维度
        • hidden_size:隐藏层的特征维度
        • num_layers:层数
        • bias:如果是True,那么将不会使用bias,默认是True
        • batch_first:如果是True,那么输入的Tensor的shape是[batch_size, time_step, feature],输出也是[batch_size, time_step, feature],默认是False,即[time_step, batch_size, feature]
        • dropout:如果值是非零,那么除最后一层外,其他层的输出都会套上一个dropout层
        • bidirectional:如果是True,将是一个双向RNN,默认是False
      • LSTM的输入:[input,(h_0, c_0)]
        • input shape:(seq_len, batch_size, input_size)
        • h_0 shape:(num_layers*num_directions, batch_size, hidden_size)
        • c_0 shape:(num_layers*num_directions, batch_size, hidden_size)
      • LSTM的输出:[output,(h_n,c_n)]
        • output shape:[seq_len, batch_size, hidden_size * num_directions]
        • h_n shape: [num_layers * num_directions, batch_size, hidden_size]
        • c_n shape: [num_layers * num_directions, batch_size, hidden_size]
      • LSTM的模型参数:
        • w_ih:input-hidden的权重(w_ii,w_if,w_ig, w_io) [input_size,4*hidden_size]
        • w_hh:hidden-hidden的权重(w_hi,w_hf,w_hg,w_ho) [hidden_size,4*hidden_size]
        • b_ih:input-hidden的偏置(b_ii,b_if,b_ig, b_io) [4*hidden_size]
        • b_hh:hidden-hidden的偏置(b_hi,b_hf,b_hg,b_ho) [4*hidden_size]
        lstm = nn.LSTM(10, 20, 2)
        inputs = torch.randn(5, 3, 10)
        h0 = torch.randn(2, 3, 20)
        c0 = torch.randn(2, 3, 20)
        output, h_n = lstm(inputs, (h0, c0))
        print("output:\n", output)
        print("h_n:\n", h_n)
      
    • 2.2 torch.nn.LSTMCell()
      • 参数:
        • input_size:输入特征的数量
        • hidden_size: 隐藏层特征的数量
        • bias:默认是True,如果是Flase,RNN cell中将不会加入bias
      • LSTMCell的输入input:[input, (h_0,c_0)]
        • input: (seq_len, batch_size, input_size)
        • h_0: (batch_size, hidden_size)
        • c_0: (batch_size, hidden_size)
      • LSTMCell的输出output:[h1,c1]
        • h_1:(batch_size, hidden_size)
        • c_1:(batch_size,hidden_size)
      • LSTM的模型参数:
        • w_ih:input-hidden的权重(w_ii,w_if,w_ig, w_io) [input_size,4*hidden_size]
        • w_hh:hidden-hidden的权重(w_hi,w_hf,w_hg,w_ho) [hidden_size,4*hidden_size]
        • b_ih:input-hidden的偏置(b_ii,b_if,b_ig, b_io) [4*hidden_size]
        • b_hh:hidden-hidden的偏置(b_hi,b_hf,b_hg,b_ho) [4*hidden_size]
        lstm_cell = nn.LSTMCell(10, 20)
        inputs = torch.randn(6, 3, 10)
        h_x = torch.randn(3, 20)
        c_x = torch.randn(3, 20)
        output = []
        for i in range(6):
            h_x, c_x = lstm_cell(inputs[i], (h_x, c_x))
            output.append(h_x)
        print("output:\n", output)
        
  • 3.对于简单的GRU结构,有两种方式进行调用:


    gru.gif
    • 3.1 torch.nn.GRU()
      • 参数:
        • input_size:输入特征的维度
        • hidden_size:隐藏层的特征维度
        • num_layers:层数
        • bias:如果是True,那么将不会使用bias,默认是True
        • batch_first:如果是True,那么输入的Tensor的shape是[batch_size, time_step, feature],输出也是[batch_size, time_step, feature],默认是False,即[time_step, batch_size, feature]
        • dropout:如果值是非零,那么除最后一层外,其他层的输出都会套上一个dropout层
        • bidirectional:如果是True,将是一个双向RNN,默认是False
      • 输入:input,h_0
        • input shape:[seq_len, batch_size, input_size]
        • h_0 shape:[num_layers*num_directions, batch_size, hidden_size]
      • 输出:output,h_n
        • output shape: [seq_len, batch_size, hidden_size*num_directions]
        • h_n shape: [num_layers*num_directions, batch_size, hidden_size]
      • GRU模型的参数:
        • wih_l[k]:第k层可以学习的input-hidden权重(w_ir,w_ii,win),[input_shape,3*hidden_size]
        • w_hh_l[k]:第k层可以学习的hidden-hidden权重(w_hr,w_hi,w_hn),[hidden_size,3*hidden_size]
        • bias_ih_l[k]:第k层的可学习的input-hidden偏置(b_ir,b_ii,b_in),[3*hidden_size]
        • bias_hh_l[k]:第k层的可学习的hidden-hidden偏置(b_hr,b_hi,b_hn) [3*hidden_size]
        gru = nn.GRU(10, 20, 2)
        inputs = torch.randn(5, 3, 10)
        h0 = torch.randn(2, 3, 20)
        output = gru(inputs, h0)
        print("output:\n", output)
        
    • 3.2 nn.GRUCell()
      • 参数:
        • input_size:输入特征的数量
        • hidden_size: 隐藏层特征的数量
        • bias:默认是True,如果是Flase,RNN cell中将不会加入bias
        • nonlinearity:指定使用的非线性激活函数是tanh还是relu,默认是tanh
      • 输入:[input, hidden]
        • input shape: (batch_size, input_size)
        • hidden shape: (batch_size, hidden_size)
      • 输出:h
        • h shape:[batch_size, hidden_size]
      • GRUCell模型参数
        • w_ih:input-hidden权重,[input_size, hidden_size]
        • w_hh:hidden-hidden权重,[hidden_size,hidden_size]
        • b_ih:input-hidden偏置,[hidden_size]
        • b_hh:hidden-hidden偏置,[hidden_size]
        gru_cell = nn.RNNCell(10, 20)
        input = torch.randn(6, 3, 10)
        hx = torch.randn(3, 20)
        output = []
        for i in range(6):
            hx = gru_cell(input[i], hx)
            output.append(hx)
        print("output:\n", output)
        

二、词嵌入模型介绍

  • 在 PyTorch中使用 nn.Embedding 层来做嵌入词袋模型,Embedding层第一个输入表示词汇表中的单词总数,第二个输入表示词向量的维度,一般是100~500
embedding = nn.Embedding(10, 3)
input = torch.LongTensor([[1, 2, 4, 5], [4, 3, 2, 9]])
output = embedding(input)
print(output.size())
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容