基于深度学习的分子设计CNN模型SMILES输入准确率为0求助
分子设计CNN模型训练准确率为0的问题求助
本项目为基于深度学习技术的分子设计学术项目,采用SMILES作为输入的CNN模型,已完成输入编码,但训练后准确率始终为0,特此求助解决方法。
模型代码
from keras.models import Sequential from keras.layers import Conv1D, MaxPooling1D, Flatten, Dense,Dropout,Activation import keras print("TensorFlow version:", tf.__version__) print("Keras version:", keras.__version__) # 创建Sequential模型 model = Sequential() # 添加1D卷积层,29个过滤器,核大小3,ReLU激活 model.add(Conv1D(filters=29, kernel_size=3, activation='relu', input_shape=(29, 1))) # 添加最大池化层,池化大小1 model.add(MaxPooling1D(pool_size=1)) # 添加全连接层,64个单元,线性激活 model.add(Dense(units=64, activation='linear')) # 输出层 model.add(Dense(1)) model.add(Activation('linear')) # 编译模型 model.compile(loss='mape', optimizer='Adam', metrics=['accuracy',percentage_difference]) # 训练模型 model.fit(X_train, y_train, batch_size = 128, epochs=5, validation_data=(X_val, y_val))
训练结果
TensorFlow version: 2.11.0 Keras version: 2.11.0 Epoch 1/5 10501/10501 [==============================] - 72s 7ms/step - loss: 100.3061 - accuracy: 0.0000e+00 - percentage_difference: 100.3061 - val_loss: 100.0071 - val_accuracy: 0.0000e+00 - val_percentage_difference: 100.0071 Epoch 2/5 10501/10501 [==============================] - 85s 8ms/step - loss: 99.9942 - accuracy: 0.0000e+00 - percentage_difference: 99.9941 - val_loss: 100.4263 - val_accuracy: 0.0000e+00 - val_percentage_difference: 100.4262 Epoch 3/5 10501/10501 [==============================] - 80s 8ms/step - loss: 99.9968 - accuracy: 0.0000e+00 - percentage_difference: 99.9968 - val_loss: 100.1386 - val_accuracy: 0.0000e+00 - val_percentage_difference: 100.1386 Epoch 4/5 10501/10501 [==============================] - 76s 7ms/step - loss: 100.0059 - accuracy: 0.0000e+00 - percentage_difference: 100.0059 - val_loss: 99.9903 - val_accuracy: 0.0000e+00 - val_percentage_difference: 99.9903 Epoch 5/5 10501/10501 [==============================] - 71s 7ms/step - loss: 100.0111 - accuracy: 0.0000e+00 - percentage_difference: 100.0111 - val_loss: 100.0600 - val_accuracy: 0.0000e+00 - val_percentage_difference: 100.0599
问题分析与解决建议
- 任务与指标不匹配:你用了分类任务的
accuracy指标,但输出层是线性激活、损失函数为mape,说明这是回归任务。回归任务中模型输出是连续值,无法用准确率衡量,因此准确率始终为0是正常现象。建议将指标替换为回归任务适用的mse、mae,移除accuracy。 - 池化层无效:
MaxPooling1D(pool_size=1)不会改变特征维度,相当于没有池化。建议调整为pool_size=2,真正实现降维提取关键特征。 - 模型结构缺失:卷积层输出是三维张量,直接接入全连接层会导致维度不兼容,必须添加
model.add(Flatten())将卷积输出展平为一维后,再输入到Dense层。同时全连接层用linear激活缺少非线性表达能力,建议换成relu。 - 损失函数优化:
mape在目标值接近0时会出现数值不稳定,可考虑改用mse(均方误差)或mae(平均绝对误差)作为损失函数,更适配多数回归场景。 - 输入编码与数据归一化:确认SMILES的编码是否正确(如one-hot编码、长度统一为29);回归任务必须对输入和标签数据做归一化/标准化处理,避免数值范围差异导致模型难以收敛。
内容的提问来源于stack exchange,提问作者Abir b
相关产品推荐
相关产品推荐

