Я новичок в области глубокого обучения и учу себя некоторым концепциям НЛП.Я пытаюсь понять это, работая над моделью оценки сходства предложений Quora, как объяснено в этом превосходном уроке здесь .
Код уже давно существует, и, пытаясь заставить его работать с новым набором данных, я решил, что API слияния моделей устарел.Я долго сидел и изо всех сил пытался объединить модели (так как я не слишком разбираюсь в сложностях).
Может ли кто-нибудь помочь мне проверить, правильно ли я преобразовал это?Основной вопрос, который у меня есть, заключается в том, что входные последовательности дополняются до max_len
из 40, так значит ли это, что мне нужно указать входной слой в форме 40?
СТАРЫЙ КОД НА САЙТЕ:
tk = text.Tokenizer(nb_words=200000)
max_len = 40
tk.fit_on_texts(list(data.question1.values) + list(data.question2.values.astype(str)))
x1 = tk.texts_to_sequences(data.question1.values)
x1 = sequence.pad_sequences(x1, maxlen=max_len)
x2 = tk.texts_to_sequences(data.question2.values.astype(str))
x2 = sequence.pad_sequences(x2, maxlen=max_len)
word_index = tk.word_index
ytrain_enc = np_utils.to_categorical(y)
embeddings_index = {}
f = open('data/glove.840B.300d.txt')
for line in tqdm(f):
values = line.split()
word = values[0]
coefs = np.asarray(values[1:], dtype='float32')
embeddings_index[word] = coefs
f.close()
print('Found %s word vectors.' % len(embeddings_index))
embedding_matrix = np.zeros((len(word_index) + 1, 300))
for word, i in tqdm(word_index.items()):
embedding_vector = embeddings_index.get(word)
if embedding_vector is not None:
embedding_matrix[i] = embedding_vector
max_features = 200000
filter_length = 5
nb_filter = 64
pool_length = 4
model = Sequential()
print('Build model...')
model1 = Sequential()
model1.add(Embedding(len(word_index) + 1,
300,
weights=[embedding_matrix],
input_length=40,
trainable=False))
model1.add(TimeDistributed(Dense(300, activation='relu')))
model1.add(Lambda(lambda x: K.sum(x, axis=1), output_shape=(300,)))
model2 = Sequential()
model2.add(Embedding(len(word_index) + 1,
300,
weights=[embedding_matrix],
input_length=40,
trainable=False))
model2.add(TimeDistributed(Dense(300, activation='relu')))
model2.add(Lambda(lambda x: K.sum(x, axis=1), output_shape=(300,)))
model3 = Sequential()
model3.add(Embedding(len(word_index) + 1,
300,
weights=[embedding_matrix],
input_length=40,
trainable=False))
model3.add(Convolution1D(nb_filter=nb_filter,
filter_length=filter_length,
border_mode='valid',
activation='relu',
subsample_length=1))
model3.add(Dropout(0.2))
model3.add(Convolution1D(nb_filter=nb_filter,
filter_length=filter_length,
border_mode='valid',
activation='relu',
subsample_length=1))
model3.add(GlobalMaxPooling1D())
model3.add(Dropout(0.2))
model3.add(Dense(300))
model3.add(Dropout(0.2))
model3.add(BatchNormalization())
model4 = Sequential()
model4.add(Embedding(len(word_index) + 1,
300,
weights=[embedding_matrix],
input_length=40,
trainable=False))
model4.add(Convolution1D(nb_filter=nb_filter,
filter_length=filter_length,
border_mode='valid',
activation='relu',
subsample_length=1))
model4.add(Dropout(0.2))
model4.add(Convolution1D(nb_filter=nb_filter,
filter_length=filter_length,
border_mode='valid',
activation='relu',
subsample_length=1))
model4.add(GlobalMaxPooling1D())
model4.add(Dropout(0.2))
model4.add(Dense(300))
model4.add(Dropout(0.2))
model4.add(BatchNormalization())
model5 = Sequential()
model5.add(Embedding(len(word_index) + 1, 300, input_length=40, dropout=0.2))
model5.add(LSTM(300, dropout_W=0.2, dropout_U=0.2))
model6 = Sequential()
model6.add(Embedding(len(word_index) + 1, 300, input_length=40, dropout=0.2))
model6.add(LSTM(300, dropout_W=0.2, dropout_U=0.2))
merged_model = Sequential()
merged_model.add(Merge([model1, model2, model3, model4, model5, model6], mode='concat'))
merged_model.add(BatchNormalization())
merged_model.add(Dense(300))
merged_model.add(PReLU())
merged_model.add(Dropout(0.2))
merged_model.add(BatchNormalization())
merged_model.add(Dense(300))
merged_model.add(PReLU())
merged_model.add(Dropout(0.2))
merged_model.add(BatchNormalization())
merged_model.add(Dense(300))
merged_model.add(PReLU())
merged_model.add(Dropout(0.2))
merged_model.add(BatchNormalization())
merged_model.add(Dense(300))
merged_model.add(PReLU())
merged_model.add(Dropout(0.2))
merged_model.add(BatchNormalization())
merged_model.add(Dense(300))
merged_model.add(PReLU())
merged_model.add(Dropout(0.2))
merged_model.add(BatchNormalization())
merged_model.add(Dense(1))
merged_model.add(Activation('sigmoid'))
То, что у меня есть до сих пор (по указанной архитектуре и в целом):
МОЯ ПОПЫТКА ПРИ СЛОВОМ ИСПОЛЬЗОВАНИИ ФУНКЦИОНАЛЬНОГО API:
tk = text.Tokenizer(nb_words=200000, filters='!"#$%&*+,/;<>?@\^`{|}~')
max_len = 40
tk.fit_on_texts(list(data.log1.values) + list(data.log2.values.astype(str)))
x1 = tk.texts_to_sequences(data.log1.values)
x1 = sequence.pad_sequences(x1, maxlen=max_len)
x2 = tk.texts_to_sequences(data.log2.values.astype(str))
x2 = sequence.pad_sequences(x2, maxlen=max_len)
word_index = tk.word_index
ytrain_enc = np_utils.to_categorical(y)
embeddings_index = {}
f = open('data/glove.840B.300d.txt')
for line in tqdm(f):
values = line.split()
word = values[0]
coefs = np.asarray(values[1:], dtype='float32')
embeddings_index[word] = coefs
f.close()
print('Found %s word vectors.' % len(embeddings_index))
embedding_matrix = np.zeros((len(word_index) + 1, 300))
for word, i in tqdm(word_index.items()):
embedding_vector = embeddings_index.get(word)
if embedding_vector is not None:
embedding_matrix[i] = embedding_vector
max_features = 200000
filter_length = 5
nb_filter = 64
pool_length = 4
input_layer = Input(shape=(40,))
print('Build model...')
# Converting everything to Keras' functional API
# We don't need model1 = Sequential() since the functional API specifies this
# implicitly
model1 = Embedding(len(word_index) + 1, 300, weights=[embedding_matrix],
input_length=40, trainable=False)(input_layer)
model1 = TimeDistributed(Dense(300, activation='relu'))(model1)
model1 = Lambda(lambda x: K.sum(x, axis=1), output_shape=(300,))(model1)
model2 = Embedding(len(word_index) + 1, 300, weights=[embedding_matrix],
input_length=40, trainable=False)(input_layer)
model2 = TimeDistributed(Dense(300, activation='relu'))(model2)
model2 = Lambda(lambda x: K.sum(x, axis=1), output_shape=(300,))(model2)
model3 = Embedding(len(word_index) + 1, 300, weights=[embedding_matrix],
input_length=40, trainable=False)(input_layer)
model3 = Convolution1D(nb_filter=nb_filter, filter_length=filter_length,
border_mode='valid', activation='relu',
subsample_length=1)(model3)
model3 = Dropout(0.2)(model3)
model3 = Convolution1D(nb_filter=nb_filter, filter_length=filter_length,
border_mode='valid', activation='relu',
subsample_length=1)(model3)
model3 = GlobalMaxPooling1D()(model3)
model3 = Dropout(0.2)(model3)
model3 = Dense(300)(model3)
model3 = Dropout(0.2)(model3)
model3 = BatchNormalization()(model3)
model4 = Embedding(len(word_index) + 1, 300, weights=[embedding_matrix],
input_length=40, trainable=False)(input_layer)
model4 = Convolution1D(nb_filter=nb_filter, filter_length=filter_length, border_mode='valid',
activation='relu', subsample_length=1)(model4)
model4 = Dropout(0.2)(model4)
model4 = Convolution1D(nb_filter=nb_filter, filter_length=filter_length, border_mode='valid',
activation='relu', subsample_length=1)(model4)
model4 = GlobalMaxPooling1D()(model4)
model4 = Dropout(0.2)(model4)
model4 = Dense(300)(model4)
model4 = Dropout(0.2)(model4)
model4 = BatchNormalization()(model4)
model5 = Embedding(len(word_index) + 1, 300, input_length=40, dropout=0.2)(input_layer)
model5 = LSTM(300, dropout_W=0.2, dropout_U=0.2)(model5)
model6 = Embedding(len(word_index) + 1, 300, input_length=40, dropout=0.2)(input_layer)
model6 = LSTM(300, dropout_W=0.2, dropout_U=0.2)(model6)
merged_model = concatenate([model1, model2, model3, model4, model5, model6])
merged_model = BatchNormalization()(merged_model)
merged_model = Dense(300)(merged_model)
merged_model = PReLU()(merged_model)
merged_model = Dropout(0.2)(merged_model)
merged_model = BatchNormalization()(merged_model)
merged_model = Dense(300)(merged_model)
merged_model = PReLU()(merged_model)
merged_model = Dropout(0.2)(merged_model)
merged_model = BatchNormalization()(merged_model)
merged_model = Dense(300)(merged_model)
merged_model = PReLU()(merged_model)
merged_model = Dropout(0.2)(merged_model)
merged_model = BatchNormalization()(merged_model)
merged_model = Dense(300)(merged_model)
merged_model = PReLU()(merged_model)
merged_model = Dropout(0.2)(merged_model)
merged_model = BatchNormalization()(merged_model)
merged_model = Dense(300)(merged_model)
merged_model = PReLU()(merged_model)
merged_model = Dropout(0.2)(merged_model)
merged_model = BatchNormalization()(merged_model)
# merged_model = Dense(1)(merged_model)
# merged_model = Activation('sigmoid')(merged_model)
predictions = Dense(1, activation='sigmoid')(merged_model)
model = Model(inputs=input_layer, outputs=predictions)
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()
checkpoint = ModelCheckpoint('weights.h5', monitor='val_acc', save_best_only=True, verbose=2)
model.fit([x1, x2, x1, x2, x1, x2], y=y, batch_size=384, nb_epoch=200,
verbose=1, validation_split=0.1, shuffle=True, callbacks=[checkpoint])
Я не уверен, что все сделал правильно, поэтому я прошу кого-нибудь проверить это здесь.По-видимому, время тренировки занимает 10-15 часов, и я действительно не хочу, чтобы это было ошибкой на полпути, потому что я что-то пропустил.Если кто-то подтвердит, что это может быть более быстрым способом сделать это до того, как я его выполню.
Кроме того, при подаче предложений, имейте в виду, я, по всей вероятности, не буду знать, о чем вы говорите, так как этодействительно новый для меня (извините, пожалуйста).
Заранее благодарю за помощь.