MXNet:深度学习——模型构造

一、Block类

Block类是nn模块里提供的一个构造类,可以继承它来定义想要的模型。实现一个模型一般要重载Block类的__init__函数和forward函数,它们分别用于创建模型参数和定义前向计算。实例化这个子类可以得到模型变量net,初始化net并传入输入数据X做一次前向计算,net(X)会调用Block类的__call__函数,这个函数会调用子类定义的forward函数来完成前向计算,如下图所示。
MXNet:深度学习——模型构造_第1张图片

二、Sequential类

Sequential类继承自Block类,当模型的前向计算为简单串联各个层的计算时,可以通过Sequential类实现,它提供add函数来逐一添加串联的Block子类实例,而模型的前向计算就是将这些实例按添加的顺序逐一计算。

三、循环神经网络实现

1、构造循环神经网络层,并初始化
在这里插入图片描述
RNN的主要参数如下所示:
1、hidden_size (int) – 隐藏单元个数(特征个数)
2、num_layers (int, default 1) – 隐藏层个数
3、activation ({‘relu’ or ‘tanh’}, default ‘relu’) – 激活函数
4、layout (str, default ‘TNC’) – 输入和输出的格式,默认格式是(时间步数、批量大小、特征个数)
5、bidirectional (bool, default False) – 如果是True,变为双向RNN
6、i2h_weight_initializer (str or Initializer) –输入权重矩阵的初始化
7、h2h_weight_initializer (str or Initializer) –隐藏层权重矩阵的初始化
8、i2h_bias_initializer (str or Initializer) –输入偏差向量的初始化
9、h2h_bias_initializer (str or Initializer) –隐藏层偏差向量的初始化
6、7、8、9是权重和偏差的初始化,默认情况下偏差参数全部清零、权重每个元素随机采样于-0.07-0.07之间的均匀分布
2、调用rnn_layer的成员函数begin_state()来返回初始化的隐藏状态列表,参数是批量大小
在这里插入图片描述
state的形状为(隐藏层个数、批量大小、隐藏单元个数)
3、前向计算
在这里插入图片描述
前向计算有两个参数imputs和states
inputs (sym.Variable) – 当layout是TNC时,形状为(时间步数、批量大小、输入个数)
states (list of sym.Variable) – RNN state from previous step or the output of begin_state().
前向计算后返回输出和隐藏状态
输出:当layout时TNC时,形状为 (时间步数, 批量大小, 隐藏单元个数)
隐藏状态: output recurrent state tensor with the same shape as states,形状为(隐藏层个数、批量大小、隐藏单元个数)

综上所述,一个完整的循环神经网络如下所示

from mxnet import ndarray as nd
from mxnet.gluon import rnn, nn

num_hiddens = 256
rnn_layer = rnn.RNN(num_hiddens)

class RNNModel(nn.Block):
    def __init__(self, rnn_layer, output_size, **kwargs):
        super(RNNModel, self).__init__(**kwargs)
        self.rnn = rnn_layer
        self.output_size = output_size
        self.dense = nn.Dense(output_size)

    def forward(self, inputs, state):
        Y, state = self.rnn(inputs, state)
        output = self.dense(Y.reshape((-1, Y.shape[-1])))
        return output, state

    def begin_state(self, *args, **kwargs):
        return self.rnn.begin_state(*args, **kwargs)

四、门控循环单元(GRU)实现

只需要将

rnn_layer = rnn.RNN(num_hiddens)

替换为

gru_layer = rnn.GRU(num_hiddens)

五、长短期记忆(LSTM)实现

只需要将

rnn_layer = rnn.RNN(num_hiddens)

替换为

lstm_layer = rnn.LSTM(num_hiddens)

你可能感兴趣的:(深度学习)