Содержание main ()
При обновлении генератора
«»»
noise = np.array (size = [batch_size, batch_images], низкий = -1,0, высокий = 1,0)
«»»
Так как я использую np.array, я получаю сообщение об ошибке, и что я должен назначить этой части
Во время стандартного GAN
Я использовал следующее при обновлении генератора, но место, которое я изменил на код выше, не тренировалось
«»»
noise = np.random.uniform (size = [batch_size, batch_images], низкий = -1,0, высокий = 1,0)
'' '
Мы создаем GAN с использованием Autoencoder.
Первоначально это было в основном для того, чтобы генератор мог генерировать изображения с использованием случайных чисел, но в моем GAN мы учимся конкурировать с дискриминатором, используя генератор, который выводит то же, что и входной сигнал, как Autoencoder. Я думаю, что я думаю, что генератор имеет веса и веса, общие для Введите изображение, как мы учимся.
Несмотря на то, что я новичок, который еще начал работать с глубоким наклоном, я могу реализовать стандарт GAN, но я не могу реализовать вышеупомянутый GAN
Я думаю, что что-то не так с кодом части main (), которая занимается обучением, но если есть человек, который понимает, пожалуйста, дайте мне профессора
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Reshape
from keras.layers.core import Activation
from keras.layers.normalization import BatchNormalization
from keras.layers.convolutional import UpSampling2D
from keras.layers.convolutional import Conv2D, MaxPooling2D
from keras.layers.advanced_activations import LeakyReLU
from keras.layers.core import Flatten,Dropout
from keras.optimizers import Adam
import numpy as np
from PIL import Image
import os
import glob
import random
n_colors = 3
def generator_model():
model = Sequential()
#encode
model.add(Conv2D(64, (5, 5),input_shape=(64, 64, n_colors),activation='relu', padding='same'))
model.add(MaxPooling2D(pool_size=(2, 2),padding='same'))
model.add(Conv2D(32, (5, 5),activation='relu', padding='same'))
model.add(MaxPooling2D(pool_size=(2, 2),padding='same'))
model.add(Conv2D(16, (5, 5),activation='relu', padding='same'))
model.add(MaxPooling2D(pool_size=(2, 2),padding='same'))
#decode
model.add(Conv2D(16,(5,5),activation='relu',padding='same'))
model.add(UpSampling2D(size=(2, 2)))
model.add(Conv2D(32,(5,5),activation='relu',padding='same'))
model.add(UpSampling2D(size=(2, 2)))
model.add(Conv2D(64,(5,5),activation='relu'))
model.add(UpSampling2D(size=(2, 2)))
model.add(Conv2D(n_colors,(5,5),activation='sigmoid', border_mode='same'))
return model
def discriminator_model():
model = Sequential()
model.add(Conv2D(64(5,5),
input_shape(64,64,n_colors),padding='same'))
model.add(Activation('tanh'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(128, (5, 5)))
model.add(Activation('tanh'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(1024))
model.add(Activation('tanh'))
model.add(Dense(1))
model.add(Activation('sigmoid'))
return model
def generator_containing_discriminator(generator, discriminator):
model = Sequential()
model.add(generator)
model.add(discriminator)
return model
def image_batch(batch_size):
files = glob.glob("./in_images/**/*.jpg", recursive=True)
files = random.sample(files, batch_size)
# print(files)
res = []
for path in files:
img = Image.open(path)
img = img.resize((64, 64))
arr = np.array(img)
arr = (arr - 127.5) / 127.5
arr.resize((64, 64, n_colors))
res.append(arr)
return np.array(res)
def combine_images(generated_images, cols=5, rows=5):
shape = generated_images.shape
h = shape[1]
w = shape[2]
image = np.zeros((rows * h, cols * w, n_colors))
for index, img in enumerate(generated_images):
if index >= cols * rows:
break
i = index // cols
j = index % cols
image[i*h:(i+1)*h, j*w:(j+1)*w, :] = img[:, :, :]
image = image * 127.5 + 127.5
image = Image.fromarray(image.astype(np.uint8))
return image
def set_trainable(model, trainable):
model.trainable = trainable
for layer in model.layers:
layer.trainable = trainable
def main():
batch_size = 55
discriminator = discriminator_model()
generator = generator_model()
discriminator_on_generator = generator_containing_discriminator(generator, discriminator)
set_trainable(discriminator, False)
discriminator_on_generator.compile(loss='binary_crossentropy', optimizer=Adam(lr=0.0002, beta_1=0.5))
print(generator.summary())
print(discriminator_on_generator.summary())
set_trainable(discriminator, True)
discriminator.compile(loss='binary_crossentropy', optimizer=Adam(lr=0.0002, beta_1=0.5))
print(discriminator.summary())
for i in range(30 * 1000):
batch_images = image_batch(batch_size)
#generator update
#noise = np.random.uniform(size=[batch_size, batch_images], low=-1.0, high=1.0)
noise = np.array(size=[batch_size, batch_images], low=-1.0, high=1.0)
generated_images = generator.predict(image_batch)
# discriminator update
X = np.concatenate((batch_images, generated_images))
# Learn so that the label of the training data becomes 1 and the
# label of the generated image becomes 0
y = [1] * batch_size + [0] * batch_size
d_loss = discriminator.train_on_batch(X, y)
# generator update
noise = np.array(size=[batch_size, batch_images], low=-1.0, high=1.0)
# When I put the generated image in the discriminator
# Learn so that the output becomes close to 1
#(the probability of being identified
# as a training image increases)
g_loss = discriminator_on_generator.train_on_batch(noise, [1] * batch_size)
if i % 100 == 0:
print("step %d d_loss, g_loss : %g %g" % (i, d_loss, g_loss))
image = combine_images(generated_images)
os.system('mkdir -p ./generate_images')
image.save("./gen_images/gen%05d.jpg" % i)
generator.save_weights('generator.h5', True)
discriminator.save_weights('discriminator.h5', True)
main()
Обучение начинается нормально, генерируется какое-то изображение, и оно должно отображаться следующим образом
шаг 0 d_loss, g_loss: 0,675611 0,594226
Однако возникает следующая ошибка
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