Я хочу реализовать классификацию предложений 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"]))