我正在研究从文本任务中检测作者身份,我通过使用由符号n-gram组成的数据帧来实现这一点,我使用147个不同作者的文本和TfidfVectorizer创建了大约110k。数据示例,我使用sklearn标签编码器编码作者姓名字符串,它将字符串转换为数字标签示例
- 数据分离成:(99817,1000)(11091,1000)(99817,)(11091,)
- 使用下面的模型,我的最佳结果是经过7-8次迭代:损失:0.7225 -精度:0.8070 - val_loss: 1.3828 - val_accuracy: 0.6777,之后模型开始过拟合。
模型:
model = Sequential(
[
Dense(300, activation="relu", input_shape=(Data_train.shape[-1],)),
Dense(750, activation="relu"),
BatchNormalization(),
Dropout(0.5),
Dense(147, activation="softmax"),
])
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(),
metrics=['accuracy'])
history = model.fit(Data_train,
Labels_train,
epochs=10,
shuffle=True,
callbacks=[early_stopping])
我想尝试用CNN网络来解决这个任务,我发现我的任务使用1D网络的类似例子,并尝试使用它:
vocab_size = 1000
maxlen = 1000
batch_size = 32
embedding_dims = 10
filters = 16
kernel_size = 3
hidden_dims = 250
epochs = 10
early_stopping = EarlyStopping(patience=0.1)
model = Sequential(
[
Embedding(vocab_size, embedding_dims, input_length=maxlen),
Dropout(0.5),
Conv1D(filters, kernel_size, padding='valid', activation='relu'),
MaxPooling1D(),
BatchNormalization(),
Conv1D(filters, kernel_size, padding='valid', activation='relu'),
MaxPooling1D(),
Flatten(),
Dense(hidden_dims, activation='relu'),
Dropout(0.5),
Dense(147, activation='softmax')
]
)
model.compile(optimizer='adam',
loss=keras.losses.SparseCategoricalCrossentropy(),
metrics=['accuracy'])
model.fit(Data_train, Labels_train,
batch_size=batch_size,
epochs=epochs,
validation_split=0.2,
callbacks=[early_stopping])
我只设法得到这些结果,从第一次迭代到5,精度和val_accuracy达到~0.07并保持不变,经过5次迭代,这就是我得到的:
- loss: 4.5621 - accuracy: 0.0701 - val_loss: 4.5597 - val_accuracy:0.0702
有没有人能帮我改进一下这些模型,得到更好的结果,尤其是CNN?欢迎提出任何建议,如果我需要提供更多的东西,请告诉我,谢谢。
我已经设法解决了我的问题,而不是使用嵌入层,我转换了我的数据和标签,添加了额外的维度,并将输入形状直接传递给卷积层
Data_train_tmp = tf.expand_dims(Data_train, -1)
Labels_train_tmp = tf.expand_dims(Labels_train, 1)
Conv1D(62, 5, activation='relu', input_shape=(Data_train.shape[1],1)),