#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» при импорте?