Keras 是不是具有将输入词向量复制并反向传播到仅一组的功能?

Posted

技术标签:

【中文标题】Keras 是不是具有将输入词向量复制并反向传播到仅一组的功能?【英文标题】:Does Keras have functionality to copy input word vectors and backpropagate into only one set?Keras 是否具有将输入词向量复制并反向传播到仅一组的功能? 【发布时间】:2018-12-11 00:41:08 【问题描述】:

我的目标是在 Keras 中创建一个 RNN-CNN 网络,该网络根据文本段落预测分类输出。在我当前的模型中,段落首先嵌入到特征向量中,然后输入到 2 个 cuDNNGRU 层、4 个 Conv1D 和 MaxPooling 层,然后再输入到 Dense 输出层。

但是,我找到了一个参考,其中提到了一种处理词向量的多通道方法,该方法涉及复制初始向量,通过 CNN 层运行一组,然后在池化之前将输出与副本相加。这样做是为了防止反向传播到一组向量中,从而保留原始词向量的一些语义思想。

我已尝试搜索此内容,但与多通道和 CNN 相关的唯一内容是使用多种大小的 n-gram 内核。 Keras 是否提供任何可用于实现此目的的功能?

【问题讨论】:

【参考方案1】:

是的,您可以使用函数 API 来实现。

这是一个小例子,您可以随意适应您的需要:

embed_input = Input(shape=(300,))
embedded_sequences = Embedding(10000, 10)(embed_input)
embed=SpatialDropout1D(0.5)(embedded_sequences)

gru=Bidirectional(CuDNNGRU(200, return_sequences = True))(embed)

conv=Conv1D(filters=4,
            padding = "valid",
            kernel_size=4,
            kernel_initializer='he_uniform',
            activation='relu')(gru)

avg_pool = GlobalAveragePooling1D()(conv)
max_pool = GlobalMaxPooling1D()(conv)
gru_pool = GlobalAveragePooling1D()(gru)


l_merge = concatenate([avg_pool, max_pool, gru_pool])



output = Dense(6, activation='sigmoid')(l_merge)
model = Model(embed_input, output)


model.summary()


output:

__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_10 (InputLayer)           (None, 300)          0                                            
__________________________________________________________________________________________________
embedding_9 (Embedding)         (None, 300, 10)      100000      input_10[0][0]                   
__________________________________________________________________________________________________
spatial_dropout1d_9 (SpatialDro (None, 300, 10)      0           embedding_9[0][0]                
__________________________________________________________________________________________________
bidirectional_8 (Bidirectional) (None, 300, 400)     254400      spatial_dropout1d_9[0][0]        
__________________________________________________________________________________________________
conv1d_6 (Conv1D)               (None, 297, 4)       6404        bidirectional_8[0][0]            
__________________________________________________________________________________________________
global_average_pooling1d_6 (Glo (None, 4)            0           conv1d_6[0][0]                   
__________________________________________________________________________________________________
global_max_pooling1d_6 (GlobalM (None, 4)            0           conv1d_6[0][0]                   
__________________________________________________________________________________________________
global_average_pooling1d_7 (Glo (None, 400)          0           bidirectional_8[0][0]            
__________________________________________________________________________________________________
concatenate_5 (Concatenate)     (None, 408)          0           global_average_pooling1d_6[0][0] 
                                                                 global_max_pooling1d_6[0][0]     
                                                                 global_average_pooling1d_7[0][0] 
__________________________________________________________________________________________________
dense_5 (Dense)                 (None, 6)            2454        concatenate_5[0][0]              
==================================================================================================
Total params: 363,258
Trainable params: 363,258
Non-trainable params: 0

以及图的结构:

【讨论】:

以上是关于Keras 是不是具有将输入词向量复制并反向传播到仅一组的功能?的主要内容,如果未能解决你的问题,请参考以下文章

反向传播直到神经网络中的输入层

如何从 Keras 嵌入层获取词向量

NLP中的GAN

神经网络和深度学习之——误差反向传播算法

反向传播梯度求解推导

神经网络的优化