import torch
from torch import nn
import numpy as np
from torch import optim
rnn = nn.RNN(input_size=100,hidden_size=10,num_layers=2)
'''
其实我觉得,可以把input_size看为原始特征个数,hidden_size就是特征提取之后的特征个数(CNN中就是feature_maps的数量)
与CNN或者一般FNN不同的是,CNN每层的feature_maps的数量可以改变,比如我最开始输入的特征数量是28*28=784
通过设置第一层的feature_maps的数量为100,我把特征个数改变到了100;再通过设置第二层的feature_maps的数量为50,我又可以把特征个数变成50...
FNN中,我设置第一层的参数矩阵的size是784*100,就把特征个数变成100;再设置第二层的参数矩阵的size是100*50,就把特征个数变成了50
但是在多层RNN中,每一层的特征个数是不变的,比如这里我原始的特征个数是100,通过第一层RNN后,我特征个数变成了10,
但是后面不管如何增加RNN的层数,我的特征个数永远都是10了,因为我的hidden_size已经固定在10了。
也就是说,除了第一层的weight_ih的size是原始特征个数*hidden_size以外,
其他层的weight_ih size都是hidden_size*hidden_size(这里没有考虑batch_size)
'''
rnn._parameters.keys()
'''
(以下关于size的讨论都没有考虑batch_size)
weight_ih代表与x相乘的参数矩阵 l0表示layer0,即第一层;在这个网络中,weight_ih_l0的size是10*100
weight_hh表示与h相乘的参数矩阵,likewise,l0表示第一层;在这个网络中,weight_hh_l0的size是10*10
bias_hh_l0表示第一层的bias,size是10
weight_ih_l1的size是10*10
weight_hh_l1的size是10*10
bias_hh_l1的size是10
'''
odict_keys(['weight_ih_l0', 'weight_hh_l0', 'bias_ih_l0', 'bias_hh_l0', 'weight_ih_l1', 'weight_hh_l1', 'bias_ih_l1', 'bias_hh_l1'])
x = torch.randn([10,3,100])
h0 = torch.zeros([2,3,10])
'''
初始化h0,这里我们全部初始化为0,如果不给h0的话,RNN也会随机初始化。
2表示有两层RNN,每层RNN都要有h0
3表示有3句话,或者说batch_size是3;每个句子都要有一个h0矩阵
10是hidden_size是10
'''
out,h = rnn(x,h0)
out.size