张量流:加载权重和偏差时的奇怪问题。它们是作为初始定义加载的,而不是作为更新的

2024-10-01 09:31:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近训练了一个卷积神经网络,我想加载训练好的权重并在外部数据集中使用它们,但是我遇到了一个问题。在

我将发布我的代码用于培训和测试,但我要概括地说,我的权重和偏差是按照之前定义的加载的。我将权重定义为随机张量,所有偏差为0.1,以确保没有节点开始死机。当我在这个网络中加载时,我观察到所有的偏差都是0.1,更麻烦的是,如果我在同一个数据上连续运行两次预测,我会得到两个不同的结果——这说明我在测试过程中以某种方式随机化了权重!在

总之,这是训练代码;我的网络和权重/偏差的定义如下:

def conv3dWrap(x, W, b, strides=1,activation='yes'):
    x = tf.nn.conv3d(x, W, strides=[1, strides, strides, strides, 1], padding='SAME')
    x = tf.nn.bias_add(x, b)
    if activation =='no' or activation == 0:
        return x
    return tf.nn.relu(x)




def conv_net(x, weights, biases, dropout):

    #First Conv Layer
    conv1 = conv3dWrap(x,weights['wConv1'],biases['bConv1'])
    conv2 = conv3dWrap(conv1, weights['wConv2'], biases['bConv2']) 
    conv3 = conv3dWrap(conv2, weights['wConv3'], biases['bConv3']) 
    conv4 = conv3dWrap(conv3, weights['wConv4'], biases['bConv4']) 
    conv5 = conv3dWrap(conv4, weights['wConv5'], biases['bConv5']) 
    conv6 = conv3dWrap(conv5, weights['wConv6'], biases['bConv6']) 
    conv7 = conv3dWrap(conv6, weights['wConv7'], biases['bConv7']) 
    conv8 = conv3dWrap(conv7, weights['wConv8'], biases['bConv8']) 
    conv9 = conv3dWrap(conv8, weights['wConv9'], biases['bConv9']) 
    conv10 = conv3dWrap(conv9, weights['wConv10'], biases['bConv10']) 
    conv11 = conv3dWrap(conv10, weights['wConv11'], biases['bConv11']) 
    conv12 = conv3dWrap(conv11, weights['wConv12'], biases['bConv12']) 
    conv13 = conv3dWrap(conv12, weights['wConv13'], biases['bConv13']) 
    conv14 = conv3dWrap(conv13, weights['wConv14'], biases['bConv14']) 
    conv15 = conv3dWrap(conv14, weights['wConv15'], biases['bConv15']) 
    conv16 = conv3dWrap(conv15, weights['wConv16'], biases['bConv16']) 
    convOUT = conv3dWrap(conv16,weights['wConvOUT'],biases['bConvOUT'],1,0)

    return convOUT

# Store layers weight & bias
weights = {
#'wConv1': tf.Variable(tf.random_normal([3, 3, 3, 1, 16],0,0.1), name='wC1'),
'wConv1': tf.Variable(tf.ones([3, 3, 3, 1, 16]), name='wC1'),
# 5x5 conv, 32 inputs, 64 outputs
'wConv2': tf.Variable(tf.random_normal([3, 3, 3, 16, 16],0,0.1), name='wC2'),
'wConv3': tf.Variable(tf.random_normal([3, 3, 3, 16, 16],0,0.1), name='wC3'),
'wConv4': tf.Variable(tf.random_normal([3, 3, 3, 16, 16],0,0.1), name='wC4'),
'wConv5': tf.Variable(tf.random_normal([3, 3, 3, 16, 16],0,0.1), name='wC5'),
'wConv6': tf.Variable(tf.random_normal([3, 3, 3, 16, 16],0,0.1), name='wC6'),
'wConv7': tf.Variable(tf.random_normal([3, 3, 3, 16, 16],0,0.1), name='wC7'),
'wConv8': tf.Variable(tf.random_normal([3, 3, 3, 16, 16],0,0.1), name='wC8'),
'wConv9': tf.Variable(tf.random_normal([3, 3, 3, 16, 16],0,0.1), name='wC9'),
'wConv10': tf.Variable(tf.random_normal([3, 3, 3, 16, 16],0,0.01), name='wC10'),
'wConv11': tf.Variable(tf.random_normal([3, 3, 3, 16, 16],0,0.01), name='wC11'),
'wConv12': tf.Variable(tf.random_normal([3, 3, 3, 16, 16],0,0.01), name='wC12'),
'wConv13': tf.Variable(tf.random_normal([3, 3, 3, 16, 16],0,0.01), name='wC13'),
'wConv14': tf.Variable(tf.random_normal([3, 3, 3, 16, 16],0,0.01), name='wC14'),
'wConv15': tf.Variable(tf.random_normal([3, 3, 3, 16, 16],0,0.01), name='wC15'),
'wConv16': tf.Variable(tf.random_normal([3, 3, 3, 16, 16],0,0.01), name='wC16'),
'wConvOUT': tf.Variable(tf.random_normal([3, 3, 3, 16, 1],0,0.01), name='wCOUT')
}

biases = {
'bConv1': tf.Variable(16*[0.01],name='bC1'),
'bConv2': tf.Variable(16*[0.01],name='bC2'),
'bConv3': tf.Variable(16*[0.01],name='bC3'),
'bConv4': tf.Variable(16*[0.01],name='bC4'),
'bConv5': tf.Variable(16*[0.01],name='bC5'),
'bConv6': tf.Variable(16*[0.01],name='bC6'),
'bConv7': tf.Variable(16*[0.01],name='bC7'),
'bConv8': tf.Variable(16*[0.01],name='bC8'),
'bConv9': tf.Variable(16*[0.01],name='bC9'),
'bConv10': tf.Variable(16*[0.01],name='bC10'),
'bConv11': tf.Variable(16*[0.01],name='bC11'),
'bConv12': tf.Variable(16*[0.01],name='bC12'),
'bConv13': tf.Variable(16*[0.01],name='bC13'),
'bConv14': tf.Variable(16*[0.01],name='bC14'),
'bConv15': tf.Variable(16*[0.01],name='bC15'),
'bConv16': tf.Variable(16*[0.01],name='bC16'),
'bConvOUT': tf.Variable([0.01],name='bCOUT')
} 

然后我通过输入一些参考数据来训练网络:

^{2}$

它还会做一些其他的事情,比如验证等等,但这是这个问题的重要部分。在

然后我继续尝试测试网络:

def conv3dWrap(x, W, b, strides=1,activation='yes'):
    x = tf.nn.conv3d(x, W, strides=[1, strides, strides, strides, 1], padding='SAME')
    x = tf.nn.bias_add(x, b)
    if activation =='no' or activation == 0:
        return x
    return tf.nn.elu(x)

def conv_net(x, weights, biases, dropout):

    #First Conv Layer
    conv1 = conv3dWrap(x,weights['wConv1'],biases['bConv1'])
    conv2 = conv3dWrap(conv1, weights['wConv2'], biases['bConv2']) 
    conv3 = conv3dWrap(conv2, weights['wConv3'], biases['bConv3']) 
    conv4 = conv3dWrap(conv3, weights['wConv4'], biases['bConv4']) 
    conv5 = conv3dWrap(conv4, weights['wConv5'], biases['bConv5']) 
    conv6 = conv3dWrap(conv5, weights['wConv6'], biases['bConv6']) 
    conv7 = conv3dWrap(conv6, weights['wConv7'], biases['bConv7'])
    conv8 = conv3dWrap(conv7, weights['wConv8'], biases['bConv8'])
    conv9 = conv3dWrap(conv8, weights['wConv9'], biases['bConv9'])
    conv10 = conv3dWrap(conv9, weights['wConv10'], biases['bConv10'])
    conv11 = conv3dWrap(conv10, weights['wConv11'], biases['bConv11'])
    conv12 = conv3dWrap(conv11, weights['wConv12'], biases['bConv12'])
    conv13 = conv3dWrap(conv12, weights['wConv13'], biases['bConv13'])
    conv14 = conv3dWrap(conv13, weights['wConv14'], biases['bConv14'])
    conv15 = conv3dWrap(conv14, weights['wConv15'], biases['bConv15'])
    conv16 = conv3dWrap(conv15, weights['wConv16'], biases['bConv16'])
    convOUT = conv3dWrap(conv16,weights['wConvOUT'],biases['bConvOUT'],1,0)

    return convOUT

# Store layers weight  bias

sess = tf.Session()
x = tf.placeholder(dtype=tf.float32)
new_saver = tf.train.import_meta_graph('./SIMPLE_OUT/simple_test_cnn.ckpt.meta')
sess.run(tf.global_variables_initializer())
#pred = tf.get_default_graph().get_tensor_by_name("pred:0")
weights = {
'wConv1':  sess.run('wC1:0'),
'wConv2':  sess.run('wC2:0'),
'wConv3':  sess.run('wC3:0'),
'wConv4':  sess.run('wC4:0'),
'wConv5':  sess.run('wC5:0'),
'wConv6':  sess.run('wC6:0'),
'wConv7':  sess.run('wC7:0'),
'wConv8':  sess.run('wC8:0'),
'wConv9':  sess.run('wC9:0'),
'wConv10':  sess.run('wC10:0'),
'wConv11':  sess.run('wC11:0'),
'wConv12':  sess.run('wC12:0'),
'wConv13':  sess.run('wC13:0'),
'wConv14':  sess.run('wC14:0'),
'wConv15':  sess.run('wC15:0'),
'wConv16':  sess.run('wC16:0'),
'wConvOUT'  :  sess.run('wCOUT:0')
}
biases = {
'bConv1': sess.run('bC1:0'),
'bConv2': sess.run('bC2:0'),
'bConv3': sess.run('bC3:0'),
'bConv4': sess.run('bC4:0'),
'bConv5': sess.run('bC5:0'),
'bConv6': sess.run('bC6:0'),
'bConv7': sess.run('bC7:0'),
'bConv8': sess.run('bC8:0'),
'bConv9': sess.run('bC9:0'),
'bConv10': sess.run('bC10:0'),
'bConv11': sess.run('bC11:0'),
'bConv12': sess.run('bC12:0'),
'bConv13': sess.run('bC13:0'),
'bConv14': sess.run('bC14:0'),
'bConv15': sess.run('bC15:0'),
'bConv16': sess.run('bC16:0'),
'bConvOUT':   sess.run('bCOUT:0')
}

t0=time.time()
pred = conv_net(x, weights, biases,0)  
print("Loaded Weights")
b1=sess.run(pred,feed_dict={x: mri})
b=b1[0,:,:,:,0]
a=b[80,:,:]
t=time.time()-t0

我遇到了前面提到的问题。偏差均为0.1。而且,连续运行这段代码两次将得到两个不同的结果!我不知道我是怎么把事情搞砸的,但我已经花了很长时间试图弄清楚,我想是时候寻求帮助了。在

编辑:既然这是我的第一个猜测:我想确认一下,在训练过程中,权重和偏差确实会发生变化。成本发生变化,更具体地说,每个权重/偏差的L2损失在每次反向推进过程中都会发生变化,这一点得到了证实(我没有对我的偏差使用正则化,我只是为了确认它们正在发生变化)。在


Tags: runnametfrandomnnvariableactivation权重