Измените этот код Python Keras на код DeepLearning4j

#tensorflow #artificial-intelligence #minecraft #generative-adversarial-network #deeplearning4j

Вопрос:

Таким образом, похоже, что tensorflow для Python и выпущенная в настоящее время версия Jython несовместимы, поэтому я пишу свою модель искусственного интеллекта (GAN) на Java. Я следую руководству python в Keras и Tensorflow для своей модели GAN. Я выяснил, как настроить свой код нейронной сети python на Java с помощью DeepLearning4j. Проблема в том, что я не могу настроить функцию обучения в DeepLearning4j.

Вот обучающий код на python, из которого я следую:

 generator_optimizer = tf.keras.optimizers.Adam(generator_lr) # learning rate for generator
discriminator_optimizer = tf.keras.optimizers.Adam(discriminator_lr) # learning rate for discriminator


seed = tf.random.normal([num_examples_to_generate, noise_dim]) 

# ignore this; I already have dataset code set up
train_dataset = tf.data.Dataset.from_tensor_slices(train_images_scaled).shuffle(BUFFER_SIZE).batch(BATCH_SIZE)

@tf.function
def train_step(images):
    noise = tf.random.normal([BATCH_SIZE, noise_dim])

    with tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape:

      generated_images = generator(noise, training=True) #generator model is already set up under the name "generator"

      
      real_output = discriminator(images, training=True) #discriminator model is already set up as "discriminator"
      fake_output = discriminator(generated_images, training=True)

      
      gen_loss = generator_loss(fake_output) #predefined function that calculates the loss of the generator as a decimal value using the loss of the discriminator; uses crossentropy
      disc_loss = discriminator_loss(real_output, fake_output) #predefined function that calculates the loss of the discriminator as a decimal value

    
    gradients_of_generator = gen_tape.gradient(gen_loss, generator.trainable_variables)
    gradients_of_discriminator = disc_tape.gradient(disc_loss, discriminator.trainable_variables)

    generator_optimizer.apply_gradients(zip(gradients_of_generator, generator.trainable_variables))
    discriminator_optimizer.apply_gradients(zip(gradients_of_discriminator, discriminator.trainable_variables))

def train(dataset, epochs):

  for epoch in range(epochs):
    start = time.time() # time module of course

    for structure_batch in dataset:
      train_step(structure_batch)
    

    print ('Time for epoch {} is {} sec'.format(epoch   1, time.time()-start))
 

Что касается цели GAN, то она заключается в создании структуры в Minecraft с помощью алгоритма однократного кодирования для разных блоков, но я не думаю, что для этого необходима информация.

Я просто хочу, чтобы приведенный выше код Python был «переведен» на Java с помощью библиотеки DeepLearning4j. (У меня также есть библиотека tensorflow для Java, но я думаю, что она напрямую не совместима с DL4J)

Ответ №1:

Используйте импорт keras.

Внешняя ссылка здесь: https://deeplearning4j.konduit.ai/v/en-1.0.0-m1/deeplearning4j/how-to-guides/keras-import/api-reference

Для потомков, как это сделать в зависимости от того, есть ли у вас функциональная модель:

 public static ComputationGraph importKerasModelAndWeights(InputStream modelHdf5Stream) throws IOException, UnsupportedKerasConfigurationException, InvalidKerasConfigurationException

 

или последовательная модель:

 public static MultiLayerNetwork importKerasSequentialModelAndWeights(InputStream modelHdf5Stream,
                                                                         boolean enforceTrainingConfig)
            throws IOException, InvalidKerasConfigurationException, UnsupportedKerasConfigurationException
 

Сохраните модель в виде файла H5.
Загрузите модель в deeplearning4j с помощью описанных выше методов, затем вы можете использовать итераторы набора данных deeplearning4j для обучения своей модели.

Для конвейера входных данных я бы выделил это в отдельный вопрос, если это возможно. Если вы хотите получить более подробную информацию, пожалуйста, задавайте вопросы в комментариях.

Комментарии:

1. Привет, на самом деле, когда я попытался создать модель на python и импортировать ее в Java, DL4J вызвал проблемы с использованием слоя «Conv3DTranspose». Он отказался распознавать этот слой, поэтому я не мог его импортировать, поэтому я решил построить всю модель на Java, используя собственную библиотеку DL4J. Я мог бы это сделать, я просто не знаю, как написать эту единственную обучающую функцию

2. Прежде всего, в следующий раз, когда это произойдет, пожалуйста, поднимите вопрос. (Обратная связь имеет решающее значение для обеспечения поддержки функций, необходимых пользователям. (Это верно для каждого проекта с открытым исходным кодом, не имеет значения, что) Для этого нужно было бы добавить пользовательский слой. Вы можете определить пользовательский слой с помощью samediff (наш эквивалент tensorflow) — начните с этого — вы можете узнать больше об этом здесь: deeplearning4j.konduit.ai/keras-import/custom-layers

3. Существует существующий слой DL4J, функционирующий так же, как и Conv3DTranspose, называемый «Deconvolution3D». Есть ли способ зарегистрировать слой Deconvolution3D, который будет сопоставлен с именем «Conv3DTranspose» при импорте?