【发布时间】:2021-06-25 22:17:15
【问题描述】:
我尝试建立一维 CNN 模型来进行 DNA 突变分类我建立了模型并且它可以正常工作,但是我得到的测试数据精度很低 我有如下图所示的数据集
这是我的模型
vocab_size = 100
embedding_dim = 150
max_len = 90
X_train = pad_sequences(X_train,padding ='post', maxlen = max_len)
X_test = pad_sequences(X_test,padding ='post', maxlen = max_len)
model = Sequential()
model.add(layers.Embedding(vocab_size,embedding_dim,input_length = max_len))
model.add(layers.Conv1D(128, 7, activation = 'relu'))
model.add(layers.GlobalMaxPooling1D())
model.add(layers.Dense(10, activation = 'relu'))
model.add(layers.Dense(1, activation = 'sigmoid'))
model.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics= ['accuracy'])
model.summary()
history = model.fit(X_train,y_train,epochs = 10, verbose = False,validation_data = (X_test,y_test),batch_size = 10)
loss,accuracy = model.evaluate(X_train,y_train, verbose = False)
accuracy = accuracy*100
print("training accuracy = {:.2f}".format(accuracy))
loss,accuracy = model.evaluate(X_test,y_test, verbose = False)
accuracy = accuracy*100
print("test accuracy = {:.2f}".format(accuracy))
我的输入是 ['sequence','normal','mutated','position'] 目标列是 ['class'] 列 那么我的测试准确性有什么问题。
编辑: 我尝试在 train_test_split 函数中更改测试数据的百分比并增加测试数据的百分比以避免过度拟合,但测试准确度仍然很低
【问题讨论】:
-
当你在上层使用
relu时,不要在最后一个Dense层使用sigmoid。这可能导致神经元的完全饱和放电(使用sigmoid)。相反,尝试在最后一个Dense层中设置units=2,并将损失函数更改为sparse_categorical_crossentropy。 -
但我需要形状为 (,1) 的输出,所以我无法设置
units=2,我使用了 'binary_crossentropy' 因为我需要输出仅为 0 或 1 -
我改了 'sigmoid' 函数精度降低了
-
@mohamedhossam 验证/训练准确率高而测试准确率低吗?
-
@Wanderer 是的,存在过度拟合,但无法通过增加测试数据来解决
标签: python tensorflow machine-learning keras conv-neural-network