比较与tf.keras.layers.LSTM的功能差异

查看源文件

tf.keras.layers.LSTM

class tf.keras.layers.LSTM(
    units, activation='tanh', recurrent_activation='hard_sigmoid', use_bias=True,
    kernel_initializer='glorot_uniform', recurrent_initializer='orthogonal',
    bias_initializer='zeros', unit_forget_bias=True, kernel_regularizer=None,
    recurrent_regularizer=None, bias_regularizer=None, activity_regularizer=None,
    kernel_constraint=None, recurrent_constraint=None, bias_constraint=None,
    dropout=0.0, recurrent_dropout=0.0, implementation=1, return_sequences=False,
    return_state=False, go_backwards=False, stateful=False, unroll=False, **kwargs
)

更多内容详见tf.keras.layers.LSTM

mindspore.nn.LSTM

class mindspore.nn.LSTM(*args, **kwargs)(x, hx, seq_length)

更多内容详见mindspore.nn.LSTM

使用方式

diff parameters

MindSpore

TensorFlow

input_size

初始化时输入大小。

无此参数,自动判断输入大小。

hidden_size

初始化隐藏状态大小。

对应units。

num_layers

网络层数,默认:1。

无此参数,默认:1,需要自己构建1层以上的网络。

batch_first

输入x的第一维度是否为batch_size,默认:False 。

无此参数, 默认输入第一个维度为batch_size。

bidirectional

bidirectional = True,设置双向LSTM。

设置双向LSTM,需要使用 [tf.keras.layers.Bidirectional] (https://www.tensorflow.org/versions/r1.15/api_docs/python/tf/keras/layers/Bidirectional)。

output、hn、cn

默认输出一个序列,output形状为(seq_len, batch_size, num_directions * hidden_size)的Tensor,hn、cn是最后一个状态,都形如(num_directions * num_layers, batch_size, hidden_size)。

设置参数return_sequences = True,输出返回序列,return_state = True,返回最后一个状态,默认都是:False。当这两个全部设置为True,排布方式与MindSpore不同, output形如(batch_size, seq_len, hidden_size),hn、cn都形如(batch_size, hidden_size)。

代码示例

import numpy as np
import tensorflow as tf
import mindspore as ms
import mindspore.nn as nn
from mindspore import Tensor

# The following implements LSTM with MindSpore.

# bidirectional LSTM
net = nn.LSTM(10, 16, 1,  bidirectional=True)
x = Tensor(np.ones([5, 3, 10]).astype(np.float32))
h0 = Tensor(np.ones([1 * 1, 3, 16]).astype(np.float32))
c0 = Tensor(np.ones([1 * 1, 3, 16]).astype(np.float32))
output, (hn, cn) = net(x, (h0, c0))
print(output.shape)
# (5, 3, 32)
print(hn, cn)
# (2, 3, 16), (2, 3, 16)


# The following implements LSTM with TensorFlow.

# default LSTM
inputs = tf.random.normal([3, 5, 10])
lstm = tf.keras.layers.LSTM(16, return_sequences=True, return_state=True)
output_tf, hn_tf, cn_tf = lstm(inputs)
print(output_tf.shape)
#(3, 5, 16)
print(hn_tf, cn_tf)
# (3, 16), (3, 16)

# bidirectional LSTM
bidirectional_tf = tf.keras.layers.Bidirectional(tf.keras.layers.LSTM())