前提・実現したいこと。
Kerasを用いて、以下のようなGANの実装を行なっています。
生成部分はAutoencoderのように入力は画像で出力は入力と同じ画像を復元した画像です、復元された画像を判別器に入力し自作データセット上にある画像かどうかを判別してもらい、生成器、判別器を共に学習させ、生成器の方では入力を行なった画像たちに共通している特徴を得てもらうというのが目的のGANの実装を行なっています。
発生している問題・エラーメッセージ
モデルの構築は多分出来ていると思うのですが、、、
学習部分main()のコードを書く際にgenerater内の画像の更新のさせ方、画像の入力方法などが曖昧で理解が追いついてなく、色々と調べたのですが実装できていません...
分かる方がいらっしゃればご教授お願いします。
Traceback (most recent call last): File "keras_dcgan_copy.py", line 213, in <module> main() File "keras_dcgan_copy.py", line 188, in main noise = np.array(size=[batch_size, batch_images], low=-1.0, high=1.0) TypeError: Required argument 'object' (pos 1) not found
該当のソースコード
python
1from keras.models import Sequential 2from keras.layers import Dense 3from keras.layers import Reshape 4from keras.layers.core import Activation 5from keras.layers.normalization import BatchNormalization 6from keras.layers.convolutional import UpSampling2D 7from keras.layers.convolutional import Conv2D, MaxPooling2D 8from keras.layers.advanced_activations import LeakyReLU 9from keras.layers.core import Flatten,Dropout 10from keras.optimizers import Adam 11import numpy as np 12from PIL import Image 13import os 14import glob 15import random 16 17n_colors = 3 18 19def generator_model(): 20 model = Sequential() 21 #encode 22 model.add(Conv2D(64, (5, 5),input_shape=(64, 64, n_colors),activation='relu', padding='same')) 23 model.add(MaxPooling2D(pool_size=(2, 2),padding='same')) 24 25 model.add(Conv2D(32, (5, 5),activation='relu', padding='same')) 26 model.add(MaxPooling2D(pool_size=(2, 2),padding='same')) 27 28 model.add(Conv2D(16, (5, 5),activation='relu', padding='same')) 29 model.add(MaxPooling2D(pool_size=(2, 2),padding='same')) 30 #decode 31 model.add(Conv2D(16,(5,5),activation='relu',padding='same')) 32 model.add(UpSampling2D(size=(2, 2))) 33 34 model.add(Conv2D(32,(5,5),activation='relu',padding='same')) 35 model.add(UpSampling2D(size=(2, 2))) 36 37 model.add(Conv2D(64,(5,5),activation='relu')) 38 model.add(UpSampling2D(size=(2, 2))) 39 40 model.add(Conv2D(n_colors,(5,5),activation='sigmoid', border_mode='same')) 41 return model 42 43def discriminator_model(): 44 model = Sequential() 45 46 model.add(Conv2D(64, (5, 5), input_shape=(64, 64, n_colors), padding='same')) 47 model.add(Activation('tanh')) 48 model.add(MaxPooling2D(pool_size=(2, 2))) 49 50 model.add(Conv2D(128, (5, 5))) 51 model.add(Activation('tanh')) 52 model.add(MaxPooling2D(pool_size=(2, 2))) 53 model.add(Flatten()) 54 55 model.add(Dense(1024)) 56 model.add(Activation('tanh')) 57 58 model.add(Dense(1)) 59 model.add(Activation('sigmoid')) 60 return model 61 62def generator_containing_discriminator(generator, discriminator): 63 model = Sequential() 64 model.add(generator) 65 model.add(discriminator) 66 return model 67 68def image_batch(batch_size): 69 files = glob.glob("./in_images/**/*.jpg", recursive=True) 70 files = random.sample(files, batch_size) 71 print(files) 72 res = [] 73 for path in files: 74 img = Image.open(path) 75 img = img.resize((64, 64)) 76 arr = np.array(img) 77 arr = (arr - 127.5) / 127.5 78 arr.resize((64, 64, n_colors)) 79 res.append(arr) 80 return np.array(res) 81 82def combine_images(generated_images, cols=5, rows=5): 83 shape = generated_images.shape 84 h = shape[1] 85 w = shape[2] 86 image = np.zeros((rows * h, cols * w, n_colors)) 87 for index, img in enumerate(generated_images): 88 if index >= cols * rows: 89 break 90 i = index // cols 91 j = index % cols 92 image[i*h:(i+1)*h, j*w:(j+1)*w, :] = img[:, :, :] 93 image = image * 127.5 + 127.5 94 image = Image.fromarray(image.astype(np.uint8)) 95 return image 96 97def set_trainable(model, trainable): 98 model.trainable = trainable 99 for layer in model.layers: 100 layer.trainable = trainable 101 102def main(): 103 batch_size = 64 104 105 discriminator = discriminator_model() 106 generator = generator_model() 107 108 discriminator_on_generator = generator_containing_discriminator(generator, discriminator) 109 110 set_trainable(discriminator, False) 111 discriminator_on_generator.compile(loss='binary_crossentropy', optimizer=Adam(lr=0.0002, beta_1=0.5)) 112 113 print(generator.summary()) 114 print(discriminator_on_generator.summary()) 115 116 set_trainable(discriminator, True) 117 discriminator.compile(loss='binary_crossentropy', optimizer=Adam(lr=0.0002, beta_1=0.5)) 118 119 print(discriminator.summary()) 120 121 for i in range(30 * 1000): 122 batch_images = image_batch(batch_size) 123 124 # generator更新 125 #noise = np.random.uniform(size=[batch_size, batch_images], low=-1.0, high=1.0) 126 noise = np.array(size=[batch_size, batch_images], low=-1.0, high=1.0) 127 128 generated_images = generator.predict(image_batch) 129 130 # discriminatorを更新 131 X = np.concatenate((batch_images, generated_images)) 132 # 訓練データのラベルが1、生成画像のラベルが0になるよう学習する 133 y = [1] * batch_size + [0] * batch_size 134 d_loss = discriminator.train_on_batch(X, y) 135 136 # generator更新 137 noise = np.array(size=[batch_size, batch_images], low=-1.0, high=1.0) 138 139 # 生成画像をdiscriminatorにいれたときに 140 # 出力が1に近くなる(訓練画像と識別される確率が高くなる)ように学習する 141 g_loss = discriminator_on_generator.train_on_batch(noise, [1] * batch_size) 142 143 if i % 100 == 0: 144 print("step %d d_loss, g_loss : %g %g" % (i, d_loss, g_loss)) 145 image = combine_images(generated_images) 146 os.system('mkdir -p ./generate_images') 147 image.save("./gen_images/gen%05d.jpg" % i) 148 generator.save_weights('generator.h5', True) 149 discriminator.save_weights('discriminator.h5', True) 150 151main()
乱数を入力させるのではなく画の入力を行うため、numpyなどで使えそうな関数はないかと調べたのですが、いまいち分からず、、、
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー