SRGAN的判别器部分代码简单说明版(个人使用)
一个简单的SRGAN判别器,代码跟常规的判别器相差不大
import math
import tensorflow as tf
from keras.initializers import random_normal
from keras import layers
from keras.applications import VGG19
from keras.models import Model #需要用到的模块
def d_block(inputs, filters, strides=1): #块组件,包含一个卷积层,一个BN层,一个激活层
x = layers.Conv2D(filters, kernel_size=3, strides=strides, padding='same', kernel_initializer = random_normal(stddev=0.02))(inputs)
x = layers.BatchNormalization(momentum=0.5)(x)
x = layers.LeakyReLU(alpha=0.2)(x) #常用的非线性函数relu的变形,将负的部分乘以一个很小的参数,这里为0.2
return x
def build_discriminator(hr_shape): #定义一个判别器
inputs = layers.Input(shape=hr_shape) #判别器的input
x = layers.Conv2D(64, kernel_size=3, strides=1, padding='same', kernel_initializer = random_normal(stddev=0.02))(inputs) #常用的卷积,卷积核大小为3*3,数目为64,步长为1,边缘填充,按正态分布生成随机张量,标准差为0.02;里面有个“data_format”,默认最后一维为通道数,如果不是,则要修改;
x = layers.LeakyReLU(alpha=0.2)(x) #常用的非线性函数relu的变形,将负的部分乘以一个很小的参数,这里为0.2
x = d_block(x, 64, strides=2) #将上面定义的块组件进行组合,若不指定strides,则默认为定义的1
x = d_block(x, 128)
x = d_block(x, 128, strides=2)
x = d_block(x, 256)
x = d_block(x, 256, strides=2)
x = d_block(x, 512)
x = d_block(x, 512, strides=2)
x = layers.GlobalAveragePooling2D()(x) #全局平均池化,深度神经网络中经常使用的一个层,使用前后的尺寸分别为[B,H,W,C]->[B,C].特别要注意,这个层使用之后特征图尺寸的维度变成了2维而非4维。
x = layers.Dense(1024, kernel_initializer = random_normal(stddev=0.02))(x) #全连接层,输出层为1024,正态初始化,标准差为0.02
x = layers.LeakyReLU(alpha=0.2)(x)
validity = layers.Dense(1, activation='sigmoid', kernel_initializer = random_normal(stddev=0.02))(x) # #全连接层,输出层为1,正态初始化,标准差为0.02,激活函数为sigmoid,输出为0到1;
return Model(inputs, validity) #使用inputs与outputs建立函数链式模型;