我在调试代码的时候,遇到了很多问题,总结一下:
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
喜欢的小伙伴点个赞哦^ _^