【发布时间】:2019-05-22 07:43:32
【问题描述】:
我正在尝试为多类分类(6 类)构建 NLP CNN 模型。结构的第一部分是:
Input --> Embedding --> Conv --> GlobalMaxPool --> Dropout --> Dense
并且在密集层之后,每个输入句子都被转换为一个 100 维的嵌入。
在此之后,我传入一个常量矩阵 (6,100),它是一个包含六个不同标签的词嵌入矩阵(每行代表一个 100 维的词嵌入),然后我计算句子嵌入和每个标签之间的余弦相似度将标签词嵌入作为评分函数,它给我的结果是(6,100)。
接下来,我将结果传递给一个密集层以获得输出,使用 1 个神经元和 sigmoid 作为激活,它给出了 (6, 1) 的结果,但是当我编译它时它给了我标题中的错误。
以下是所有代码,感谢所有帮助!
MAX_SEQUENCE_LENGTH = 250
jdes_sequence_input = Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='float32')
word_embedding_layer = embedding_layer(jdes_sequence_input)
jdes = word_embedding_layer
jdes = Conv1D(filters=1000, kernel_size=5, strides=1, activation='tanh')(jdes)
jdes = GlobalMaxPooling1D()(jdes)
jdes = Dense(1000, activation='tanh')(jdes)
jdes = Dropout(0.3)(jdes)
jdes = Dense(100, activation='relu')(jdes)
def cosine_distance(input): # label_embedding is the constant matrix
jd = K.l2_normalize(input, axis=-1)
jt_six = K.l2_normalize(label_embedding, axis=-1)
return jd * jt_six # return a 6*100 result
distance = Lambda(cosine_distance, output_shape=(6,100))(jdes)
result = Dense(1, activation='sigmoid')(distance)
model = Model(inputs=jdes_sequence_input, outputs = result)
sgd = optimizers.SGD(lr=0.05)
model.compile(loss='binary_crossentropy', optimizer=sgd, metrics=['accuracy'])
model.fit(pad_data, labels, validation_split=0.2, batch_size=64, nb_epoch=1)
pad_data 具有形状:(18722, 250) 标签有形状:(18722, 6)
【问题讨论】:
标签: tensorflow keras deep-learning nlp conv-neural-network