net.py

作者: 轻菊不爱柠檬 | 来源:发表于2020-12-06 22:52 被阅读0次

    import numpyas np

    import tensorflowas tf

    import math

    # 构造可训练参数

    def make_var(name, shape, trainable=True):

    return tf.get_variable(name, shape, trainable=trainable)

    # 定义卷积层

    def conv2d(input_, output_dim, kernel_size, stride, padding="SAME", name="conv2d", biased=False):

    input_dim = input_.get_shape()[-1]

    with tf.variable_scope(name):

    kernel = make_var(name='weights', shape=[kernel_size, kernel_size, input_dim, output_dim])

    output = tf.nn.conv2d(input_, kernel, [1, stride, stride, 1], padding=padding)

    if biased:

    biases = make_var(name='biases', shape=[output_dim])

    output = tf.nn.bias_add(output, biases)

    return output

    # 定义空洞卷积层

    def atrous_conv2d(input_, output_dim, kernel_size, dilation, padding="SAME", name="atrous_conv2d", biased=False):

    input_dim = input_.get_shape()[-1]

    with tf.variable_scope(name):

    kernel = make_var(name='weights', shape=[kernel_size, kernel_size, input_dim, output_dim])

    output = tf.nn.atrous_conv2d(input_, kernel, dilation, padding=padding)

    if biased:

    biases = make_var(name='biases', shape=[output_dim])

    output = tf.nn.bias_add(output, biases)

    return output

    # 定义反卷积层

    def deconv2d(input_, output_dim, kernel_size, stride, name="deconv2d"):

    input_dim = input_.get_shape()[-1]

    input_height =int(input_.get_shape()[1])

    input_width =int(input_.get_shape()[2])

    with tf.variable_scope(name):

    kernel = make_var(name='weights', shape=[kernel_size, kernel_size, output_dim, input_dim])

    output = tf.nn.conv2d_transpose(input_, kernel, [5, input_height *2, input_width *2, output_dim],

                                            [1, stride, stride, 1], padding="SAME")

    return output

    # 定义batch_norm(批次归一化)层

    def batch_norm(input_, name="batch_norm"):

    with tf.variable_scope(name):

    input_dim = input_.get_shape()[-1]

    scale = tf.get_variable("scale", [input_dim],

                                    initializer=tf.random_normal_initializer(1.0, 0.02, dtype=tf.float32))

    offset = tf.get_variable("offset", [input_dim], initializer=tf.constant_initializer(0.0))

    mean, variance = tf.nn.moments(input_, axes=[1, 2], keep_dims=True)

    epsilon =1e-5

            inv = tf.rsqrt(variance + epsilon)

    normalized = (input_ - mean) * inv

    output = scale * normalized + offset#效果类似于W = tf.nn.batch_normalization(input_, mean, var, offset, scale)

            return output

    # 定义最大池化层

    def max_pooling(input_, kernel_size, stride, name, padding="SAME"):

    return tf.nn.max_pool(input_, ksize=[1, kernel_size, kernel_size, 1], strides=[1, stride, stride, 1],

                              padding=padding, name=name)

    # 定义平均池化层

    def avg_pooling(input_, kernel_size, stride, name, padding="SAME"):

    return tf.nn.avg_pool(input_, ksize=[1, kernel_size, kernel_size, 1], strides=[1, stride, stride, 1],

                              padding=padding, name=name)

    # 定义lrelu激活层

    def lrelu(x, leak=0.2, name="lrelu"):

    return tf.maximum(x, leak * x)

    # 定义relu激活层

    def relu(input_, name="relu"):

    return tf.nn.relu(input_, name=name)

    # 定义残差块

    def residule_block_33(input_, output_dim, kernel_size=3, stride=1, dilation=2, atrous=False, name="res"):#3

        if atrous:

    conv2dc0 = atrous_conv2d(input_=input_, output_dim=output_dim, kernel_size=kernel_size, dilation=dilation,

                                    name=(name +'_c0'))

    conv2dc0_norm = batch_norm(input_=conv2dc0, name=(name +'_bn0'))

    conv2dc0_relu = relu(input_=conv2dc0_norm)

    conv2dc1 = atrous_conv2d(input_=conv2dc0_relu, output_dim=output_dim, kernel_size=kernel_size,

                                    dilation=dilation, name=(name +'_c1'))

    conv2dc1_norm = batch_norm(input_=conv2dc1, name=(name +'_bn1'))

    else:

    conv2dc0 = conv2d(input_=input_, output_dim=output_dim, kernel_size=kernel_size, stride=stride,

                              name=(name +'_c0'))

    conv2dc0_norm = batch_norm(input_=conv2dc0, name=(name +'_bn0'))

    conv2dc0_relu = relu(input_=conv2dc0_norm)

    conv2dc1 = conv2d(input_=conv2dc0_relu, output_dim=output_dim, kernel_size=kernel_size, stride=stride,

                              name=(name +'_c1'))

    conv2dc1_norm = batch_norm(input_=conv2dc1, name=(name +'_bn1'))

    add_raw = input_ + conv2dc1_norm

    output = relu(input_=add_raw)

    return output

    # 定义生成器

    def generator(image, gf_dim=64, reuse=False, name="generator"):

    # 生成器输入尺度: 1*256*256*1

        input_dim = image.get_shape()[-1]

    with tf.variable_scope(name):

    if reuse:

    tf.get_variable_scope().reuse_variables()

    else:

    assert tf.get_variable_scope().reuseis False

            # 第1个卷积模块,输出尺度: 1*256*256*64

            c0 = relu(

    batch_norm(conv2d(input_=image, output_dim=gf_dim, kernel_size=7, stride=1, name='g_e0_c'), name='g_e0_bn'))

    # 第2个卷积模块,输出尺度: 1*128*128*128

            c1 = relu(batch_norm(conv2d(input_=c0, output_dim=gf_dim *2, kernel_size=3, stride=2, name='g_e1_c'),

                                name='g_e1_bn'))

    # 第3个卷积模块,输出尺度: 1*64*64*256

            c2 = relu(batch_norm(conv2d(input_=c1, output_dim=gf_dim *4, kernel_size=5, stride=2, name='g_e2_c'),

                                name='g_e2_bn'))

    '''

            # 9个残差块:

    r1 = residule_block_33(input_=c2, output_dim=gf_dim * 4, atrous=False, name='g_r1')

    r2 = residule_block_33(input_=r1, output_dim=gf_dim * 4, atrous=False, name='g_r2')

    r3 = residule_block_33(input_=r2, output_dim=gf_dim * 4, atrous=False, name='g_r3')

    r4 = residule_block_33(input_=r3, output_dim=gf_dim * 4, atrous=False, name='g_r4')

    r5 = residule_block_33(input_=r4, output_dim=gf_dim * 4, atrous=False, name='g_r5')

    r6 = residule_block_33(input_=r5, output_dim=gf_dim * 4, atrous=False, name='g_r6')

    r7 = residule_block_33(input_=r6, output_dim=gf_dim * 4, atrous=False, name='g_r7')

    r8 = residule_block_33(input_=r7, output_dim=gf_dim * 4, atrous=False, name='g_r8')

    r9 = residule_block_33(input_=r8, output_dim=gf_dim * 4, atrous=False, name='g_r9')

            # 第9个残差块的输出尺度: 1*64*64*256

    '''

            # 12个残差块:

            r1 = residule_block_33(input_=c2, output_dim=gf_dim *4, atrous=False, name='g_r1')

    r2 = residule_block_33(input_=r1, output_dim=gf_dim *4, atrous=False, name='g_r2')

    r3 = residule_block_33(input_=r2, output_dim=gf_dim *4, atrous=False, name='g_r3')

    r4 = residule_block_33(input_=r3, output_dim=gf_dim *4, atrous=False, name='g_r4')

    r5 = residule_block_33(input_=r4, output_dim=gf_dim *4, atrous=False, name='g_r5')

    r6 = residule_block_33(input_=r5, output_dim=gf_dim *4, atrous=False, name='g_r6')

    r7 = residule_block_33(input_=r6, output_dim=gf_dim *4, atrous=False, name='g_r7')

    r8 = residule_block_33(input_=r7, output_dim=gf_dim *4, atrous=False, name='g_r8')

    r9 = residule_block_33(input_=r8, output_dim=gf_dim *4, atrous=False, name='g_r9')

    r10 = residule_block_33(input_=r9, output_dim=gf_dim *4, atrous=False, name='g_r10')

    r11 = residule_block_33(input_=r10, output_dim=gf_dim *4, atrous=False, name='g_r11')

    r12 = residule_block_33(input_=r11, output_dim=gf_dim *4, atrous=False, name='g_r12')

    # 第4个残差块的输出尺度: 1*64*64*256

            # 第1个反卷积模块,输出尺度: 1*128*128*128

            d1 = relu(batch_norm(deconv2d(input_=r12, output_dim=gf_dim *2, kernel_size=3, stride=2, name='g_d1_dc'),

                                name='g_d1_bn'))

    # 第2个反卷积模块,输出尺度: 1*256*256*64

            d2 = relu(batch_norm(deconv2d(input_=d1, output_dim=gf_dim, kernel_size=5, stride=2, name='g_d2_dc'),

                                name='g_d2_bn'))

    # 最后一个卷积模块,输出尺度: 1*256*256*1

            d3 = conv2d(input_=d2, output_dim=input_dim, kernel_size=7, stride=1, name='g_d3_c')

    # 经过tanh函数激活得到生成的输出

            output = tf.nn.tanh(d3)

    return output

    # 定义判别器

    def discriminator(image, df_dim=64, reuse=False, name="discriminator"):

    with tf.variable_scope(name):

    if reuse:

    tf.get_variable_scope().reuse_variables()

    else:

    assert tf.get_variable_scope().reuseis False

            # 第1个卷积模块,输出尺度: 1*128*128*64

            h0 = lrelu(conv2d(input_=image, output_dim=df_dim, kernel_size=3, stride=2, name='d_h0_conv'))

    # 第2个卷积模块,输出尺度: 1*64*64*128

            h1 = lrelu(

    batch_norm(conv2d(input_=h0, output_dim=df_dim *2, kernel_size=3, stride=2, name='d_h1_conv'), 'd_bn1'))

    # 第3个卷积模块,输出尺度: 1*32*32*256

            h2 = lrelu(

    batch_norm(conv2d(input_=h1, output_dim=df_dim *4, kernel_size=3, stride=2, name='d_h2_conv'), 'd_bn2'))

    # 第4个卷积模块,输出尺度: 1*32*32*512

            h3 = lrelu(

    batch_norm(conv2d(input_=h2, output_dim=df_dim *8, kernel_size=3, stride=1, name='d_h3_conv'), 'd_bn3'))

    # 最后一个卷积模块,输出尺度: 1*32*32*1

            output = conv2d(input_=h3, output_dim=1, kernel_size=4, stride=1, name='d_h4_conv')

    return output

    相关文章

      网友评论

          本文标题:net.py

          本文链接:https://www.haomeiwen.com/subject/mawawktx.html