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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

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

機械学習

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

3255閲覧

RGB画像の1次元配列を画像の配列にする

mirai0322

総合スコア24

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

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

機械学習

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/11/20 06:07

やりたいこと

画像生成プログラムで生成した画像のビュワープログラムを書いています。
画像をreshapeし、matplotlibのimshowで表示させたいのですが、期待どおりに表示されず困っています。

全体の流れは、以下の通りです。
生成プログラムにて50x50(RGB値)のサイズの画像を生成し、1枚=1次元配列としてpkl形式で保存し、ビュワープログラムにて画像読み込み、表示させる。

調べてみたのですが、いまいち理解できず、質問する考えに至りました。
回答いただけるとありがたいです。

※生成プログラムの学習が上手くいっていないのでおかしい部分がありましたら
そちらも教えていただるとありがたいです。

生成プログラム

python

1# 1 ライブラリのインポート 2import tensorflow as tf 3import datetime as dt 4import numpy as np 5 6#学習過程で生成される画像の保管はpkl形式 7import pickle as pkl 8 9#活性化関数を指定する際に使用 10from functools import partial 11 12#各種パラメータ 13#エポック数(学習回数)ビュアーで定義 14EPOCHS = 100 15#バッチサイズ 一度に供給するデータの数 16BATCH_SIZE = 50 17#学習率 18LEARNING_RATE = 0.001 19#活性化関数のハイパーパラメータ設定 20ALPHA = 0.01 21 22categories = ["cat", "dog"] 23nb_classes = len(categories) 24 25# 2 生成モデル(Generator)を作る関数の定義 26 27def generator(randomData, alpha, reuse=False): 28 with tf.variable_scope('GAN/generator', reuse=reuse): 29 #隠れ層 30 h1 = tf.layers.dense(randomData, 256, \ 31 activation=partial(tf.nn.leaky_relu, alpha=alpha)) 32 33 #出力層 34 o1 = tf.layers.dense(h1, 50*50*3, activation=None) 35 #活性化関数 36 img = tf.tanh(o1) 37 38 return img 39 40# 3 識別モデル(Discriminator)を作る関数の定義 41def discriminator(img, alpha, reuse=False) : 42 with tf.variable_scope('GAN/discriminator', reuse=reuse): 43 #隠れ層 44 h1 = tf.layers.dense(img, 128, activation=partial(tf.nn.leaky_relu, alpha=alpha)) 45 #出力層 46 D_logits = tf.layers.dense(h1, 1, activation=None) 47 #活性化関数 48 D = tf.nn.sigmoid(D_logits) 49 50 return D, D_logits 51 52if __name__ == '__main__': 53 #データをロードする 54 image_train, image_test, label_train, label_test = np.load("./animal.npy") 55 #データを正規化する 56 image_train = image_train.astype("float") / 256 57 image_test = image_test.astype("float") / 256 58 #label_train = np_utils.to_categorical(label_train, nb_classes) 59 #label_test = np_utils.to_categorical(label_test, nb_classes) 60 61 #処理開始時間の取得 62 tstamp_s = dt.datetime.now().strftime("%H:%M:%S") 63 64 #プレースホルダー 65 #本物の画像データ(50*50px)をバッチサイズ分保管する 66 ph_realData = tf.placeholder(tf.float32, (BATCH_SIZE, 50*50*3)) 67 #100次元の一様乱数を保管するプレースホルダーを準備 68 #サイズは、学習時はバッチサイズの100件 69 ph_randomData = tf.placeholder(tf.float32, (None, 100)) 70 71 #一様乱数を与えて画像生成 72 gimage = generator(ph_randomData, ALPHA) 73 74 #本物の画像を与えて判定結果を取得 75 real_D, real_D_logits = discriminator(ph_realData, ALPHA) 76 77 #生成画像を与えて判定結果を取得 78 fake_D, fake_D_logits = discriminator(gimage, ALPHA, reuse=True) 79 80 # 4 損失関数の実装 81 #本物画像(ラベル=1)との誤差を 82 #クロスエントロピーの平均として取得 83 d_real_xentropy = \ 84 tf.nn.sigmoid_cross_entropy_with_logits(\ 85 logits=real_D_logits, labels=tf.ones_like(real_D)) 86 loss_real = tf.reduce_mean(d_real_xentropy) 87 88 ##生成画像(ラベル=0)との誤差を 89 #クロスエントロピーの平均として取得 90 d_fake_xentropy = \ 91 tf.nn.sigmoid_cross_entropy_with_logits(\ 92 logits=fake_D_logits, labels=tf.zeros_like(fake_D)) 93 loss_fake = tf.reduce_mean(d_fake_xentropy) 94 95 #discriminatorの誤差は本物画像、生成画像における誤差を合計した値 96 d_loss = loss_real + loss_fake 97 98 #Generatorの誤差を取得 99 g_xentropy = tf.nn.sigmoid_cross_entropy_with_logits(\ 100 logits=fake_D_logits, labels=tf.ones_like(fake_D)) 101 g_loss = tf.reduce_mean(g_xentropy) 102 103 #discriminatorの最適化を行う学習パラメータを取得 104 d_training_parameter = \ 105 [trainVar for trainVar in tf.trainable_variables() \ 106 if 'GAN/discriminator' in trainVar.name] 107 108 #generatorの最適化を行う学習パラメータを取得 109 g_training_parameter = \ 110 [trainVar for trainVar in tf.trainable_variables() \ 111 if 'GAN/generator' in trainVar.name] 112 113 #パラメータの最適化 114 #Discriminatorのパラメータを更新 115 d_optimize = tf.train.AdamOptimizer(\ 116 LEARNING_RATE).minimize(d_loss, var_list=d_training_parameter) 117 118 #generatorのパラメータを更新 119 g_optimize = tf.train.AdamOptimizer(\ 120 LEARNING_RATE).minimize(g_loss, var_list=g_training_parameter) 121 122 #途中経過を格納する変数 123 save_gimage = [] 124 save_loss = [] 125 126 # 5 学習処理の実装 127 with tf.Session() as sess: 128 sess.run(tf.global_variables_initializer()) 129 130 #EPOCHS数分繰り返す 131 for e in range(EPOCHS): 132 #バッチサイズ50 133 for i in range(len(image_train)//BATCH_SIZE): 134 img = [] 135 lbl = [] 136 for j in range(0, BATCH_SIZE): 137 rand = np.random.randint(len(image_train)) 138 img.append(image_train[rand]) 139 lbl.append(label_train[rand]) 140 141 batch_tuple = (np.array(img), np.array(lbl)) 142 batch_images = batch_tuple[0].reshape((BATCH_SIZE, 50*50*3)) 143 #generatorにて活性化関数tanhを使用したため、レンジを合わせる 144 batch_images = batch_images * 2 - 1 145 #generatorに渡す一様分布のランダムノイズ生成 146 #値は-1~1まで、サイズはbatch_size*100 147 batch_z = np.random.uniform(-1, 1, size=(BATCH_SIZE, 100)) 148 #最適化計算・パラメータ更新を行う 149 #discriminatorの最適化に使うデータ群をfeed_dictで与える 150 sess.run(d_optimize, feed_dict=\ 151 {ph_realData:batch_images, ph_randomData:batch_z}) 152 153 #generatorの最適化と最適化に使うデータ群をfeed_dictで与える 154 sess.run(g_optimize, feed_dict=\ 155 {ph_randomData: batch_z}) 156 157 #トレーニングロスを記録 158 train_loss_d = sess.run(d_loss, \ 159 {ph_randomData:batch_z, ph_realData:batch_images}) 160 #evalはgeneratorのロスを出力する命令 161 train_loss_g = g_loss.eval({ph_randomData: batch_z}) 162 163 #学習過程の表示 164 print(\ 165 '{0} Epoch={1}/{2}, DLoss={3:.4F}, GLoss={4:.4f}'. \ 166 format(dt.datetime.now().strftime("%H:%M:%S"), e+1, \ 167 EPOCHS, train_loss_d, train_loss_g)) 168 169 #lossを格納するためのリストに追加する 170 #後で可視化できるようにする 171 save_loss.append((train_loss_d, train_loss_g)) 172 173 #学習過程の生成モデルで画像を生成して保存 174 #一様乱数を25個生成して、そのデータを使って画像を生成し保存 175 randomData = np.random.uniform(-1, 1, size=(25, 100)) 176 #gen_samplesに現時点のモデルで作ったデータを読ませておく 177 #ノイズ、サイズ、ユニット数(128),reuseは状態維持 178 #データはrandomDataとしてfeed_dict西頴娃 179 gen_samples = sess.run(generator(ph_randomData, \ 180 ALPHA, True), feed_dict={ph_randomData:randomData}) 181 #生成画像を保存 182 save_gimage.append(gen_samples) 183 184 #pkl形式で画像を保存 185 with open('save_gimage.pkl', 'wb') as f: 186 pkl.dump(save_gimage, f) 187 188 #各エポックで得た損失関数を値を保存 189 with open('save_loss.pkl', 'wb') as f: 190 pkl.dump(save_loss, f) 191 192 #処理終了時刻の取得 193 tstamp_e = dt.datetime.now().strftime("%H:%M:%S") 194 195 time1 = dt.datetime.strptime(tstamp_s, "%H:%M:%S") 196 time2 = dt.datetime.strptime(tstamp_e, "%H:%M:%S") 197 198 #処理時間を表示 199 print("開始:{0}, 終了:{1}, 処理時間:{2}".format(tstamp_s, \ 200 tstamp_e, (time2-time1))) 201

ビュワープログラム

python

1#ビュアープログラム 2import sys 3from PIL import Image 4import numpy as np 5import matplotlib.pyplot as plt 6import pickle as pkl 7 8#エポック数(学習回数) 9#gan_mnist.pyのEPOCHSと合わせておく 10EPOCHS = 100 11 12#画像の表示を行う 13def display(fname): 14 #画像ファイルの読み込み 15 img =Image.open(fname) 16 #表示 17 img.show() 18 19#指定されたエポックにて、生成された画像の表示と保存を行う 20#ep: エポック 21#画像ファイルの出力と保存を行う 22def result(ep): 23 with open('save_gimage.pkl', 'rb') as f: 24 #生成された画像を全件読み込む 25 save_gimage = pkl.load(f) 26 #generatorで一度に25枚の画像を生成するため 27 #表示エリアに5*5のパネルを準備する 28 fig, axes = plt.subplots(5, 5, figsize=(50, 50)) 29 30 #zipで表示する画像と表示位置を 31 #対で取得し順に表示 32 for img, ax in zip(save_gimage[ep], axes.flatten()): 33 ax.xaxis.set_visible(False) #Xスケール非表示 34 ax.yaxis.set_visible(False) #Yスケール非表示 35 #画像はwidth=28, height=28のため、28*28に 36 #リシェイし、グレースケール指定で画像化する 37 ax.imshow(img.reshape(50, -1), vmin=-1, vmax=1, cmap='hsv') 38 39 #epが-1のときは、学習最後の状態で生成された画像を対象にする 40 if ep == -1: 41 ep = EPOCHS-1 42 43 #ファイル名編集 44 fname = 'GANResult_' + format(ep, '03d')+'.png' 45 print('file='+fname) 46 #ファイル出力 47 plt.savefig(fname) 48 #ファイル表示 49 display(fname) 50 51#10エポックごとの生成画像を表示 52#縦方向は10エポック単位,横方向は当該エポックで 53#生成された25枚のうち、最初の五枚を表示 54def history(): 55 with open('save_gimage.pkl', 'rb') as f: 56 #エポックごとに生成された画像を全件読み込む 57 save_gimage = pkl.load(f) 58 59 #10エポックごとに5枚の生成画像を表示するエリアを設定する 60 fig, axes = plt.subplots(int(EPOCHS/10), 5, figsize=(50,50)) 61 62 #10エポック単位に生成画像と表示位置を順に取得しながら処理を行う(縦) 63 for save_gimage, ax_row in zip(save_gimage[::10], axes): 64 #取り出したエポックには25枚の画像が含まれているため、 65 #先頭から5枚の画像を順に取り出しパネルに並べる 66 for img, ax in zip(save_gimage[::1], ax_row): 67 #画像はwidth=28, height=28のため、28*28に 68 #リシェイプし、グレースケール指定で画像化する 69 ax.imshow(img.reshape(50, -1), vmin=-1, vmax=1, cmap='hsv') 70 ax.xaxis.set_visible(False) 71 ax.yaxis.set_visible(False) 72 73 fname = 'GANHistroy.png' 74 print('file=' + fname) 75 plt.savefig(fname) 76 display(fname) 77 78#学習の経過をグラフ表示で確認する 79def loss(): 80 with open('save_loss.pkl', 'rb') as f: 81 save_loss = pkl.load(f) 82 83 #学習損失の可視化 84 fig, ax = plt.subplots() 85 loss = np.array(save_loss) 86 #転置しdiscriminatorのロスは0番目の要素から、 87 #generatorのロスは1番目の要素から取得する 88 plt.plot(loss.T[0], label='Discriminator') 89 plt.plot(loss.T[1], label='Generator') 90 plt.title('Loss') 91 plt.legend() 92 fname='GANLoss.png' 93 print('file=' + fname) 94 plt.savefig(fname) 95 display(fname) 96 97if __name__ == '__main__': 98 args = sys.argv 99 ep = 0 100 101 if len(args) == 1: 102 result(-1) 103 elif args[1] == 'h': 104 history() 105 for i in range(0, EPOCHS-1, 10): 106 result(i) 107 elif args[1] == 'l': 108 loss() 109 else: 110 result(int(args[1])) 111 112 113

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問