梯度爆炸,卷积层变量空间

  我在调试代码的时候,遇到了很多问题,总结一下:

1.卷积层的变量空间设置

在使用卷积层而且会多次使用时需要使用不同的变量空间防止互相影响,因为一些权重共享问题

    def update1(self, conv_swb001, conv_swb002, up1name):  # 双输入更新模块
        with tf.variable_scope(up1name, reuse=tf.AUTO_REUSE):
            conv_swb000 = tf.concat(axis=3, values=[conv_swb001, conv_swb002])
            conv_swb100 = tf.nn.relu(
                conv2d(conv_swb000, 256, 128, k_h=7, k_w=7, d_h=1, d_w=1, padding='SAME', name="conv_swb100"))
            conv_swb200 = tf.nn.relu(
                conv2d(conv_swb100, 128, 128, k_h=5, k_w=5, d_h=1, d_w=1, padding='SAME', name="conv_swb200"))
            conv_swb300 = tf.nn.relu(
                conv2d(conv_swb200, 128, 128, k_h=3, k_w=3, d_h=1, d_w=1, padding='SAME', name="conv_swb300"))
            return conv_swb300

因为选择了变量空间的设置,在调用中就可以这样使用

conb001 = self.base_block(conb000, "basename1")
conb002 = self.base_block(conb000, "basename2")

2.关于一个方法定义成类还是函数

我还是习惯使用函数,然后用类的方法self调用它,因为我习惯于只定义一个类

3.梯度爆炸

可以引起的原因有很多,我一开始训练的时候,训练到一半损失正常下降,突然上升到一个极高的数字,大概是6亿左右再下降,后来我调整了学习率,并使用了一写残差块得到了不错的结合。分享一下吧

(1)残差块

    def base_block(self, input_tensor, basename):
        with tf.variable_scope(basename, reuse=tf.AUTO_REUSE):
            conm1 = conv2d(input_tensor, 6, 128, k_h=7, k_w=7, d_h=1, d_w=1, padding='SAME', name="conm1")
            conm1_relu = tf.nn.relu(conm1)
            conm2 = conv2d(conm1_relu, 128, 128, k_h=5, k_w=5, d_h=1, d_w=1, padding='SAME', name="conm2")
            conm2_relu = tf.nn.relu(conm2)
            conm3 = conv2d(conm2_relu, 128, 128, k_h=3, k_w=3, d_h=1, d_w=1, padding='SAME', name="conm3")
            conm3_relu = tf.nn.relu(conm3)
            conm4 = conv2d(conm3_relu, 128, 128, k_h=1, k_w=1, d_h=1, d_w=1, padding='SAME', name="conm4")
            conm4_relu = tf.nn.relu(conm4)
            add_x = tf.add(conm1_relu, conm4_relu)
            print("add_x shape:", add_x.shape)
            conm5 = conv2d(add_x, 128, 128, k_h=7, k_w=7, d_h=1, d_w=1, padding='SAME', name="conm5")
            conm5_relu = tf.nn.relu(conm5)
            conm6 = conv2d(conm5_relu, 128, 128, k_h=5, k_w=5, d_h=1, d_w=1, padding='SAME', name="conm6")
            conm6_relu = tf.nn.relu(conm6)
            conm7 = conv2d(conm6_relu, 128, 128, k_h=3, k_w=3, d_h=1, d_w=1, padding='SAME', name="conm7")
            conm7_relu = tf.nn.relu(conm7)
            conm8 = conv2d(conm7_relu, 128, 128, k_h=1, k_w=1, d_h=1, d_w=1, padding='SAME', name="conm8")
            conm8_relu = tf.nn.relu(conm8)
            add_x1 = tf.add(conm5_relu,  conm8_relu)
            print("add_x1 shape:", add_x1.shape)

            # pool = tf.keras.layers.MaxPooling2D((2, 2))(add_x1)
            #pool = max_pool_2x2(add_x1)
            #print("pool shape:", pool.shape)

        return add_x1

(2)学习率从0.001调到0.0001 

(3)调小batch size,但是不要设置为1

喜欢的小伙伴点个赞哦^ _^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值