Как зафиксировать удельный вес на встраиваемом слое - PullRequest
0 голосов
/ 31 октября 2018

Я хочу реализовать классификацию предложений cnn и заполнение 0 для предложений с изменяющейся длиной.

Но это не разумно для этой задачи, потому что 0 будет рассматриваться как словарь.

Чтобы решить эту проблему, я хочу зафиксировать вес все ноль для отображения 0 на слово-вектор в слое встраивания, и другой словарь все еще можно обучить.

Справочный документ: https://arxiv.org/abs/1408.5882

Ниже мой текущий код:

w2v_weight = np.array(list(data['id_vec'].values()))
# add zeros in first dim:
zero = np.zeros((1,w2v_weight.shape[1]))
w2v_weight = np.concatenate((zero,w2v_weight),axis=0) 

embedding_layer = Embedding(len(data["word_id"]) + 1, 300, weights= [w2v_weight],
                        input_length=data['x_test'].shape[1], trainable=True)

embedding_layer2 = Embedding(len(data["word_id"]) + 1, 300, weights= [w2v_weight],
                        input_length=data['x_test'].shape[1], trainable=False)

model_input = Input(shape=(None,),dtype='int32')

embedded_sequences2 = embedding_layer2(model_input)
embedded_sequences1 = embedding_layer(model_input)
ebd_cct = Concatenate()([embedded_sequences1,embedded_sequences2])

conv1 = Convolution1D(filters=100,kernel_size = 3,padding="same")(ebd_cct)
conv2 = Convolution1D(filters=100,kernel_size = 4,padding="same")(ebd_cct)
conv3 = Convolution1D(filters=100,kernel_size = 5,padding="same")(ebd_cct)
conv_a = Concatenate()([conv1,conv2,conv3])
conv_a = Activation("relu")(conv_a)
conv_add = GlobalMaxPool1D()(conv_a) 
z = Dropout(0.5)(conv_add) 

model_output = Dense(4, activation="softmax",kernel_constraint = max_norm(3.))(z)
model_1_two = Model(model_input, model_output)

model_1_two.summary()

model_1_two.compile(loss="categorical_crossentropy", optimizer="Adadelta",         
metrics=['acc'])
history_1_two = model_1_two.fit(data["x_train"], data["y_train"],shuffle=True,
      callbacks = [EarlyStopping(monitor="val_acc",patience=50)],
      batch_size=50, epochs=20000,validation_data=(data["x_test"], data["y_test"]))    

1 Ответ

0 голосов
/ 31 октября 2018

Из вашего кода я предполагаю, что вы используете Keras. Затем вы можете определить использование 0 в качестве индекса отсутствия словарного запаса (OOV), установив mask_zero в True:

embedding_layer = Embedding(len(data["word_id"]) + 1, 300, weights= [w2v_weight],
                            input_length=data['x_test'].shape[1], trainable=True,
                            mask_zero=True)

Для получения дополнительной информации см. Документацию для Embedding().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...