gpt4 book ai didi

python - 使用 Keras 训练句子序列

转载 作者:太空狗 更新时间:2023-10-30 01:31:23 24 4
gpt4 key购买 nike

我正在开展一个项目,在该项目中,我必须在神经网络中结合使用数字和文本数据来预测下一个小时系统的可用性。我决定使用 Keras 的合并层与两个网络(一个用于数字数据,一个用于文本),而不是尝试使用单独的神经网络并在最后做一些奇怪/不清楚(对我来说)的事情来产生所需的输出。我的想法是,我以 (batch_size, 6hrs, num_features) 的形式为模型提供前 6 小时的一系列性能指标。除了我给处理数字数据的网络的输入,我给第二个网络另一个大小的序列(batch_size、max_alerts_per_sequence、max_sentence length)。

时间范围内的任何数字数据序列都可以有与其关联的可变数量的事件(文本数据)。为了简单起见,我只允许最多 50 个事件伴随性能数据序列。每个事件都按单词进行哈希编码并进行填充。我已经尝试使用展平层将输入形状从 (50, 30) 减少到 (1500),以便模型可以针对这些“序列”中的每个 事件进行训练(澄清一下:我通过为每个性能数据序列建模 50 个句子,每个句子包含 30 个编码元素)。

我的问题是:由于我需要神经网络查看给定性能指标序列的所有事件,我如何才能让神经网络针对基于句子序列的文本数据训练?

我的模型:

#LSTM Module for performance metrics
input = Input(shape=(shape[1], shape[2]))
lstm1 = Bidirectional(LSTM(units=lstm_layer_count, activation='tanh', return_sequences=True, input_shape=shape))(input)
dropout1 = Dropout(rate=0.2)(lstm1)
lstm2 = Bidirectional(LSTM(units=lstm_layer_count, activation='tanh', return_sequences=False))(dropout1)
dropout2 = Dropout(rate=0.2)(lstm2)

#LSTM Module for text based data
tInput = Input(shape=(50, 30))
flatten = Flatten()(tInput)
embed = Embedding(input_dim=vocabsize + 1, output_dim= 50 * 30, input_length=30*50)(flatten)
magic = Bidirectional(LSTM(100))(embed)
tOut = Dense(1, activation='relu')(magic)

#Merge the layers
concat = Concatenate()([dropout2, tOut])
output = Dense(units=1, activation='sigmoid')(concat)

nn = keras.models.Model(inputs=[input, tInput], outputs = output)

opt = keras.optimizers.SGD(lr=0.1, momentum=0.8, nesterov=True, decay=0.001)
nn.compile(optimizer=opt, loss='mse', metrics=['accuracy', coeff_determination])

最佳答案

据我所知,您有一个最多 50 个事件的序列,您想要对其进行预测。这些事件附加了文本数据,可以将其视为另一个词嵌入序列。 Here是一篇关于类似架构的文章。

我会提出一个解决方案,其中涉及文本部分的 LSTM 和“真实”序列部分的一维卷积。每个 LSTM 层都与数值数据连接在一起。这涉及 50 个 LSTM 层,训练起来可能很耗时,即使您使用共享权重也是如此。也可以只对文本部分使用卷积层,这样速度更快,但不会对长期依赖性建模。 (我的经验是,这些长期依赖性在文本挖掘中通常并不那么重要)。

文本 -> LSTM 或 1DConv -> 与数值数据连接 -> 1DConv -> 输出下面是一些示例代码,展示了如何使用分片权重

numeric_input = Input(shape=(x_numeric_train.values.shape[1],), name='numeric_input')
nlp_seq = Input(shape=(number_of_messages ,seq_length,), name='nlp_input'+str(i))

# shared layers
emb = TimeDistributed(Embedding(input_dim=num_features, output_dim=embedding_size,
input_length=seq_length, mask_zero=True,
input_shape=(seq_length, )))(nlp_seq)
x = TimeDistributed(Bidirectional(LSTM(32, dropout=0.3, recurrent_dropout=0.3, kernel_regularizer=regularizers.l2(0.01))))(emb)

c1 = Conv1D(filter_size, kernel1, padding='valid', activation='relu', strides=1, kernel_regularizer=regularizers.l2(kernel_reg))(x)
p1 = GlobalMaxPooling1D()(c1)
c2 = Conv1D(filter_size, kernel2, padding='valid', activation='relu', strides=1, kernel_regularizer=regularizers.l2(kernel_reg))(x)
p2 = GlobalMaxPooling1D()(c2)
c3 = Conv1D(filter_size, kernel3, padding='valid', activation='relu', strides=1, kernel_regularizer=regularizers.l2(kernel_reg))(x)
p3 = GlobalMaxPooling1D()(c3)

x = concatenate([p1, p2, p3, numeric_input])
x = Dense(1, activation='sigmoid')(x)
model = Model(inputs=[nlp_seq, meta_input] , outputs=[x])
model.compile('adam', 'binary_crossentropy', metrics=['accuracy'])

和训练:

model.fit([x_train, x_numeric_train], y_train)
# where x_train is a a array of num_samples * num_messages * seq_length

像这样的复杂模型需要大量数据才能收敛。对于较少的数据,可以通过将事件聚合为只有一个序列来实现更简单的解决方案。例如,所有事件的文本数据都可以被视为一个单独的文本(带有分隔符),而不是多个文本,而数值数据可以求和、平均甚至组合成一个固定长度的列表。但这取决于您的数据。

由于我正在做类似的事情,我稍后会用代码更新这些答案。

关于python - 使用 Keras 训练句子序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51332144/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com