运行DeepChem代码遇ValueError错误,求DTNN模型输出修正方案
问题分析与解决方案
核心问题
你的代码存在三个关键错误:
- 任务类型混淆:QM7是回归任务(预测连续能量值),但你错误设置了分类任务的
n_class参数,且用了分类指标roc_auc_score。 - n_tasks参数错误:将
n_tasks设为23*23(特征维度),但n_tasks代表的是任务数量(这里仅需预测1个能量值),导致模型输出529维向量而非单个值。 - 指标不匹配:
roc_auc_score是分类任务指标,不适合回归任务评估。
修改后的完整代码
!pip install --pre deepchem import deepchem as dc import pandas as pd import torch import tensorflow as tf # 特征化设置不变 featurizers = dc.feat.CoulombMatrix(max_atoms=23) splitter = "stratified" tasks, datasets, transformers = dc.molnet.load_qm7(featurizer=featurizers, split=splitter) train_dataset, valid_dataset, test_dataset = datasets # 替换为回归任务适用的指标(比如MAE或R²) metric = dc.metrics.Metric(dc.metrics.mean_absolute_error) # 修正DTNNModel参数:n_tasks=1(单个回归任务),移除n_class参数 model = dc.models.DTNNModel(n_tasks=1) model.fit(train_dataset, nb_epoch=50) print('training set score:', model.evaluate(train_dataset, [metric])) print('test set score:', model.evaluate(test_dataset, [metric]))
验证输出
运行测试代码后,prediction的每个样本输出应为1维(单个能量值),输入输出数量会匹配:
prediction = model.predict(test_dataset) print(len(train_dataset.y)) # 5470 print(len(prediction)) # 684(和测试集样本数一致) print(len(prediction[1])) # 1(单个预测值)
关键修改点说明
- 移除n_class参数:
n_class仅用于分类任务,回归任务不需要该参数,设置后会触发分类逻辑,导致与连续标签y冲突,引发ValueError。 - n_tasks设为1:QM7每个样本仅需预测一个能量值,
n_tasks对应任务数量,而非输入特征维度。 - 更换评估指标:回归任务应使用如平均绝对误差(MAE)、R²分数等回归指标,而非分类任务的ROC-AUC。
内容的提问来源于stack exchange,提问作者Firestorm-U23
相关产品推荐
相关产品推荐

