Pytorch读取npy数据格式,编写dataset模块,可配合Dataloader进行使用

        在训练模型前,最重要的部分就是制作好数据集,有些情况下,由于图片数据过多,然后存储很不方便,我们就需要将数据制作成npy类型的数据格式。npy数据格式是一个四维的数组[N,H,W, C],其中N代表数据集的总数,H, W,C分别代表每一张图片对应的长、宽、以及通道数。

数据制作好之后,就是如何加载数据问题,TF中加载数据相对比较容易,但是Pytorch中,我们一般都是将数据制作成dataset,再传入Dataloader进行加载,因此就需要继承Dataset的类,然后编写读取npy的数据格式。Dataset中,我们需要定义三个函数。

一、__init__(self,data) 函数

主要是用来加载npy数据的,也可以加载数据预处理的函数,比如将数据转化为tensor之类的操作

 def __init__(self, data):
        self.data = np.load(data) #加载npy数据
        self.transforms = transform #转为tensor形式

二、__len__(self)函数

这个函数就是用来返回数据的总个数

 def __len__(self):
        return self.data.shape[0] #返回数据的总个数

三、 __getitem__(self,index)函数

这个是最要的函数,类似一个for循环,从头开始,每次读取一个保存在npy里面的数据,然后进行处理后,可以同时返回训练数据,以及对应的标签

    def __getitem__(self, index):
        hdct= self.data[index, :, :, :]  # 读取每一个npy的数据
        hdct = np.squeeze(hdct)  # 删掉一维的数据,就是把通道数这个维度删除
        ldct = 2.5 * skimage.util.random_noise(hdct * (0.4 / 255), mode='poisson', seed=None) * 255 #加poisson噪声
        hdct=Image.fromarray(np.uint8(hdct)) #转成image的形式
        ldct=Image.fromarray(np.uint8(ldct)) #转成image的形式
        hdct= self.transforms(hdct)  #转为tensor形式
        ldct= self.transforms(ldct)  #转为tensor形式
        return ldct,hdct #返回数据还有标签

完整的代码如下:

import torch
import numpy as np
import skimage
from torchvision import transforms
from torch.utils.data import Dataset, DataLoader
torch.manual_seed(1)  # reproducible

transform = transforms.Compose([
    transforms.ToTensor(),  # 将图片转换为Tensor,归一化至[0,1]
])
'''NPY数据格式'''
class MyDataset(Dataset):
    def __init__(self, data):
        self.data = np.load(data) #加载npy数据
        self.transforms = transform #转为tensor形式
    def __getitem__(self, index):
        hdct= self.data[index, :, :, :]  # 读取每一个npy的数据
        hdct = np.squeeze(hdct)  # 删掉一维的数据,就是把通道数这个维度删除
        ldct = 2.5 * skimage.util.random_noise(hdct * (0.4 / 255), mode='poisson', seed=None) * 255 #加poisson噪声
        hdct=Image.fromarray(np.uint8(hdct)) #转成image的形式
        ldct=Image.fromarray(np.uint8(ldct)) #转成image的形式
        hdct= self.transforms(hdct)  #转为tensor形式
        ldct= self.transforms(ldct)  #转为tensor形式
        return ldct,hdct #返回数据还有标签
    def __len__(self):
        return self.data.shape[0] #返回数据的总个数

def main():
    dataset=MyDataset('.\data_npy\img_covid_poisson_glay_clean_BATCH_64_PATS_100.npy')
    data= DataLoader(dataset, batch_size=64, shuffle=True, pin_memory=True)

if __name__ == '__main__':
	main()

 

使用PyTorch构建一个针对.npy格式点云数据的分类模型通常涉及以下几个步骤: 1. **导入库**: 首先,你需要导入必要的库,包括`torch`, `torch.nn`(用于创建神经网络),以及`numpy`用于处理.npz文件。 ```python import torch import torch.nn as nn import numpy as np from torch.utils.data import Dataset, DataLoader ``` 2. **加载和预处理数据**: 使用`np.load()`读取.npy文件,然后对点云数据进行必要的预处理,例如标准化、归一化或转换为Tensor形式。 ```python class PointCloudDataset(Dataset): def __init__(self, data_path, labels_path, transform=None): self.data = np.load(data_path) self.labels = np.load(labels_path) self.transform = transform def __len__(self): return len(self.data) def __getitem__(self, idx): point_cloud = self.data[idx] label = self.labels[idx] if self.transform: point_cloud = self.transform(point_cloud) return torch.tensor(point_cloud), torch.tensor(label) ``` 3. **定义网络结构**: 创建一个卷积神经网络(CNN)或点云特定的架构,比如PointNet、DGCNN等,用于特征提取。 ```python class PointCloudClassifier(nn.Module): def __init__(self, num_classes): super(PointCloudClassifier, self).__init__() self.conv1 = PointConv(3, 64) # 输入通道数为3(XYZ坐标) self.pool1 = nn.MaxPool1d(num_points // 2) # 点池化 self.conv2 = PointConv(64, 128) self.pool2 = nn.MaxPool1d(num_points // 4) self.fc1 = nn.Linear(128 * num_features_per_point, 512) self.fc2 = nn.Linear(512, num_classes) def forward(self, x): x = self.conv1(x) x = F.relu(x) x = self.pool1(x) x = self.conv2(x) x = F.relu(x) x = self.pool2(x) global_descriptor = torch.max(x, dim=1).values # 获取每个点的最大值作为全局描述符 global_descriptor = global_descriptor.view(-1, 128 * num_features_per_point) global_descriptor = F.relu(self.fc1(global_descriptor)) class_scores = self.fc2(global_descriptor) return class_scores ``` 4. **训练模型**: 定义损失函数(如交叉熵)、优化器(如Adam),并设置数据加载器进行训练和验证。 ```python model = PointCloudClassifier(num_classes) criterion = nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(), lr=0.001) def train_epoch(dataloader): model.train() for data, target in dataloader: optimizer.zero_grad() output = model(data) loss = criterion(output, target) loss.backward() optimizer.step() # ...训练过程... ``` 5. **评估与预测**: 测试集上运行模型,并查看性能指标(准确率、精确度、召回率等)。 ```python def test_epoch(dataloader): model.eval() correct, total = 0, 0 with torch.no_grad(): for data, target in dataloader: output = model(data) _, predicted = torch.max(output.data, 1) total += target.size(0) correct += (predicted == target).sum().item() accuracy = correct / total ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值