🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

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

Q&A

解決済

1回答

7029閲覧

ImageNetの正規化の戻し方

spiii

総合スコア24

PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

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

0グッド

0クリップ

投稿2019/12/29 13:50

現在ImageNetを用いて機械学習を試みています。
フレームワークとしてはPyTorchを使用しています。

1枚目の画像は

IMAGENET_SIZE = 224 IMAGENET_TRANSFORM = trans.Compose([ trans.Scale(256), trans.CenterCrop(224), trans.ToTensor(), ])

の変換を行なって表示したものです。
二枚目は
上のものに

IMAGENET_MEAN = [0.485, 0.456, 0.406] IMAGENET_STD = [0.229, 0.224, 0.225] trans.Normalize(IMAGENET_MEAN, IMAGENET_STD)

という正規化を施し、

x = x.mul(torch.FloatTensor(tools.IMAGENET_STD).view(3,1,1)) x = x.add(torch.FloatTensor(tools.IMAGENET_MEAN).view(3,1,1)).detach().numpy() x = np.transpose( x , (1,2,0)) x = np.clip(x, 0, 1)

で、正規化を元に戻したつもりなのですが、見ての通りうまく戻せていませんでした。

正規化なしをimshowで表示
正規化したものを逆変換して表示

現在pytorch経由でdownloadできなかったため、ほとんどcopyですが、自作しています。以下に添付しておきます。
質問としては、どうすれば正規化したものを元に戻せるのでしょうか?

python

1from __future__ import print_function, division 2import numpy as np 3import requests, io 4from skimage import io, transform 5import os 6import torch 7import pandas as pd 8from skimage import io, transform 9import numpy as np 10from PIL import Image 11import scipy.io 12from torch.utils.data import Dataset, DataLoader 13from torchvision import transforms, utils 14 15# Ignore warnings 16import warnings 17warnings.filterwarnings("ignore") 18 19def parse_meta(root): 20 meta = scipy.io.loadmat(root + "/data/meta.mat") 21 original_idx_to_synset = {} 22 synset_to_name = {} 23 24 for i in range(1000): 25 ilsvrc2012_id = int(meta["synsets"][i,0][0][0][0]) 26 synset = meta["synsets"][i,0][1][0] 27 name = meta["synsets"][i,0][2][0] 28 original_idx_to_synset[ilsvrc2012_id] = synset 29 synset_to_name[synset] = name 30 31 synset_to_keras_idx = {} 32 keras_idx_to_name = {} 33 f = open(root + "/data/synset_words.txt","r") 34 idx = 0 35 for line in f: 36 parts = line.split(" ") 37 synset_to_keras_idx[parts[0]] = idx 38 keras_idx_to_name[idx] = " ".join(parts[1:]) 39 idx += 1 40 f.close() 41 def convert_original_idx_to_keras_idx(idx): 42 return synset_to_keras_idx[original_idx_to_synset[idx]] 43 f = open(root + "/data/ILSVRC2012_validation_ground_truth.txt", "r") 44 y_val = f.read().strip().split("\n") 45 y_val = list(map(int, y_val)) 46 y_val = np.array([convert_original_idx_to_keras_idx(idx) for idx in y_val]) 47 f.close() 48 return y_val 49 50def get_labelname_list(): 51 y_val = parse_meta('/home/kazuki/workspace/simple-blackbox-attack/image_net/') 52 labels_link = "https://savan77.github.io/blog/files/labels.json" 53 labels_json = requests.get(labels_link).json() 54 labels_name = {int(idx):label for idx, label in labels_json.items()} 55 return labels_name 56 57class ImageNetVal(torch.utils.data.Dataset): 58 def __init__(self, root, transform=None): 59 self.root = root 60 self.transform = transform 61 62 self.fns = os.listdir(os.path.join(self.root + "/val/images")) 63 self.fns.sort() 64 self.fns = [ 65 self.root + "val/images/" + fn for fn in self.fns 66 ] 67 68 self.labels = parse_meta(self.root) 69 labels_link = "https://savan77.github.io/blog/files/labels.json" 70 labels_json = requests.get(labels_link).json() 71 self.labels_name = {int(idx):label for idx, label in labels_json.items()} 72 73 74 def __getitem__(self, idx): 75 if torch.is_tensor(idx): 76 idx = idx.tolist() 77 78 img_name = self.fns[idx] 79 img = Image.open(img_name).convert('RGB') 80 81 label = self.labels[idx] 82 83 if self.transform: 84 img = self.transform(img) 85 86 sample = {'image' : img, 'label' : label} 87 return img, label 88 89 def __len__(self): 90 return len(self.fns) 91

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

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

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

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

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

guest

回答1

0

ベストアンサー

質問のコードで問題ないと思います。
以下、正規化したあと、戻す処理のみ記載したコードです。

python

1import numpy as np 2import matplotlib.pyplot as plt 3import torch 4from PIL import Image 5from torchvision import transforms 6 7IMAGENET_MEAN = [0.485, 0.456, 0.406] 8IMAGENET_STD = [0.229, 0.224, 0.225] 9IMAGENET_SIZE = 224 10 11transform = transforms.Compose( 12 [ 13 transforms.Resize(256), 14 transforms.CenterCrop(IMAGENET_SIZE), 15 transforms.ToTensor(), 16 transforms.Normalize(IMAGENET_MEAN, IMAGENET_STD), 17 ] 18) 19 20img = Image.open("sample.jpg") 21 22x = transform(img) 23x = x.mul(torch.FloatTensor(IMAGENET_STD).view(3, 1, 1)) 24x = x.add(torch.FloatTensor(IMAGENET_MEAN).view(3, 1, 1)).detach().numpy() 25x = np.transpose(x, (1, 2, 0)) 26print(x.shape, x.dtype) 27 28plt.imshow(x) 29plt.show()

イメージ説明

投稿2019/12/29 18:14

tiitoi

総合スコア21956

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

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

spiii

2019/12/30 18:16

他のところで間違っているのですね... ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問