Проблемы с настройкой градиентов GAN в керасеPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Проблемы с настройкой градиентов GAN в керасе

Сообщение Anonymous »

Имея некоторый опыт разработки нейронных сетей в Керасе, я решил написать нестандартный GAN, который таковым и не назовешь. Дело в том, что дискриминатор — это готовая нейросеть, которая прекрасно предсказывает качество изображения лица, а я хотел, чтобы моя сеть увеличивала разрешение изображений 48 на 48 в 4 раза (сделала их 96 на 96). Мой штатный ГАН с обучаемым дискриминатором просто интерполировал изображение на большее пространство с потерей качества, как если бы вы просто увеличили изображение на компьютере. Для меня не столь важно, чтобы изображение было полной копией, поэтому идея с готовым дискриминатором мне показалась удачной.
Вот код пошаговой функции поезда:< /p>

Код: Выделить всё

@tf.function
def train_step(images_x, images_y):

with tf.GradientTape() as gen_tape:
generated_images = generator(images_x, training=True).numpy()

#Integrating ready-made network, which returns numpy array with shape (batch_size, 1) and contains scalars representing the number in range of 0-1
fake_output = K.constant(face_detector.estimate(generated_images)) #K = tensorflow backend

gen_loss = generator_loss(fake_output)

gradients_of_generator = gen_tape.gradient(gen_loss, generator.trainable_variables)

generator_optimizer.apply_gradients(zip(gradients_of_generator, generator.trainable_variables))

return gen_loss
Общая функция поезда:

Код: Выделить всё

def train(dataset_x, dataset_y, epochs):
history = []
MAX_PRINT_LABEL = 10
th = BUFFER_SIZE // (BATCH_SIZE * MAX_PRINT_LABEL)

for epoch in range(1, epochs + 1):
print(f'{epoch}/{EPOCHS}: ', end='')

start = time.time()
n = 0

gen_loss_epoch = 0
l = len(dataset_x)
for o in range(l):
tf.config.run_functions_eagerly(True) #I'm suspecting the issue is related to this, but i can't do it without running eagerly (train_step doesn't work)
gen_loss = train_step(dataset_x[o], dataset_y[o])
tf.config.run_functions_eagerly(False)
print(gen_loss, disc_loss)
gen_loss_epoch += K.mean(gen_loss)
if (n % th == 0): print('=', end='')
n += 1
generator.save("generator.h5")

history += [gen_loss_epoch / n]

return history
структура генератора и другое

Код: Выделить всё

cross_entropy = tf.keras.losses.BinaryCrossentropy(from_logits=True)

hidden_dim = 2

def dropout_and_batch():
return Dropout(0.3)(BatchNormalization())

img_height = 96
img_width = 96
img_channels = 3
latent_dim = 2
input_img = Input(shape=(48, 48, 3))
x = Conv2D(32, 3, padding='same', activation='relu')(input_img)
x = Conv2D(32, 3, padding='same', activation='relu')(x)
x = Conv2D(32, 3, padding='same', activation='relu')(x)

x = Flatten()(input_img)
z_mean = Dense(latent_dim)(x)
z_log_var = Dense(latent_dim)(x)
@keras.saving.register_keras_serializable()
def sampling(args):
z_mean, z_log_var = args
epsilon = tf.random.normal([batch_size, latent_dim], 0, 1, tf.float32)
return z_mean + tf.exp(0.5 * z_log_var) * epsilon
z = Lambda(sampling, output_shape=(latent_dim,))([z_mean,
z_log_var])

decoder_input = Input(shape=(latent_dim,))
x = Dense(img_width*img_height*3, activation='relu')(decoder_input)
x = Reshape((img_width, img_height, 3))(x)
x = Conv2D(32, 3, padding='same', activation='relu')(x)
x = Conv2D(32, 3, padding='same', activation='relu')(x)
decoded = Conv2D(3, 3, padding='same', activation='sigmoid')(x)

encoder = Model(input_img, [z_mean, z_log_var, z])
decoder = Model(decoder_input, decoded)

generator = Model(input_img, decoder(encoder(input_img)[2]))
пользовательская функция потерь:

Код: Выделить всё

def generator_loss(fake_output):
loss = cross_entropy(tf.ones_like(fake_output), fake_output)
return loss
загрузка набора данных:

Код: Выделить всё

for path in glob("faces/*.jpg"):
img = Image.open(path)
y_train.append(np.asarray(img.resize((96, 96))))
if y_train[-1].shape != (96, 96, 3):
del y_train[-1]
continue
x_train.append(np.asarray(img.resize((48, 48))))
x_train = np.asarray(x_train)/255
y_train = np.asarray(y_train)/255

BUFFER_SIZE = x_train.shape[0]
BATCH_SIZE = 100

BUFFER_SIZE = BUFFER_SIZE // BATCH_SIZE * BATCH_SIZE
x_train = x_train[:BUFFER_SIZE]
y_train = y_train[:BUFFER_SIZE]
print(x_train.shape, y_train.shape)

train_dataset_x = list(tf.data.Dataset.from_tensor_slices(x_train).shuffle(BUFFER_SIZE).batch(BATCH_SIZE))
train_dataset_y = list(tf.data.Dataset.from_tensor_slices(y_train).shuffle(BUFFER_SIZE).batch(BATCH_SIZE))
У меня возникла ошибка, которую я до сих пор не могу устранить самостоятельно и с помощью Gemini уже долгое время: ValueError: ни для одной переменной не предусмотрены градиенты (она указывает на строкуgenerator_optimizer .apply_gradients(zip(gradients_of_generator,generator.trainable_variables)))

Подробнее здесь: https://stackoverflow.com/questions/791 ... n-in-keras
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как статически обучать GAN в керасе?
    Anonymous » » в форуме Python
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Нормализация в Керасе
    Anonymous » » в форуме Python
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • Метод preprocess_input() в керасе
    Гость » » в форуме Python
    0 Ответы
    21 Просмотры
    Последнее сообщение Гость
  • Пользовательская функция активации в керасе с использованием мощности с десятичной точкой
    Гость » » в форуме Python
    0 Ответы
    25 Просмотры
    Последнее сообщение Гость
  • Потеря нана в керасе при работе над моделью семантической сегментации для сегментации опухолей головного мозга, задача 2
    Anonymous » » в форуме Python
    0 Ответы
    48 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»