pix2pix、pix2pixHD 通过损失日志进行训练可视化

目录

背景

代码

结果

总结


背景

pix2pix(HD)代码在训练时会自动保存一个损失变化的txt文件,通过该文件能够对训练过程进行一个简单的可视化,代码如下。

训练的损失文件如图,对其进行可视化。

代码

#coding:utf-8
##
#author: QQ:1913434222 WeChat:Alocus
##
import matplotlib.pyplot as plt
import re
import numpy as np
import os,sys

file = "loss_logA - 副本.txt"
savepath = r"J:\混合样本去雾\调试代码&脚本&可视化\visualiz\\"
#dirs = os.listdir( filepath )
#for file in dirs:
#    if file.endswith('txt'):
#        f  = open(filepath+file,'r')
f  = open(file,'r')
lines = f.readlines()
G_GAN = []
G_GAN_Feat = []
G_VGG = []
G_KL= []
D_real = []
D_fake = []
G_featD = []
featD_real = []
featD_fake = []
total_data =[]

for line in lines:
    if "(epoch" in line:

        if "G_GAN" in line :
            G_GAN_list = line.split()
            G_GAN.append(float(G_GAN_list[9]))
        if "G_GAN_Feat" in line :
            G_GAN_Feat_list = line.split()
            G_GAN_Feat.append(float(G_GAN_Feat_list[11]))
        if "G_VGG" in line :
            G_VGG_list = line.split()
            G_VGG.append(float(G_VGG_list[13]))
        if "G_KL" in line :
            G_KL_list = line.split()
            G_KL.append(float(G_KL_list[15]))
        if "D_real" in line:
            D_real_list = line.split()
            D_real.append(float(D_real_list[17]))
        if "D_fake" in line:
            D_fake_list = line.split()
            D_fake.append(float(D_fake_list[19]))
        if "G_featD" in line:
            G_featD_list = line.split()
            G_featD.append(float(G_featD_list[21]))
        if "featD_real" in line:
            featD_real_list = line.split()
            featD_real.append(float(featD_real_list[23]))
        if "featD_fake" in line:
            featD_fake_list = line.split()
            featD_fake.append(float(featD_fake_list[25]))


    total_data = [(G_GAN [i] + G_GAN_Feat[i]+G_VGG[i]+
    G_KL[i]+
    D_real[i]+
    D_fake[i]+
    G_featD[i]+
    featD_real[i]+
    featD_fake[i])  for i in range(0, len(featD_fake))]

    fig = plt.figure()#(figsize=(50,6))
    ax = np.linspace(0,len(featD_fake),len(featD_fake))
    plt.plot(ax, total_data, label="total")
    plt.plot(ax,G_GAN,label="G_GAN")
    plt.plot(ax,G_GAN_Feat,label="G_GAN_Feat")
    plt.plot(ax,G_VGG,label="G_VGG")
    plt.plot(ax,D_real,label="D_real")
    plt.plot(ax,D_real,label="D_fake")
    plt.plot(ax,G_KL,label="G_KL")
    plt.plot(ax,G_featD,label="G_featD")
    plt.plot(ax,featD_real,label="featD_real")
    plt.plot(ax,featD_fake,label="featD_fake")

plt.grid(color='gray', linestyle='--', linewidth=1, alpha=0.3)
plt.legend()
plt.title('VAE$_1$')
plt.xlabel('epoch')
plt.ylabel('loss')
plt.savefig(savepath+file.split('.txt')[0]+'.png')


#G_GAN: 0.973 G_GAN_Feat: 7.709 G_VGG: 8.092 G_KL: 1.172 D_real: 0.908 D_fake: 0.870
# G_Feat_L2: 46.512 G_GAN: 3.917 G_GAN_Feat: 14.005 G_VGG: 8.741 D_real: 3.828 D_fake: 3.098

结果

总结

如果代码的损失函数等进行了修改,或者损失函数有变化,则需要对代码进行对应的修改,修改很简单,看下前面如何写的,照着改就ok啦!

有一些细节,如他们代码保存损失时不是每个epoch都一直保存的,有的epoch不同iter会保存两次所以会有些小问题,不过还好,问题不大。

祝好!

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
pix2pix算法是一种图像翻译(image-to-image translation)算法,其主要作用是将一种图像转换为另一种图像,例如将黑白线条图转换为彩色图。 以下是一个基于TensorFlow实现的pix2pix算法的简单代码示例: ```python import tensorflow as tf import numpy as np import matplotlib.pyplot as plt # 定义生成器模型 def generator_model(): inputs = tf.keras.layers.Input(shape=[256,256,3]) conv1 = tf.keras.layers.Conv2D(64, [4,4], strides=[2,2], padding='same', activation='relu')(inputs) conv2 = tf.keras.layers.Conv2D(128, [4,4], strides=[2,2], padding='same', activation='relu', use_bias=False)(conv1) norm2 = tf.keras.layers.BatchNormalization()(conv2) conv3 = tf.keras.layers.Conv2D(256, [4,4], strides=[2,2], padding='same', activation='relu', use_bias=False)(norm2) norm3 = tf.keras.layers.BatchNormalization()(conv3) conv4 = tf.keras.layers.Conv2D(512, [4,4], strides=[2,2], padding='same', activation='relu', use_bias=False)(norm3) norm4 = tf.keras.layers.BatchNormalization()(conv4) conv5 = tf.keras.layers.Conv2D(512, [4,4], strides=[2,2], padding='same', activation='relu', use_bias=False)(norm4) norm5 = tf.keras.layers.BatchNormalization()(conv5) conv6 = tf.keras.layers.Conv2D(512, [4,4], strides=[2,2], padding='same', activation='relu', use_bias=False)(norm5) norm6 = tf.keras.layers.BatchNormalization()(conv6) conv7 = tf.keras.layers.Conv2D(512, [4,4], strides=[2,2], padding='same', activation='relu', use_bias=False)(norm6) norm7 = tf.keras.layers.BatchNormalization()(conv7) conv8 = tf.keras.layers.Conv2DTranspose(512, [4,4], strides=[2,2], padding='same', activation='relu', use_bias=False)(norm7) norm8 = tf.keras.layers.BatchNormalization()(conv8) drop8 = tf.keras.layers.Dropout(0.5)(norm8) conv9 = tf.keras.layers.Conv2DTranspose(512, [4,4], strides=[2,2], padding='same', activation='relu', use_bias=False)(drop8) norm9 = tf.keras.layers.BatchNormalization()(conv9) drop9 = tf.keras.layers.Dropout(0.5)(norm9) conv10 = tf.keras.layers.Conv2DTranspose(512, [4,4], strides=[2,2], padding='same', activation='relu', use_bias=False)(drop9) norm10 = tf.keras.layers.BatchNormalization()(conv10) drop10 = tf.keras.layers.Dropout(0.5)(norm10) conv11 = tf.keras.layers.Conv2DTranspose(256, [4,4], strides=[2,2], padding='same', activation='relu', use_bias=False)(drop10) norm11 = tf.keras.layers.BatchNormalization()(conv11) conv12 = tf.keras.layers.Conv2DTranspose(128, [4,4], strides=[2,2], padding='same', activation='relu', use_bias=False)(norm11) norm12 = tf.keras.layers.BatchNormalization()(conv12) conv13 = tf.keras.layers.Conv2DTranspose(64, [4,4], strides=[2,2], padding='same', activation='relu', use_bias=False)(norm12) norm13 = tf.keras.layers.BatchNormalization()(conv13) conv14 = tf.keras.layers.Conv2DTranspose(3, [4,4], strides=[2,2], padding='same', activation='tanh')(norm13) return tf.keras.models.Model(inputs=inputs, outputs=conv14) # 定义判别器模型 def discriminator_model(): inputs = tf.keras.layers.Input(shape=[256,256,6]) conv1 = tf.keras.layers.Conv2D(64, [4,4], strides=[2,2], padding='same', activation='relu')(inputs) conv2 = tf.keras.layers.Conv2D(128, [4,4], strides=[2,2], padding='same', activation='relu', use_bias=False)(conv1) norm2 = tf.keras.layers.BatchNormalization()(conv2) conv3 = tf.keras.layers.Conv2D(256, [4,4], strides=[2,2], padding='same', activation='relu', use_bias=False)(norm2) norm3 = tf.keras.layers.BatchNormalization()(conv3) conv4 = tf.keras.layers.Conv2D(512, [4,4], strides=[2,2], padding='same', activation='relu', use_bias=False)(norm3) norm4 = tf.keras.layers.BatchNormalization()(conv4) outputs = tf.keras.layers.Conv2D(1, [4,4], strides=[1,1], padding='same')(norm4) return tf.keras.models.Model(inputs=inputs, outputs=outputs) # 定义损失函数 def generator_loss(disc_generated_output, gen_output, target): gan_loss = tf.keras.losses.BinaryCrossentropy(from_logits=True)(tf.ones_like(disc_generated_output), disc_generated_output) l1_loss = tf.reduce_mean(tf.abs(target - gen_output)) total_gen_loss = gan_loss + (100 * l1_loss) return total_gen_loss def discriminator_loss(disc_real_output, disc_generated_output): real_loss = tf.keras.losses.BinaryCrossentropy(from_logits=True)(tf.ones_like(disc_real_output), disc_real_output) generated_loss = tf.keras.losses.BinaryCrossentropy(from_logits=True)(tf.zeros_like(disc_generated_output), disc_generated_output) total_disc_loss = real_loss + generated_loss return total_disc_loss # 定义优化器 generator_optimizer = tf.keras.optimizers.Adam(2e-4, beta_1=0.5) discriminator_optimizer = tf.keras.optimizers.Adam(2e-4, beta_1=0.5) # 定义训练循环 @tf.function def train_step(input_image, target): with tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape: # 生成器生成一张假图像 gen_output = generator(input_image, training=True) # 将真实图像和假图像合并 disc_input = tf.concat([input_image, gen_output], axis=-1) # 判别器判别真实图像和假图像 disc_real_output = discriminator([input_image, target], training=True) disc_generated_output = discriminator([input_image, gen_output], training=True) # 计算生成器和判别器的损失函数 gen_loss = generator_loss(disc_generated_output, gen_output, target) disc_loss = discriminator_loss(disc_real_output, disc_generated_output) # 计算生成器和判别器的梯度并更新模型参数 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 load_images(path): images = [] for image_path in sorted(tf.io.gfile.glob(path)): image = tf.io.read_file(image_path) image = tf.image.decode_jpeg(image) image = tf.cast(image, tf.float32) image = (image / 127.5) - 1 images.append(image) return images # 定义训练参数 BUFFER_SIZE = 400 BATCH_SIZE = 1 EPOCHS = 200 PATH = './datasets/facades' # 加载数据集 input_images = load_images(PATH+'/train/*.jpg') target_images = load_images(PATH+'/train/*.png') # 将数据集打包在一起 train_dataset = tf.data.Dataset.from_tensor_slices((input_images, target_images)).shuffle(BUFFER_SIZE).batch(BATCH_SIZE) # 定义生成器和判别器 generator = generator_model() discriminator = discriminator_model() # 训练模型 for epoch in range(EPOCHS): print('Epoch', epoch+1) for input_image, target in train_dataset: train_step(input_image, target) if (epoch+1) % 10 == 0: # 取一张测试图像进行测试 test_input = input_images[0] test_target = target_images[0] test_input = tf.expand_dims(test_input, 0) test_target = tf.expand_dims(test_target, 0) # 生成一张假图像 test_prediction = generator(test_input, training=True) # 将图像还原到0到1之间 test_prediction = (test_prediction + 1) / 2.0 test_target = (test_target + 1) / 2.0 # 显示结果 plt.figure(figsize=(15,15)) display_list = [test_input[0], test_target[0], test_prediction[0]] title = ['Input Image', 'Ground Truth', 'Predicted Image'] for i in range(3): plt.subplot(1, 3, i+1) plt.title(title[i]) # 获取图像像素值 plt.imshow(display_list[i]) # 隐藏坐标轴 plt.axis('off') plt.show() ``` 在这个示例中,我们定义了一个生成器模型和一个判别器模型,并分别使用二元交叉熵损失函数和Adam优化器进行训练。在训练过程中,我们将图像分别输入到生成器和判别器进行训练,并计算生成器和判别器的损失函数。最后,我们使用matplotlib库将训练过程中的结果可视化展示出来。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alocus_

如果我的内容帮助到你,打赏我吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值