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

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

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

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

Python

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

Q&A

解決済

1回答

3874閲覧

numpy.reshapeの変換エラーについて

mirai0322

総合スコア24

NumPy

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

Python

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

0グッド

0クリップ

投稿2018/11/16 15:42

前提・実現したいこと

PythonでTesnsorflowを使用し、GANによる画像生成プログラムをかいています。
学習画像を読み込み、配列に格納し、numpy.reshape()で形状変換しようとしたところ、
以下のエラーが発生しました。

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

type(batch_tuple) : <class 'tuple'> type(batch_tuple[0]) : <class 'numpy.ndarray'> type(batch_tuple[0][0]) : <class 'numpy.ndarray'> len(batch_tuple[0]) : 50 len(batch_tuple[0][0]) : 50 sum : 2500 Traceback (most recent call last): File "gan_mnist.py", line 173, in <module> batch_images = batch_tuple[0].reshape((BATCH_SIZE, 50)) ValueError: cannot reshape array of size 375000 into shape (50,50)

数値データに変換するコード(問題なく動作する)

Python

1from sklearn.model_selection import train_test_split 2from PIL import Image 3import os, glob 4import numpy as np 5 6root_dir = "./images" #画像ファイルのあるルートディレクトリ 7categories = ["cat", "dog"] #カテゴリーセット 8 9images_data = [] #画像データ 10label_data = [] #ラベルデータ 11 12#ラベリング 13for index, name in enumerate(categories): 14 #画像ディレクトリのパス 15 image_dir = root_dir + "/" + name 16 #ディレクトリ内の全画像ファイルを取得 17 files = glob.glob(image_dir + "/*.jpg") 18 print("-----", name, "処理中-----") 19 for index, file in enumerate(files): 20 print(file , "-----loading") 21 #画像読み込み 22 img = Image.open(file) 23 #カラーモードをRGBにする 24 img = img.convert("RGB") 25 #画像をリサイズする 26 img = img.resize((50, 50)) 27 #配列に変換 28 data = np.asarray(img) 29 #リストに追加 30 images_data.append(data) 31 label_data.append(index) 32#配列に変換、格納 33images_data = np.array(images_data) 34label_data = np.array(label_data) 35 36#学習データとテストデータを分ける 37image_train, image_test, label_train, label_test = train_test_split(images_data, label_data) 38#タプルに格納 39xy = (image_train, image_test, label_train, label_test) 40#ファイル保存 41np.save("./images/animal.npy", xy) 42print("ok,", len(label_data))

画像生成プログラム(該当コード)

Python

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

試したこと

上のエラーメッセージのところにも載せてあるが、配列の要素数の確認をしてみたが、
問題はなさそうだった。

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

Tensorflow 1.11.0
Numpy 1.15.3

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーを見る限り375000サイズを50x50=2500に変更することはできませんとでていると思います。また、画像データを入力すると考えるならば、(BATCH_SIZE, hwc)の入力tensorになると考えられます。375000のサイズから推論させて頂くと、(50, 50503)のサイズを期待しているのではないでしょうか。そのため、 batch_tuple[0].reshape((BATCH_SIZE, 50*50*3))としてみては如何でしょうか。

投稿2018/11/18 08:12

Hiroki013

総合スコア99

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

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

mirai0322

2018/11/18 13:42

回答ありがとうございます ご教授頂いた通りにしたら解決しました。 Pythonを触り始めたばかりでわからないのですが、h*w*cのcの部分にはどんな数値が入るのですか?
Hiroki013

2018/11/18 22:57

cはチャネルでRGBであれば3,グレースケールであれば1が入ると思います(グレースケールでも3次元に同じ値を入れて3にするケースも見たことがあります.).これはどちらかというとPythonというよりは画像の取扱に関する知識だと思います.
mirai0322

2018/11/20 06:58

そうなのですね ありがとうございます!
mirai0322

2018/11/20 06:58

そうなのですね ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問