Rumah > Artikel > Peranti teknologi > Masalah peralihan pengedaran dalam latihan lawan
Masalah anjakan pengedaran dalam latihan lawan, contoh kod khusus diperlukan
Abstrak: Anjakan pengedaran ialah masalah biasa dalam pembelajaran mesin dan tugas pembelajaran mendalam. Bagi menangani masalah ini, pengkaji telah mencadangkan kaedah latihan adversarial. Artikel ini akan memperkenalkan masalah anjakan pengedaran dalam latihan lawan dan memberikan contoh kod berdasarkan Generative Adversarial Networks (GAN).
Proses latihan lawan boleh dipermudahkan kepada langkah berikut:
(1) Melatih rangkaian penjana: Rangkaian penjana menerima vektor hingar rawak sebagai input dan menjana sampel yang serupa dengan data set ujian.
(2) Latih rangkaian diskriminator: Rangkaian diskriminator menerima sampel sebagai input dan mengklasifikasikannya sebagai datang daripada set latihan atau set ujian.
(3) Penyebaran balik mengemas kini rangkaian penjana: Matlamat rangkaian penjana adalah untuk memperdayakan rangkaian diskriminator supaya salah mengklasifikasikan sampel yang dijana sebagai datang daripada set latihan.
(4) Ulang langkah (1)-(3) beberapa kali sehingga rangkaian penjana menumpu.
import tensorflow as tf from tensorflow.keras import layers # 定义生成器网络 def make_generator_model(): model = tf.keras.Sequential() model.add(layers.Dense(256, input_shape=(100,), use_bias=False)) model.add(layers.BatchNormalization()) model.add(layers.LeakyReLU()) model.add(layers.Dense(512, use_bias=False)) model.add(layers.BatchNormalization()) model.add(layers.LeakyReLU()) model.add(layers.Dense(28 * 28, activation='tanh')) model.add(layers.Reshape((28, 28, 1))) return model # 定义判别器网络 def make_discriminator_model(): model = tf.keras.Sequential() model.add(layers.Flatten(input_shape=(28, 28, 1))) model.add(layers.Dense(512)) model.add(layers.LeakyReLU()) model.add(layers.Dense(256)) model.add(layers.LeakyReLU()) model.add(layers.Dense(1, activation='sigmoid')) return model # 定义生成器和判别器 generator = make_generator_model() discriminator = make_discriminator_model() # 定义生成器和判别器的优化器 generator_optimizer = tf.keras.optimizers.Adam(1e-4) discriminator_optimizer = tf.keras.optimizers.Adam(1e-4) # 定义损失函数 cross_entropy = tf.keras.losses.BinaryCrossentropy(from_logits=True) # 定义生成器的训练步骤 @tf.function def train_generator_step(images): noise = tf.random.normal([BATCH_SIZE, 100]) with tf.GradientTape() as gen_tape: generated_images = generator(noise, training=True) fake_output = discriminator(generated_images, training=False) 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)) # 定义判别器的训练步骤 @tf.function def train_discriminator_step(images): noise = tf.random.normal([BATCH_SIZE, 100]) with tf.GradientTape() as disc_tape: generated_images = generator(noise, training=True) real_output = discriminator(images, training=True) fake_output = discriminator(generated_images, training=True) disc_loss = discriminator_loss(real_output, fake_output) gradients_of_discriminator = disc_tape.gradient(disc_loss, discriminator.trainable_variables) discriminator_optimizer.apply_gradients(zip(gradients_of_discriminator, discriminator.trainable_variables)) # 开始对抗训练 def train(dataset, epochs): for epoch in range(epochs): for image_batch in dataset: train_discriminator_step(image_batch) train_generator_step(image_batch) # 加载MNIST数据集 (train_images, _), (_, _) = tf.keras.datasets.mnist.load_data() train_images = train_images.reshape(train_images.shape[0], 28, 28, 1).astype('float32') train_images = (train_images - 127.5) / 127.5 train_dataset = tf.data.Dataset.from_tensor_slices(train_images).shuffle(BUFFER_SIZE).batch(BATCH_SIZE) # 指定批次大小和缓冲区大小 BATCH_SIZE = 256 BUFFER_SIZE = 60000 # 指定训练周期 EPOCHS = 50 # 开始训练 train(train_dataset, EPOCHS)
Dalam contoh kod di atas, kami mentakrifkan struktur rangkaian penjana dan diskriminator, dan memilih pengoptimum Adam dan crossover binari Fungsi kehilangan entropi. Kemudian, kami mentakrifkan langkah latihan penjana dan diskriminator dan melatih rangkaian melalui fungsi latihan. Akhirnya, kami memuatkan set data MNIST dan melakukan proses latihan lawan.
Atas ialah kandungan terperinci Masalah peralihan pengedaran dalam latihan lawan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!