【发布时间】:2020-10-05 00:14:31
【问题描述】:
我正在尝试使用 CNN 架构对文本句子进行分类。网络架构如下:
text_input = Input(shape=X_train_vec.shape[1:], name = "Text_input")
conv2 = Conv1D(filters=128, kernel_size=5, activation='relu')(text_input)
drop21 = Dropout(0.5)(conv2)
pool1 = MaxPooling1D(pool_size=2)(drop21)
conv22 = Conv1D(filters=64, kernel_size=5, activation='relu')(pool1)
drop22 = Dropout(0.5)(conv22)
pool2 = MaxPooling1D(pool_size=2)(drop22)
dense = Dense(16, activation='relu')(pool2)
flat = Flatten()(dense)
dense = Dense(128, activation='relu')(flat)
out = Dense(32, activation='relu')(dense)
outputs = Dense(y_train.shape[1], activation='softmax')(out)
model = Model(inputs=text_input, outputs=outputs)
# compile
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
我有一些回调作为 early_stopping 和 reduceLR 来停止训练并在验证损失没有改善(减少)时降低学习率。
early_stopping = EarlyStopping(monitor='val_loss',
patience=5)
model_checkpoint = ModelCheckpoint(filepath=checkpoint_filepath,
save_weights_only=False,
monitor='val_loss',
mode="auto",
save_best_only=True)
learning_rate_decay = ReduceLROnPlateau(monitor='val_loss',
factor=0.1,
patience=2,
verbose=1,
mode='auto',
min_delta=0.0001,
cooldown=0,
min_lr=0)
我们可以在这里观察到,从 epoch 5 开始,验证损失并没有改善,并且训练损失在每一步都被过度拟合。
我想知道我在 CNN 的架构中是否做错了什么?辍学层还不足以避免过度拟合吗?还有哪些其他方法可以减少过拟合?
有什么建议吗?
提前致谢。
编辑:
我也尝试过正则化,结果更糟:
kernel_regularizer=l2(0.01), bias_regularizer=l2(0.01)
编辑 2:
我尝试在每次卷积后应用 BatchNormalization 层,结果是下一个:
norm = BatchNormalization()(conv2)
编辑 3:
应用 LSTM 架构后:
text_input = Input(shape=X_train_vec.shape[1:], name = "Text_input")
conv2 = Conv1D(filters=128, kernel_size=5, activation='relu')(text_input)
drop21 = Dropout(0.5)(conv2)
conv22 = Conv1D(filters=64, kernel_size=5, activation='relu')(drop21)
drop22 = Dropout(0.5)(conv22)
lstm1 = Bidirectional(LSTM(128, return_sequences = True))(drop22)
lstm2 = Bidirectional(LSTM(64, return_sequences = True))(lstm1)
flat = Flatten()(lstm2)
dense = Dense(128, activation='relu')(flat)
out = Dense(32, activation='relu')(dense)
outputs = Dense(y_train.shape[1], activation='softmax')(out)
model = Model(inputs=text_input, outputs=outputs)
# compile
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
【问题讨论】:
-
最重要的问题是:“你的数据集有多大?”这似乎是一个非常小的数据集。如果是这种情况,您的主要反应应该是收集更多数据。
-
不小。我有 40000 个样本。
-
那肯定还有其他问题。由于验证损失几乎没有减少,它没有学到任何有用的东西。你有几节课?你的课程平衡吗?
-
有两个类,分布分别为58%、42%
-
嗯。没有更多信息很难猜测,但我仍然认为数据可能有问题。这是一个定制项目吗?你想预测什么?
标签: python tensorflow keras deep-learning conv-neural-network