PyTorch のデータセット Torchvision と Torchtext

PyTorch のデータセット Torchvision と Torchtext

[[421061]]

PyTorch がさまざまな種類のデータを読み込んで処理できるように、公式では torchvision と torchtext が提供されています。

以前は、torchDataLoader クラスを使用して画像を直接読み込み、テンソルに変換していました。ここでは、torchvisionとtorchtextと組み合わせてtorchに組み込まれているデータセットを紹介します。

Torchvisionのデータセット

MNIST

MNIST は、正規化され中央が切り取られた手書き画像で構成されるデータセットです。 60,000 枚以上のトレーニング画像と 10,000 枚以上のテスト画像があります。これは、学習や実験の目的で最もよく使用されるデータセットの 1 つです。データセットを読み込んで使用するには、次の構文を使用してインポートします: torchvision.datasets.MNIST()。

ファッションMNIST

Fashion MNIST データセットは MNIST に似ていますが、このデータセットには手書きの数字の代わりに T シャツ、パンツ、バッグなどの衣料品が含まれており、トレーニング サンプルとテスト サンプルの数はそれぞれ 60,000 と 10,000 です。データセットを読み込んで使用するには、次の構文を使用してインポートします: torchvision.datasets.FashionMNIST()

シーファー

CIFAR データセットには、CIFAR10 と CIFAR100 の 2 つのバージョンがあります。 CIFAR10 は 10 個の異なるラベルを持つ画像で構成され、CIFAR100 には 100 個の異なるクラスがあります。これらには、トラック、カエル、ボート、車、鹿などの一般的な画像が含まれます。

  1. torchvision.datasets.CIFAR10()
  2. torchvision.datasets.CIFAR100()

ココ

COCO データセットには、人、ボトル、文房具、本など、100,000 を超える日常的なオブジェクトが含まれています。この画像データセットは、オブジェクト検出や画像キャプション作成アプリケーションに広く使用されています。 COCO をロードできる場所は次のとおりです: torchvision.datasets.CocoCaptions()

エムニスト

EMNIST データセットは、MNIST データセットの高度なバージョンです。数字や文字を含む画像で構成されています。画像からテキストを認識する問題に取り組んでいる場合、EMNIST は良い選択です。 EMNIST をロードできる場所は次のとおりです: torchvision.datasets.EMNIST()

イメージネット

ImageNet は、高度なニューラル ネットワークをトレーニングするための主要なデータセットの 1 つです。 10,000 のカテゴリに分散された 120 万枚以上の画像で構成されています。通常、このデータセットは、単一の CPU ではこのような大規模なデータセットを処理できないため、ハイエンドのハードウェア システムにロードされます。 ImageNetデータセットをロードするためのクラスは次のとおりです: torchvision.datasets.ImageNet()

Torchtext のデータセット

IMDB

IMDB は感情分類用のデータセットで、トレーニング用に 25,000 件の非常に極端な映画レビューのセット、テスト用にさらに 25,000 件のレビューが含まれています。 torchtext クラスを使用してこれらのデータをロードします: torchtext.datasets.IMDB()

ウィキテキスト2

WikiText2 言語モデリング データセットは、1 億を超えるトークンのコレクションです。これは Wikipedia から抽出されたもので、句読点と実際の大文字と小文字が保持されています。長期的な依存関係を伴うアプリケーションで広く使用されています。このデータはtorchtextから読み込むことができます: torchtext.datasets.WikiText2()

上記の 2 つの人気データセットに加えて、SST、TREC、SNLI、MultiNLI、WikiText-2、WikiText103、PennTreebank、Multi30k など、torchtext ライブラリで利用できるデータセットが他にもあります。

MNISTデータセットを詳しく見る

MNIST は最も人気のあるデータセットの 1 つです。ここで、PyTorch が pytorch/vision リポジトリから MNIST データセットをロードする方法を確認します。まずデータセットをダウンロードし、data_trainという変数にロードしましょう。

  1. torchvision.datasetsからMNISTをインポートする
  2.  
  3. # MNISTをダウンロード
  4. data_train = MNIST( '~/mnist_data' 、 train= True 、 download= True )
  5.  
  6. matplotlib.pyplot をpltとしてインポートします。
  7.  
  8. ランダム画像 = データトレーニング[0][0]
  9. ランダム画像ラベル = データトレーニング[0][1]
  10.  
  11. # Matplotlib を使用して画像を印刷する
  12. plt.imshow(ランダム画像)
  13. print( "画像のラベルは:" , random_image_label)

DataLoaderはMNISTをロードします

次に、以下に示すように、DataLoader クラスを使用してデータセットを読み込みます。

  1. 輸入トーチ
  2. torchvisionから変換をインポート
  3.  
  4. data_train = torch.utils.data.DataLoader(
  5. MNIST(
  6. '~/mnist_data' 、トレーニング= True 、ダウンロード= True
  7. 変換 = transforms.Compose([
  8. 変換.ToTensor()
  9. ]))、
  10. バッチサイズ=64、
  11. シャッフル= 
  12.  
  13. batch_idxの場合enumerate(data_train)サンプル:
  14. print(batch_idx, サンプル)

CUDA 読み込み

GPU を有効にすると、モデルのトレーニングが高速化されます。ここで、CUDA (PyTorch の GPU サポート) を使用してデータをロードするときに使用できる構成を使用しましょう。

  1. デバイス = "cuda" 、torch.cuda.is_available() の場合、そうでない場合  "CPU"  
  2. kwargs = { 'num_workers' : 1, 'pin_memory' : True } デバイス == 'cuda'の場合 それ以外{}
  3.  
  4. トレーニングローダー = torch.utils.data.DataLoader(
  5. torchvision.datasets.MNIST( '/files/' 、トレーニング= True 、ダウンロード= True )、
  6. batch_size=batch_size_train、**kwargs)
  7.  
  8. test_loader = torch.utils.data.DataLoader(
  9. torchvision.datasets.MNIST( 'files/' 、トレーニング= False 、ダウンロード= True )、
  10. batch_size=batch_size、**kwargs)

画像フォルダ

ImageFolder は、独自の画像データセットを読み込むのに役立つ、一般的なデータ ローダー クラス torchvision です。分類問題を取り上げ、与えられた画像がリンゴかオレンジかを識別するニューラル ネットワークを構築します。 PyTorch でこれを行うには、まず次のように、画像をデフォルトのフォルダー構造に配置する必要があります。

  1. ├──オレンジ
  2. │ ├── オレンジ_image1.png
  3. │ └── オレンジ_image1.png
  4. ├── リンゴ
  5. │ └── apple_image1.png
  6. │ └── apple_image2.png
  7. │ └── apple_image3.png

これらの画像はすべて、ImageLoader クラスを使用して読み込むことができます。

  1. torchvision.datasets.ImageFolder(ルート、変換)

変換する

PyTorch Transforms は、データセット全体を独自の形式に変換できるシンプルな画像変換手法を定義します。

異なる解像度の異なる車の画像を含むデータセットの場合、トレーニング中は、トレーニング データセット内のすべての画像が同じ解像度サイズである必要があります。すべての画像を必要な入力サイズに手動で変換すると時間がかかるため、変換を使用できます。数行の PyTorch コードで、データセット内のすべての画像を必要な入力サイズと解像度に変換できます。

ここで、CIFAR10torchvision.datasets をロードし、次の変換を適用します。

  • すべての画像を32×32にサイズ変更します
  • 画像に中央切り抜き変換を適用します
  • 切り取った画像をテンソルに変換する
  • 標準化された画像
  1. 輸入トーチ
  2. torchvision をインポートする
  3. torchvision.transforms をtransformsとしてインポートします
  4. matplotlib.pyplot をpltとしてインポートします。
  5. numpyをnpとしてインポートする
  6.  
  7. 変換 = transforms.Compose([
  8. # サイズを 32×32 に変更
  9. 変換.サイズ変更(32)
  10. # センタークロップのクロッピング変換
  11. 変換.CenterCrop(32)、
  12. #から -テンソル
  13. 変換.ToTensor()、
  14. # 正規化
  15. 変換します。正規化します([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
  16. ])
  17.  
  18. トレインセット = torchvision.datasets.CIFAR10(ルート = './data' 、トレイン = True
  19. ダウンロード= True 、変換=変換)
  20. トレインローダー = torch.utils.data.DataLoader(トレインセット、バッチサイズ=4、
  21. シャッフル = False )

PyTorch でカスタムデータセットを作成する

次に、数字とテキストで構成される単純なカスタム データセットを作成します。 Dataset クラスで __getitem__() メソッドと __len__() メソッドをカプセル化する必要があります。

  • __getitem__() メソッドは、インデックスによってデータセット内の選択された例を返します。
  • __len__() メソッドはデータセットの合計サイズを返します。

以下は、FruitImagesDataset データセットをカプセル化するコードです。これは基本的に、PyTorch でカスタム データセットを作成するための優れたテンプレートです。

  1. インポートOS
  2. numpyをnpとしてインポートする
  3. cv2をインポート
  4. 輸入トーチ
  5. matplotlib.patches をパッチとしてインポートする
  6. アルバムをAとしてインポートする
  7. albumentations.pytorch.transformsからToTensorV2 をインポートします
  8. matplotlibからpyplotをpltとしてインポートします
  9. torch.utils.dataからデータセットをインポート
  10. xml.etreeからElementTree をElementTreeとしてインポートします
  11. torchvisionからtorchtransとして変換をインポートします
  12.  
  13. クラス FruitImagesDataset(torch.utils.data.Dataset):
  14. def __init__(self, files_dir, width, height, transforms=None):
  15. self.transforms = 変換
  16. self.files_dir = ファイルディレクトリ
  17. self.height = 高さ
  18. 自己.幅 = 幅
  19.  
  20.  
  21. self.imgs = [画像for image in sorted(os.listdir(files_dir))
  22. 画像[-4:] == '.jpg'の場合]
  23.  
  24. self.classes = [ '_' 'リンゴ' 'バナナ' 'オレンジ' ]
  25.  
  26. __getitem__(self, idx)を定義します。
  27.  
  28. img_name = self.imgs[idx]
  29. image_path = os.path.join (self.files_dir、img_name) です。
  30.  
  31. # 画像を読み取り正しいサイズ変換する 
  32. img = cv2.imread(画像パス)
  33. img_rgb = cv2.cvtColor(img、cv2.COLOR_BGR2RGB).astype(np.float32) で、
  34. img_res = cv2.resize(img_rgb, (self.width, self.height), cv2.INTER_AREA)
  35. # 255によるダイビング
  36. 画像解像度 /= 255.0
  37.  
  38. # 注釈ファイル
  39. annot_filename = img_name[:-4] + '.xml'  
  40. annot_file_path = os.path.join (self.files_dir、annot_filename)
  41.  
  42. ボックス = []
  43. ラベル = []
  44. ツリー = et.parse(annot_file_path)
  45. ルート = tree.getroot()
  46.  
  47. # cv2 イメージはサイズを示します ×幅
  48. 重量 = 画像の形状[1]
  49. イメージシェイプ[0]
  50.  
  51. # xmlファイルボックス座標が抽出され指定された画像サイズに合わせ修正されます
  52. root.findall( 'object' )内のメンバーの場合:
  53. ラベルを追加します(self.classes.index ( member.find( 'name' ).text))
  54.  
  55. # 境界ボックス
  56. xmin = int (member.find( 'bndbox' ).find( 'xmin' ).text)
  57. xmax = int (member.find( 'bndbox' ).find( 'xmax' ).text)
  58.  
  59. ymin = int (member.find( 'bndbox' ).find( 'ymin' ).text)
  60. ymax = int (member.find( 'bndbox' ).find( 'ymax' ).text)
  61.  
  62. xmin_corr = (xmin / wt) * 自己幅
  63. xmax_corr = (xmax / wt) * 自己幅
  64. ymin_corr = (ymin / ht) * 自己高さ
  65. ymax_corr = (ymax / ht) * 自己高さ
  66.  
  67. ボックスを追加します([xmin_corr, ymin_corr, xmax_corr, ymax_corr])
  68.  
  69. #ボックスをtorch.Tensor変換する
  70. ボックス = torch.as_tensor(ボックス、dtype=torch.float32)
  71.  
  72. #ボックス面積を取得する
  73. 面積 = (ボックス[:, 3] - ボックス[:, 1]) * (ボックス[:, 2] - ボックス[:, 0])
  74.  
  75. #すべてのインスタンスが混雑していないと仮定
  76. iscrowd = torch.zeros((boxes.shape[0],), dtype=torch.int64)
  77.  
  78. ラベル = torch.as_tensor(ラベル、dtype=torch.int64)
  79.  
  80. ターゲット = {}
  81. target[ "boxes" ] = ボックス
  82. target[ "labels" ] = ラベル
  83. target[ "area" ] = エリア
  84. ターゲット[ "iscrowd" ] = iscrowd
  85. #画像ID
  86. イメージID = torch.tensor([idx])
  87. ターゲット[ "image_id" ] = イメージID
  88.  
  89. self.transformsの場合:
  90. サンプル = self.transforms(画像 = img_res,
  91. bboxes=ターゲット[ 'ボックス' ],
  92. ラベル=ラベル)
  93.  
  94. img_res = サンプル[ '画像' ]
  95. ターゲット[ 'boxes' ] = torch.Tensor(サンプル[ 'bboxes' ])
  96. img_res、ターゲットを返す
  97. __len__(自分)を定義します:
  98. len(self.imgs)を返す
  99.  
  100. get_transform(train)を定義します。
  101. 電車の場合:
  102. A.Compose([を返す
  103. A.水平反転(0.5)、
  104. テンソルV2(p=1.0)
  105. ], bbox_params={ 'format' : 'pascal_voc' , 'label_fields' : [ 'labels' ]})
  106. それ以外
  107. A.Compose([を返す
  108. テンソルV2(p=1.0)
  109. ], bbox_params={ 'format' : 'pascal_voc' , 'label_fields' : [ 'labels' ]})
  110.  
  111. files_dir = '../input/fruit-images-for-object-detection/train_zip/train'  
  112. test_dir = '../input/fruit-images-for-object-detection/test_zip/test'  
  113.  
  114. データセット = FruitImagesDataset(train_dir, 480, 480)

<<:  ロボットが人間の「仲間」となり、人間と機械の関係が変化する。これは良いことなのか、悪いことなのか?

>>:  Kubernetes にディープラーニング モデルをデプロイする方法

ブログ    
ブログ    

推薦する

写真をビデオに変換するには、指 1 本だけが必要です。 Gen-2スポーツブラシが無料で利用可能になりました。ネットユーザー:史上最高のアップデート

「ポイント」すると動きます。Gen-2の新機能「マジックブラシ 馬亮」が正式にリリースされました。無...

2021年に注目すべき人工知能と機械学習の5つのトレンド

人工知能と機械学習は市場で注目されている技術であり、その重要性は 2020 年にピークに達しました。...

顔認識技術は議論を呼んでいる。人工知能はどのように制御されるべきか?

[[264511]]最近、米国の18歳の大学生が、アップルが顔認識ソフトウェアを使用して彼を強盗と...

旅行業界における機械学習と AI: 5 つの重要な業界ユースケース

旅行を計画していると想像してください。 数十年前であれば、旅行先や宿泊施設の選択肢を調べたり、航空券...

8つの一般的なアルゴリズムのアイデアを説明する1つの記事

アルゴリズムとデータ構造は、常にプログラマーの基本的なスキルでした。データ構造の基本インフラストラク...

Metaが人工知能チャットボット「Meta AI」をリリース

Meta は、Meta AI と呼ばれる人工知能チャットボットをリリースしました。ザッカーバーグ氏は...

...

サイバーセキュリティの専門家が知っておくべきAI用語

人工知能の急速な発展により、私たちは第四次産業革命の真っ只中にいます。このデジタル時代において、サイ...

...

2D ガール ジェネレーター、駆動可能なニューラル ネットワーク... 2019 年の優れた機械学習プロジェクト 17 選

2019 年のベスト オープンソース プロジェクトを選択するために、Medium のネットユーザーが...

コードを自動生成できるAIベースの開発ツール5選

今日、機械学習の可能性に関心を持つプログラマーは、人工知能と AI ベースのソフトウェア開発ツールを...

...

TensorFlow を使用して Android デバイスでディープラーニング推論を実装する方法

[[211369]]個人や企業にとって、ローカルデバイスでディープラーニング推論を実行することが望ま...