Как обновить изображение, сгенерированное AutoEncoder, при изучении GAN с использованием AutoEncoder - PullRequest
0 голосов
/ 18 января 2019

Содержание 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

1 Ответ

0 голосов
/ 20 февраля 2019

Проблема со следующей строкой. Шум должен быть случайным образом распределенным массивом.

noise = np.array(size=[batch_size, batch_images], low=-1.0, high=1.0) 

Вы можете изменить вышеуказанную строку на следующую. А также batch_images не размер. Это массив изображений. Таким образом, вместо batch_images вы должны указать здесь форму выходного сигнала генератора. Например, если генератор выводит (64,64,3) цветное изображение, вы должны указать это вместо batch_images.

noise = np.random.uniform(size=[batch_size, gen_out_xshape, gen_out_yshape, no_of_channels], low=-1.0, high=1.0) 

Обратите внимание, что no_of_channels не требуется, если изображения имеют формат градаций серого.

...