Я пытаюсь построить модель НЛП CNN для мультиклассовой классификации (6 классов).Первая часть структуры:
Input -> Embedding -> Conv -> GlobalMaxPool -> Dropout -> Dense
И после плотного слоя каждое входное предложение имеет видпреобразован в 100-размерные вложения.
После этого я передаю постоянную матрицу (6 100), которая представляет собой матрицу встраивания слов из шести различных меток (каждая строка представляет 100-мерное встраивание слов), и явычислите косинусное сходство между вложением предложения и каждым вложением слова метки как функцией оценки, и это даст мне результат (6 100).
Далее я передаю результат этого в плотный слой, чтобы получитьвывод, используя 1 нейрон и сигмоид в качестве активации, которая дает результат (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)