from google.colab import drive drive.mount('/content/drive') import os import time import numpy as np import numpy.random as nr from PIL import Image import matplotlib.pyplot as plt import keras from keras.models import Sequential from keras.layers import Dense, Conv2D, BatchNormalization, Conv2DTranspose, Activation, Flatten, Dropout, Reshape, GlobalAveragePooling2D from keras.layers.advanced_activations import LeakyReLU
f = 'drive/My Drive/matikado/mati_resize/'
batch_size = 55
z_dim = 100 unroll = 1
#discriminator opt_D = keras.optimizers.Adam(lr=0.0002) #generator opt_G = keras.optimizers.Adam(lr=0.0004)
#画像場所 img_f = 'drive/My Drive/DCGAN_img/' #重み場所 para_f = 'drive/My Drive/DCGAN_para/'
x_train = [] files = os.listdir(f) for file in files: img = Image.open(f + file).convert("RGB"); img.close x_train.append(np.array(img)) x_train = np.array(x_train) x_train = (x_train - 127.5) / 127.5 print('枚数, たて, よこ, チャンネル') print(x_train.shape)
def generator_model(): model = Sequential()
#100次元 → 8*8*256=16384次元 model.add(Dense(8 * 8 * 256, input_shape = (z_dim, ))) model.add(BatchNormalization()) model.add(LeakyReLU())
#8*8*256ch model.add(Reshape((8, 8, 256))) model.add(Dropout(0.5))
#8*8*256ch → 16*16*128ch model.add(Conv2DTranspose(128, (4, 4), strides=(2, 2), padding='same')) model.add(BatchNormalization()) model.add(LeakyReLU())
#16*16*128ch → 32*32*64ch model.add(Conv2DTranspose(64, (4, 4), strides=(2, 2), padding='same')) model.add(BatchNormalization()) model.add(LeakyReLU())
#32*32*64ch → 64*64*32ch model.add(Conv2DTranspose(32, (4, 4), strides=(2, 2), padding='same')) model.add(BatchNormalization()) model.add(LeakyReLU())
#64*64*32ch → 128*128*3ch model.add(Conv2DTranspose(3, (4, 4), strides=(2, 2), padding='same')) model.add(Activation('tanh'))
return model
def discriminator_model(): model = Sequential()
#128*128*3ch → 64*64*32ch model.add(Conv2D(32, (4, 4), strides=(2, 2), padding='same', input_shape=(128, 128, 3))) model.add(BatchNormalization()) model.add(LeakyReLU())
#64*64*32ch → 32*32*64ch model.add(Conv2D(64, (4, 4), strides=(2, 2), padding='same')) model.add(BatchNormalization()) model.add(LeakyReLU())
#32*32*64ch → 16*16*128ch model.add(Conv2D(128, (4, 4), strides=(2, 2), padding='same')) model.add(BatchNormalization()) model.add(LeakyReLU())
#16*16*128ch → 8*8*256ch model.add(Conv2D(256, (4, 4), strides=(2, 2), padding='same')) model.add(BatchNormalization()) model.add(LeakyReLU())
model.add(Flatten()) model.add(Dropout(0.5)
model.add(Dense(1)) model.add(Activation('sigmoid'))
return model
def combined_model(generator, discriminator): model = Sequential() model.add(generator) model.add(discriminator) return model
generator = generator_model() #discriminator生成 discriminator = discriminator_model() #combined作成 combined = combined_model(generator, discriminator)
generator.summary() print('↑generator学習ON(combinedの中)')
discriminator.trainable = True discriminator.compile(loss='binary_crossentropy', optimizer=opt_D)
discriminator.summary() print('↑discriminator単体としては学習ON')
discriminator.trainable = False combined.compile(loss='binary_crossentropy', optimizer=opt_G)
combined.summary() print('↑combinedの中は、generatorが学習ON、discriminatorが学習OFF')
if not os.path.isdir(para_f): os.makedirs(para_f) if not os.path.isdir(img_f): os.makedirs(img_f)
z_fix = np.clip(nr.randn(10*2, z_dim), -1, 1)
print('Epoch 0/30000')
ans_g = generator.predict(z_fix, verbose=0) imgs = [] for i in range(len(ans_g)): img = Image.fromarray(np.uint8(ans_g[i] * 127.5 + 127.5)) imgs.append(img) back = Image.new('RGB', (imgs[0].width * 10, imgs[0].height * 2)) for i in range(2): for j in range(10): back.paste(imgs[i*10 + j], (j * imgs[0].height, i * imgs[0].width)) plt.figure(figsize=(10, 10)) back.save(img_f + '0.png') plt.imshow(back, vmin = 0, vmax = 255) plt.show()
generator.save(para_f + 'generator_0.h5')
#DCGAN
for epoch in range(0, 30000):
if epoch % 10 == 0:
ans_g = generator.predict(z_fix, verbose=0) imgs = [] for i in range(len(ans_g)): img = Image.fromarray(np.uint8(ans_g[i] * 127.5 + 127.5)) imgs.append(img) back = Image.new('RGB', (imgs[0].width * 10, imgs[0].height * 2)) for i in range(2): for j in range(10): back.paste(imgs[i*10 + j], (j * imgs[0].height, i * imgs[0].width)) plt.figure(figsize=(10, 10)) back.save(img_f + str(epoch) + '.png') plt.imshow(back, vmin = 0, vmax = 255) plt.show() #======================================
if epoch % 100 == 0: generator.save(para_f + 'generator_' + str(epoch) + '.h5')
itmax = x_train.shape[0] // batch_size for i in range(itmax):
#discriminator学習
x = x_train[i * batch_size : (i + 1) * batch_size] y = nr.rand(batch_size) * 0.5 + 0.7 d_loss = discriminator.train_on_batch(x, y) z = np.clip(nr.randn(batch_size, z_dim), -1, 1) x = generator.predict(z, verbose=0) y = nr.rand(batch_size) * 0.5 - 0.2 d_loss = discriminator.train_on_batch(x, y) config = discriminator.get_weights()
#unroll回学習 for k in range(unroll): x = x_train[i * batch_size : (i + 1) * batch_size] y = nr.rand(batch_size) * 0.5 + 0.7 d_loss = discriminator.train_on_batch(x, y) z = np.clip(nr.randn(batch_size, z_dim), -1, 1) x = generator.predict(z, verbose=0) y = nr.rand(batch_size) * 0.5 - 0.2 d_loss = discriminator.train_on_batch(x, y)
#generator学習 z = np.clip(nr.randn(batch_size, z_dim), -1, 1) y = nr.rand(batch_size) * 0.5 + 0.7 g_loss = combined.train_on_batch(z, y)
#unroll発動 discriminator.set_weights(config)
if epoch % 100 == 0: print('Epoch {}/30000 d_loss: {} g_loss: {}'.format(epoch, d_loss, g_loss), end='')















