Вам, вероятно, следует использовать второй ввод с масками, указывающими, какие глаголы для каких предложений, и выполнить простое поэлементное умножение:
sentenceInputs = Input((sentenceLength,))
desiredVerbs = Input((5926,))
sentenceOutputs = Embedding(vocab_size, embedding_size, input_length=55, weights=[pretrained_weights])(sentenceInputs)
sentenceOutputs = Bidirectional(LSTM(units=embedding_size))(sentenceOutputs)
sentenceOuptuts = Dense(5926)(sentenceOutputs)
selectedOutputs = Multiply()([sentenceOutputs, desiredVerbs])
selectedOutputs = Activation('softmax')(selectedOutputs)
model = Model([sentenceInputs,desiredVerbs], selectedOutputs)
Теперь создайте массив с нужными глаголами:
desired = np.zeros((X_train.shape[0], 5926))
#for each sentence, make the desired verbs be one:
desired[sentenceIndex, verbIndex] = 1.
#now, how you're going to do this is up to you
#if they're the same for all sentences:
verbs = [selectedVerbIndex1, selectedVerbIndex2, ...... ]
for verbIndex in verbs:
desired[:, verbIndex] = 1.
И подходит для обоих входов:
model.fit([np.array(X_train), desired], np.array(y_train), ......)
Использование параметра class_weight
в fit
:
Вы можете попробовать использовать свою оригинальную модель (непредложение выше) и используйте параметр class_weight
в методе fit
.
Хотя это будет немного по-другому.Вы не сможете выбирать глаголы при прогнозировании, только во время тренировки.Вы не сможете выбрать разные глаголы для разных предложений.Другие глаголы никогда не будут обучаться (может быть, модель с Dense(5)
будет более интересной?)
Я также не очень уверен, можно ли здесь иметь нулевые веса.
verbWeights = { i: 0. for i in range(5926) }
desiredVerbs = [verbIndex1, verbIndex2, .... ]
for verb in desiredVerbs:
verbWeights[verb] = 1.
model.fit(X_train, y_train, class_weight = desiredVerbs, ....)