我目前正在尝试在 Keras 中实现Rui Zhang 的 Dependency Sensitive Convolutional Neural Network for Modeling Documents。对我来说,这是第一个在 Keras 中实现的网络,所以我提出了一些问题。
网络如下所示:
所以我从输入开始,我的想法是我必须输入序列序列,例如句子列表,其中句子是单词嵌入的单词列表。句子应该被填充,以便所有句子的长度相等。还应该对文档进行填充,以使每个文档的句子数量相等。
我们将有一批以下类型(仅符号 -> 根据 `fit()´):
s_i = np.array(shape=(max_sentence_length, word_embedding_dimensions))
doc_i = [s_1, s_2, s_3, ..., s_(max_sentences_per_doc)]
batch = [doc_1, doc_2, doc_3, ...]
其中we_idx_ij是某个文档的第 i 个句子中第 j 个单词的词嵌入索引。
问题1: 这有意义吗?
我仍然需要考虑如何准确地包含 w2v 词嵌入,但是对于 Keras 中的模型,我将按如下方式进行:
包括:
包括所需的方法/层并初始化符号常量
import numpy as np
from keras.layers import Activation, Input, Embedding, LSTM, concatenate, AveragePooling1D, MaxPool1D, Conv1D, TimeDistributed
# constants (for testing)
max_sentences_per_document = 10
max_words_per_sentence = 100
w2v_dimensions = 300
vocab_size = 20000
batch_size = 60
模型:
# preparing some shared layers
shared_embedding = Embedding(input_dim=w2v_dimensions, output_dim=vocab_size, weights=[W]) # optional,cause no training
shared_sentence_lstm = TimeDistributed(
LSTM(input_dim=max_words_per_sentence, return_sequences=True, activation='tanh'),
input_shape=(max_words_per_sentence, w2v_dimensions)
)
shared_sentence_lstm_2 = LSTM(activation='tanh')
# sentence modeling
sentence_inputs = [Input(shape=(batch_size, max_words_per_sentence, )) for i in range(max_sentences_per_document)]
sentence_modeling = [shared_embedding(sentence_inputs[i]) for i in range(max_sentences_per_document)]
sentence_modeling = [shared_sentence_lstm(sentence_modeling[i]) for i in range(max_sentences_per_document)]
sentence_modeling = [AveragePooling1D()(sentence_modeling[i]) for i in range(max_sentences_per_document)]
sentence_modeling = [shared_sentence_lstm_2(sentence_modeling[i]) for i in range(max_sentences_per_document)]
# document modeling
doc_modeling = concatenate(sentence_modeling)
doc_modeling = Conv1D(filters=100, kernel_size=[3, 4, 5], activation='relu')(doc_modeling)
doc_modeling = MaxPool1D()(doc_modeling)
doc_modeling = Activation('softmax')
doc_modeling.compile(loss='hinge', optimizer='sgd', metrics=['accuracy'])
问题2:
将单词嵌入已经在批处理数据中是否有意义,或者我应该s_i只为每个单词提供一个与单词嵌入矩阵中的索引相关的索引?(我想后者对内存更有意义)
问题 3:
如果我在批处理数据中提供单词嵌入,我就不需要嵌入层,对吗?
问题4:
这个网络能用吗?
问题 5:
这段代码是否按照论文中的建议实现了网络?
问题 6:
您对提高性能有什么建议吗?
我希望我在这个实现方面不会偏离轨道,并期待您的回答:-) 在此先感谢!
