質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

2137閲覧

numpy配列からtensorへの標準化と正規化

wataske

総合スコア11

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/11/20 04:06

編集2021/11/21 16:10

前提・実現したいこと

はじめまして。pythonのpytorchにて道路標識の判別をするモデルを機械学習にて実装したいと考えています。データセットはppm形式のものをnumpy配列に変換し、以下のソースコードはそこからtensorの形へ変換させているところです。tensorの中身の画像を表示させたいと思ったのですが以下のエラーコードが発生しました。

発生している問題・エラーメッセージ

Invalid shape (6502, 42, 50) for image data

該当のソースコード

python

1def dataset(n): 2 x = X_train 3 y = y_train 4 x = torch.FloatTensor(x) 5 y = torch.FloatTensor(y) 6 return torch.utils.data.TensorDataset(x, y) 7data_number = 10000 #準備するデータの数 8batch_size = 1000 # 1つのミニバッチのデータの数 9data_loader = torch.utils.data.DataLoader(dataset(data_number), batch_size=batch_size,shuffle=True,num_workers=2) 10def imshow(img): 11 img = img / 2 + 0.5 # 正規化を戻す 12 npimg = img.numpy() 13 plt.imshow(np.transpose(npimg, (1, 2, 0))) 14 plt.show() 15 16 17# 適当な訓練セットの画像を取得 18dataiter = iter(data_loader) 19images, labels = dataiter.next() 20 21# 画像の表示 22imshow(torchvision.utils.make_grid(images)) 23# ラベルの表示 24print(' '.join('%5s' % classes[labels[j]] for j in range(4))) 25

試したこと

tensorの配列へ変換する際に標準化する必要があるのではないかと思いtorchvision.transforms.ToTensor()なども試してみたのですがうまくいきませんでした。

補足情報(FW/ツールのバージョンなど)

環境はjupyter notebook,windows10,python=3.8です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbpb0

2021/11/20 22:20

質問内容とは直接関係無いかもしれませんが、 data_number = 10000 #準備するデータの数 からの3行のインデントが間違ってませんでしょうか?
wataske

2021/11/21 16:07

すみません!jupyter notebookで実行していたものをコピペで貼り付けていたためインデント間違いがありました!ご指摘ありがとうございます!
guest

回答1

0

ベストアンサー

元データのnumpy配列のshape等の、質問の記述では不明な部分を補って、下記のコードを実行したら、エラー出ずに実行できました

python

1import numpy as np 2import matplotlib.pyplot as plt 3import torch 4import torchvision 5 6# 画素数28x28、3チャンネル、10000サンプル 7# 画素値 -1.0〜1.0 8# PyTorchのshape「Channel First」に合わせる 9X_train = (np.random.rand(10000, 3, 28, 28) - 0.5) * 2.0 10 11# 10000サンプル 12# 値 0〜19 13y_train = np.random.randint(0, 20, 10000).astype(int) 14 15# Pascal VOC 20 classesと同じ 16classes = ['aeroplane', 'bicycle', 'bird', 'boat', 17 'bottle', 'bus', 'car', 'cat', 'chair', 18 'cow', 'diningtable', 'dog', 'horse', 19 'motorbike', 'person', 'pottedplant', 20 'sheep', 'sofa', 'train', 'tvmonitor'] 21 22## ここまで追加 23## 以下は質問のコードから一部変更 24 25def dataset(n): 26 x = X_train 27 y = y_train 28 x = torch.FloatTensor(x) 29 y = torch.FloatTensor(y) 30 return torch.utils.data.TensorDataset(x, y) 31 32## 質問のコードから変更:インデント無しにする 33data_number = 10000 #準備するデータの数 34batch_size = 1000 # 1つのミニバッチのデータの数 35data_loader = torch.utils.data.DataLoader(dataset(data_number), batch_size=batch_size,shuffle=True,num_workers=2) 36 37def imshow(img): 38 img = img / 2 + 0.5 # 正規化を戻す 39 npimg = img.numpy() 40 plt.imshow(np.transpose(npimg, (1, 2, 0))) 41 plt.show() 42 43 44# 適当な訓練セットの画像を取得 45dataiter = iter(data_loader) 46images, labels = dataiter.next() 47 48# 画像の表示 49imshow(torchvision.utils.make_grid(images)) 50# ラベルの表示 51## 質問のコードから変更:labels[]が整数ではないのでint()を付ける 52print(' '.join('%5s' % classes[int(labels[j])] for j in range(4)))

上記コードで、X_trainのshapeはPyTorchのshape「Channel First」に合わせてます
質問のコードでは、X_trainからTensorに変換する際に「Channel First」に変換してないので、ppmファイルからX_trainを作成する段階で既に「Channel First」に変換済みと仮定しました

質問者さんがコードを実行してる際のX_trainの実際のshapeがどうなってるか、確認してみてください

投稿2021/11/21 10:06

jbpb0

総合スコア7651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wataske

2021/11/21 16:06

ご回答いただきありがとうございます。 確認したところtensorの形がChannel Lastで形成されていました!そこでChannel Firstにしたのち同様に画像の表示を試みたのですが"Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers)."とまた別のエラーが発生してしまいました... 少し調べたのですがデータの型がfloatsであるためにintにしなければならないということでしょうか?無知で大変申し訳ないのですがこのエラーはどういった意味なのでしょうか?
jbpb0

2021/11/22 01:14 編集

もし、現状「X_train」に入ってる値が0〜255の範囲なら、下記を追加して、予め-0.1〜0.1の範囲に変えておいてください X_train = (X_train / 255 - 0.5) * 2.0 > [0..1] for floats or [0..255] for integers と書かれてる通り、下記の「どちらか」じゃないと「plt.imshow」で表示できません ・0.0〜1.0の浮動小数点数 ・0〜255の整数 現状「X_train」に入ってる値が0〜255の範囲なら、「torch.FloatTensor」で浮動小数点数にして、 img = img / 2 + 0.5 で0.5〜128.0の範囲に変えて、それを「plt.imshow」で表示させようとしてるので、表示できる条件に反してます 「X_train」の値を-0.1〜0.1の範囲に変えたら、 img = img / 2 + 0.5 で0.0〜1.0の範囲になるので、大丈夫です
wataske

2021/11/22 16:26

確認したところX_trainに格納されている値が0~255のintになっていました。 jbpb0様の追加コードを入力したとこ問題なく画像を表示させることができました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問