pytouchで自分の画像データをロードする例


これまで学習した深さ学習アルゴリズムは、すべてネット上の既存のデータセットを使用しており、しかもそれぞれのコードがあります。自分で论文を书き始めて実験をして、自分の画像のデータ集を使う时、やっと手のつけようがないことを発见して、多くの新米がいずれもこのような问题に出会うことができることを信じます。
参考文章https://www.jb51.net/article/177613.htm
下のコードはフォルダ内からすべての画像を読み取り、正規化と標準化を行い、画像をtenssorに変換することを実現します。最後に最初の画像を読み込み、表示します。

#     
import os
import torch
from torch.utils import data
from PIL import Image
import numpy as np
from torchvision import transforms

transform = transforms.Compose([
 transforms.ToTensor(), #       Tensor,    [0,1]
 # transforms.Normalize(mean=[.5, .5, .5], std=[.5, .5, .5]) #     [-1,1]
])

#         
class FlameSet(data.Dataset):
 def __init__(self,root):
  #          
  imgs=os.listdir(root)
  self.imgs=[os.path.join(root,k) for k in imgs]
  self.transforms=transform

 def __getitem__(self, index):
  img_path = self.imgs[index]
  pil_img = Image.open(img_path)
  if self.transforms:
   data = self.transforms(pil_img)
  else:
   pil_img = np.asarray(pil_img)
   data = torch.from_numpy(pil_img)
  return data

 def __len__(self):
  return len(self.imgs)

if __name__ == '__main__':
 dataSet=FlameSet('./test')
 print(dataSet[0])
結果を表示:

補足知識:Pytouchを使ってローカルのMINISTデータセットを読み取り、搭載する
pytouchのtochvision.datasetsにはMINISTデータセットを持参し、直接モジュールを呼び出して取得することができます。また、自分のDataset類をカスタマイズしてローカルデータの読み取りと初期化データの読み取りを行うこともできます。
1.pytouchが持っているMNISTを直接使ってダウンロードする:
短所:ダウンロード速度が遅く、途中でダウンロードが失敗したら、普通は実行コードを再ダウンロードしなければなりません。

# #             
#             
trainDataset = torchvision.datasets.MNIST( # torchvision                  
  root="./data", #     ,     data    
  train=True, # train                      ,     True,                 ;     False,                 。
  transform=transforms.ToTensor(), #            transforms ,     
  download=True #           ,            ,      
)

testDataset = torchvision.datasets.MNIST(
  root="./data",
  train=False,
  transform=transforms.ToTensor(),
  download=True
)
2.カスタムdataset類はデータの読み込みと初期化を行います。
自分でダウンロードしたMINISTデータセットの内容は以下の通りです。

自分で定義したdataset類は継承が必要です。Dataset
必要な魔法の方法を実現する必要があります。
同前init_魔法の方法でデータファイルの読み込みを行います。
同前getitem_u u魔法の方法で下付きアクセスをサポートします。
同前len_魔法の方法はカスタムデータセットのサイズに戻ります。便利な後期遍歴です。
例は以下の通りです

class DealDataset(Dataset):
  """
        、     
  """
  def __init__(self, folder, data_name, label_name,transform=None):
    (train_set, train_labels) = load_minist_data.load_data(folder, data_name, label_name) #          torch.load(),        torch.Tensor  
    self.train_set = train_set
    self.train_labels = train_labels
    self.transform = transform

  def __getitem__(self, index):

    img, target = self.train_set[index], int(self.train_labels[index])
    if self.transform is not None:
      img = self.transform(img)
    return img, target

  def __len__(self):
    return len(self.train_set)
その中のロードミニスターdata.load_dataも私達が自分で書いたデータファイルを読み込む関数です。つまり、ロード(u)に置いたのです。ミニスターdata.pyの中のロード(u)data関数にあります。具体的な実現は以下の通りです

def load_data(data_folder, data_name, label_name):
 """
    data_folder:     
    data_name:      
    label_name:       
  """
 with gzip.open(os.path.join(data_folder,label_name), 'rb') as lbpath: # rb           
  y_train = np.frombuffer(lbpath.read(), np.uint8, offset=8)

 with gzip.open(os.path.join(data_folder,data_name), 'rb') as imgpath:
  x_train = np.frombuffer(
    imgpath.read(), np.uint8, offset=16).reshape(len(y_train), 28, 28)
 return (x_train, y_train)
カスタムのdatasetを作成したら、このクラスを実装してデータを読み込むことができます。

#       ,        Dataset     ,          DataLoader,    。
trainDataset = DealDataset('MNIST_data/', "train-images-idx3-ubyte.gz","train-labels-idx1-ubyte.gz",transform=transforms.ToTensor())
testDataset = DealDataset('MNIST_data/', "t10k-images-idx3-ubyte.gz","t10k-labels-idx1-ubyte.gz",transform=transforms.ToTensor())

#             
train_loader = dataloader.DataLoader(
  dataset=trainDataset,
  batch_size=100, #             ,      100   
  shuffle=False,
)

test_loader = dataloader.DataLoader(
  dataset=testDataset,
  batch_size=100,
  shuffle=False,
)
簡単な神経ネットワークを構築し、訓練とテストを行います。

class NeuralNet(nn.Module):

  def __init__(self, input_num, hidden_num, output_num):
    super(NeuralNet, self).__init__()
    self.fc1 = nn.Linear(input_num, hidden_num)
    self.fc2 = nn.Linear(hidden_num, output_num)
    self.relu = nn.ReLU()

  def forward(self,x):
    x = self.fc1(x)
    x = self.relu(x)
    y = self.fc2(x)
    return y

#      
epoches = 5
lr = 0.001
input_num = 784
hidden_num = 500
output_num = 10
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

#                      
model = NeuralNet(input_num, hidden_num, output_num)
model.to(device)
criterion = nn.CrossEntropyLoss() #            
optimizer = optim.Adam(model.parameters(), lr=lr)

#       
for epoch in range(epoches): #   epoch           
  for i, data in enumerate(train_loader):
    (images, labels) = data
    images = images.reshape(-1, 28*28).to(device)
    labels = labels.to(device)
    output = model(images) #             
    loss = criterion(output, labels.long()) #      :    (   ),    (  )
    optimizer.zero_grad() #     
    loss.backward()
    optimizer.step()

    if (i+1) % 100 == 0: # i       
      print('Epoch [{}/{}], Loss: {:.4f}'
         .format(epoch + 1, epoches, loss.item())) # {}            
                              # loss.item
#     
with torch.no_grad():
  correct = 0
  total = 0
  for images, labels in test_loader:
    images = images.reshape(-1, 28*28).to(device) #    -1           ,         ,        28 * 28
                           #       28 * 28         tensor   ,  ,       , 1
    labels = labels.to(device)
    output = model(images)
    _, predicted = torch.max(output, 1)
    total += labels.size(0) #    size()  numpy shape: np.shape(train_images)[0]
    correct += (predicted == labels).sum().item()
  print("The accuracy of total {} images: {}%".format(total, 100 * correct/total))
以上のpytouchで自分の画像データをロードした例は、小編集が皆さんに提供したすべての内容です。参考にしていただければと思います。よろしくお願いします。