Pytorch —— BCEWithLogitsLoss()的一些问题

本文介绍了Pytorch中的BCEWithLogitsLoss损失函数,对比了自编写的交叉熵损失函数,强调了BCEWithLogitsLoss在处理可能产生的NaN值上的优势,适合于神经网络训练中的特定场景,并提醒了输入数据的格式要求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、等价表达

  1. pytorch:

    torch.sigmoid() + torch.nn.BCELoss()
    
  2. 自己编写

    def ce_loss(y_pred, y_train, alpha=1):
        
        p = torch.sigmoid(y_pred)
        # p = torch.clamp(p, min=1e-9, max=0.99)  
        loss = torch.sum(- alpha * torch.log(p) * y_train \
               - torch.log(1 - p) * (1 - y_train))/len(y_train)
        return loss~
    
  3. 验证

    import torch
    import torch.nn as nn
    
    
    torch.cuda.manual_seed(300)       # 为当前GPU设置随机种子
    torch.manual_seed(300)            # 为CPU设置随机种子
    
    def ce_loss(y_pred, y_train, alpha=1):
       # 计算loss
       p = torch
### 使用 PyTorch 在 DeepChem 中生成或处理分子指纹 DeepChem 是一个用于药物发现、材料科学和其他化学领域研究的开源框架。它支持多种机器学习模型,包括基于 TensorFlow 和 PyTorch 的实现。为了在 DeepChem 中利用 PyTorch 处理分子指纹,可以采用以下方法。 #### 1. 安装依赖库 首先需要安装必要的 Python 库,包括 `deepchem` 和 `pytorch`。可以通过 pip 或 conda 来完成这些操作: ```bash pip install deepchem torch ``` 或者通过 Conda 进行安装: ```bash conda install -c conda-forge deepchem pytorch ``` 这一步确保环境中有最新的 DeepChem 和 PyTorch 版本[^1]。 #### 2. 加载数据集并预处理 DeepChem 提供了许多内置的数据加载器来简化数据准备过程。例如,可以从 MoleculeNet 数据集中获取化合物数据,并将其转换为适合输入的形式。 ```python import deepchem as dc from rdkit import Chem # 创建 featurizer 对象以提取分子指纹 featurizer = dc.feat.CircularFingerprint(size=1024) # 下载示例数据集 (如 Tox21) tasks, datasets, transformers = dc.molnet.load_tox21(featurizer=featurizer) train_dataset, valid_dataset, test_dataset = datasets ``` 上述代码片段展示了如何使用 CircularFingerprint 方法计算 Morgan 指纹[^3]。 #### 3. 构建自定义 PyTorch 模型 如果希望进一步定制化模型架构,则可以在 PyTorch 上构建自己的神经网络结构并与 DeepChem 配合工作。下面是一个简单的例子展示如何创建一个多层感知机(MLP)分类器: ```python import torch import torch.nn as nn import torch.optim as optim class SimpleMolecularModel(nn.Module): def __init__(self, input_dim, hidden_dim, output_dim): super(SimpleMolecularModel, self).__init__() self.fc1 = nn.Linear(input_dim, hidden_dim) self.relu = nn.ReLU() self.fc2 = nn.Linear(hidden_dim, output_dim) def forward(self, x): out = self.fc1(x) out = self.relu(out) out = self.fc2(out) return out input_size = train_dataset.X.shape[1] hidden_size = 128 output_size = len(tasks) model = SimpleMolecularModel(input_size, hidden_size, output_size).double() loss_fn = nn.BCEWithLogitsLoss() # Binary Cross Entropy Loss for multi-label tasks. optimizer = optim.Adam(model.parameters(), lr=0.001) ``` 此部分实现了基础前馈神经网络的设计[^2]。 #### 4. 训练与评估模型 最后,在训练循环中迭代更新权重参数直至收敛为止。 ```python def evaluate_model(model, dataset): model.eval() y_true = [] y_pred = [] with torch.no_grad(): for X_batch, y_batch in dataset.iterbatches(batch_size=64): outputs = model(torch.tensor(X_batch)) predicted = torch.sigmoid(outputs) >= 0.5 y_true.extend(y_batch.tolist()) y_pred.extend(predicted.int().tolist()) accuracy = sum([int(a==tuple(b)) for a,b in zip(y_true,y_pred)]) / len(y_true) return accuracy for epoch in range(epochs): model.train() total_loss = 0 for X_batch, y_batch in train_dataset.iterbatches(batch_size=64): optimizer.zero_grad() inputs = torch.tensor(X_batch).double() labels = torch.tensor(y_batch).double() outputs = model(inputs) loss = loss_fn(outputs, labels) loss.backward() optimizer.step() total_loss += loss.item() avg_loss = total_loss / len(train_dataset.y) val_acc = evaluate_model(model, valid_dataset) print(f'Epoch [{epoch+1}/{epochs}], Loss: {avg_loss:.4f}, Val Acc: {val_acc*100:.2f}%') ``` 以上脚本完成了整个流程——从读取数据到最终性能评测。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值