【发布时间】:2020-04-18 16:51:54
【问题描述】:
我用Keras 训练了两个神经网络:一个MLP 和一个Bidirectional LSTM。
我的任务是预测句子中的单词顺序,因此对于每个单词,神经网络必须输出一个实数。当处理一个包含 N 个单词的句子时,将输出中的 N 个实数排序,以获得表示单词位置的整数。
我在数据集上使用相同的数据集和相同的预处理。唯一不同的是,在LSTM 数据集中,我添加了填充以获得相同长度的序列。
在预测阶段,使用LSTM,我排除了从填充向量创建的预测,因为我在训练阶段屏蔽了它们。
MLP 架构:
mlp = keras.models.Sequential()
# add input layer
mlp.add(
keras.layers.Dense(
units=training_dataset.shape[1],
input_shape = (training_dataset.shape[1],),
kernel_initializer=keras.initializers.RandomUniform(minval=-0.05, maxval=0.05, seed=None),
activation='relu')
)
# add hidden layer
mlp.add(
keras.layers.Dense(
units=training_dataset.shape[1] + 10,
input_shape = (training_dataset.shape[1] + 10,),
kernel_initializer=keras.initializers.RandomUniform(minval=-0.05, maxval=0.05, seed=None),
bias_initializer='zeros',
activation='relu')
)
# add output layer
mlp.add(
keras.layers.Dense(
units=1,
input_shape = (1, ),
kernel_initializer=keras.initializers.RandomUniform(minval=-0.05, maxval=0.05, seed=None),
bias_initializer='zeros',
activation='linear')
)
双向 LSTM 架构:
model = tf.keras.Sequential()
model.add(Masking(mask_value=0., input_shape=(timesteps, features)))
model.add(Bidirectional(LSTM(units=20, return_sequences=True), input_shape=(timesteps, features)))
model.add(Dropout(0.2))
model.add(Dense(1, activation='linear'))
使用 LSTM 可以更好地解决该任务,它应该可以很好地捕捉单词之间的依赖关系。
但是,使用MLP 我取得了不错的结果,但使用LSTM 的结果非常糟糕。
由于我是初学者,有人能理解我的LSTM 架构有什么问题吗?我快疯了。
提前致谢。
【问题讨论】:
标签: python keras neural-network lstm mlp