循环神经网络多种输入 Keras

数据挖掘 Python 深度学习 rnn 喀拉斯
2021-09-23 13:04:40

对于一个项目,我想使用循环神经网络,但是我对这个主题的了解仍然有限。我确实对卷积网络和传统神经网络有一些经验。我需要预测下一步输入之一的概率分布。我的大部分序列都相对较短,其中有一些大的异常值。有足够多的数据,所以这不应该是一个问题。

我使用 Keras 来完成这项任务,使用 LSTM 或 GRU 层。

我的输入存在分类输入序列 xA, xB 和一些数值 x1x11. 我试图预测xA没有经过训练的最后一步。对于高基数分类特征,我使用嵌入层将它们映射到密集空间,然后将三种不同类型的输入合并到一个层中。我的问题是在去 softmax 层进行最后一步的 one-hot 编码预测之前将它们合并在一起。我似乎无法让输入匹配。我将较短的序列填充到 10 步加上标签,并截断较长的序列以切断开始。我已经尝试过 Graph 和 Sequential 接口。

def build_graph_model(n_A, n_B, max_length, batch_size):
    g = Graph()
    g.add_input(name='A', input_shape=(max_length, ), dtype='int')
    g.add_node(Embedding(n_A, 32, input_length=max_length, mask_zero=True), name='embedding_A', input='A')
    g.add_input(name='B', input_shape=(max_length, ), dtype='int')
    g.add_node(Embedding(n_B, 32, input_length=max_length, mask_zero=True), name='embedding_B', input='B')
    g.add_input(name='rest', input_shape=(max_length, 11))
    g.add_node(Dense(30, activation='relu'), name='rest_dense', input='rest')
    g.add_node(LSTM(100), name='lstm', inputs=['embedding_A', 'embedding_B', 'rest_dense'])
    g.add_node(Dense(n_dest, activation='softmax'), name='softm', input='lstm')
    g.add_output(name='output', input='softm')
    g.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

这给出了错误输入维度的断言错误。如果我删除x1x11事情完全可行。如果我将 Dense 层更改为 TimeDistributed(Dense) 我仍然会收到相同的错误,尽管我认为应该可以。将其余输入直接插入合并不起作用,因为合并不能是第一层。我不确定如何解决这个问题。

编辑:这个人问了同样的问题,但更简洁(https://groups.google.com/forum/#!topic/keras-users/zCuS4xdv5QY

1个回答

Kera 的功能 API允许像您描述的那样组合任意模型。

一种选择是定义一个与上面链接的文档非常相似的模型。首先,定义一个分类的“主要输入”,然后,定义一个数字的“辅助输入”。这两个子模型都可以合并到具有附加层的单个网络中。