PyTorch载入图片后ToTensor解读

本文介绍如何使用PyTorch进行图像处理任务。首先利用dataset和dataloader类读取图像数据,接着通过transform变换预处理图像,其中包括关键的ToTensor()操作,用于将图像数据转换为torch.FloatTensor格式。

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

转:https://www.cnblogs.com/ocean1100/p/9494640.html

PyTorch在做一般的深度学习图像处理任务时,先使用dataset类和dataloader类读入图片,在读入的时候需要做transform变换,其中transform一般都需要ToTensor()操作,将dataset类中__getitem__()方法内读入的PIL或CV的图像数据转换为torch.FloatTensor。

### 如何在 PyTorch 中实现分类计数功能 在深度学习任务中,尤其是涉及分类的任务时,统计预测类别分布是一项常见需求。以下是基于 PyTorch 的方法来实现分类计数的功能。 #### 1. 数据准备与模型输出 假设我们有一个经过训练的神经网络模型 `model` 和一批测试数据 `data_loader`。对于每批输入数据,模型会返回一个形状为 `[batch_size, num_classes]` 的张量作为 logits 或概率分布[^3]。 ```python import torch # 假设 model 已经加载并准备好进行推理 num_classes = 5 # 类别的数量 class_counts = torch.zeros(num_classes) for images, labels in data_loader: outputs = model(images) # 获取模型输出 _, predicted = torch.max(outputs.data, 1) # 找到最大值对应的索引 # 统计每个类别的预测次数 unique_values, counts = torch.unique(predicted, return_counts=True) class_counts[unique_values] += counts ``` 上述代码通过 `torch.max()` 函数获取每张图片的最大预测值及其对应类别,并利用 `torch.unique()` 来计算每个类别的出现频率。 --- #### 2. 处理不平衡数据集 如果数据集中某些类别的样本较少,则可能会影响最终的分类计数结果。可以引入权重调整机制: ```python weights = compute_class_weight('balanced', classes=np.arange(num_classes), y=train_labels.numpy()) class_weights = torch.tensor(weights, dtype=torch.float).to(device) loss_fn = torch.nn.CrossEntropyLoss(weight=class_weights) ``` 此处使用了 Scikit-learn 提供的 `compute_class_weight` 方法生成平衡权重,并将其传递给损失函数以减轻类别不均衡的影响。 --- #### 3. 自定义指标评估 为了更全面地分析分类性能,还可以扩展其他评价标准,比如精确率 (Precision)、召回率 (Recall) 及 F1-Score: ```python from sklearn.metrics import precision_recall_fscore_support with torch.no_grad(): all_preds = [] all_targets = [] for inputs, targets in test_loader: preds = model(inputs.to(device)) _, pred_indices = torch.max(preds, dim=-1) all_preds.extend(pred_indices.cpu().numpy()) all_targets.extend(targets.cpu().numpy()) precision, recall, f_score, _ = precision_recall_fscore_support(all_targets, all_preds, average='macro') print(f'Precision: {precision}, Recall: {recall}, F1 Score: {f_score}') ``` 此片段展示了如何结合 Sklearn 库完成进一步的结果解析。 --- #### 4. 结合 Canny 边缘检测优化特征提取 尽管传统意义上 Canny 滤波器主要用于图像处理领域中的边缘检测,但在特定场景下也可以辅助增强目标对象边界信息从而提升分类准确性[^5]。下面给出一段简单示例说明如何将两者结合起来应用: ```python def canny_edge_detection(image_tensor): gray_image = image_tensor.mean(dim=1, keepdim=True) # 转灰度图 [B,C,H,W]->[B,1,H,W] sobel_x_kernel = torch.tensor([[-1., 0., 1.], [-2., 0., 2.], [-1., 0., 1.]]) sobel_y_kernel = sobel_x_kernel.T edges_x = torch.conv2d(gray_image, sobel_x_kernel.unsqueeze(0).unsqueeze(0)) edges_y = torch.conv2d(gray_image, sobel_y_kernel.unsqueeze(0).unsqueeze(0)) magnitude = torch.sqrt(edges_x ** 2 + edges_y ** 2) # 计算梯度幅值 direction = torch.atan2(edges_y, edges_x) # 方向角 return magnitude, direction magnitudes, directions = canny_edge_detection(input_images) enhanced_features = combine_with_original(magnitudes, input_images) outputs = model(enhanced_features) ``` 以上代码实现了基本版 Sobel 运算模拟 Canny 第一阶段操作,并尝试融合原始像素强度形成新的表征形式供给后续全连接层解读。 --- #### 总结 综上所述,在 PyTorch 上构建一套完整的分类计数方案不仅需要合理设计前馈流程,还需兼顾实际业务背景下的特殊考量因素。无论是基础逻辑还是高级技巧都值得深入探讨实践验证其效果优劣之处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值