Тензорный поток: странная проблема при загрузке весов и уклонов. Они загружаются как их первоначальное определение, а не как обновленные

Недавно я обучил сверточную нейронную сеть, и я хотел бы загрузить обученные веса и использовать их во внешнем наборе данных, но у меня возникла проблема.

Я опубликую свой код для обучения и тестирования, но вкратце скажу, что мои веса и смещения загружаются так, как они были определены ранее. Я определил, что мои веса являются случайными тензорами и все смещения равны 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')
} 

А затем я обучаю сеть, вводя исправления некоторых справочных данных, например:

def train_cnn(x):
    epochLosses=[]
    print('Beginning Training!')
    pred = conv_net(x, weights, biases, KEEP_PROB)        
    cost = tf.reduce_mean(tf.squared_difference(pred, y))
    saver = tf.train.Saver()
    optimizer = tf.train.AdamOptimizer(learning_rate=LEARNING_RATE)
    train_op=optimizer.minimize(cost)
    #optimizer = tf.train.Ad(learning_rate=LEARNING_RATE).minimize(cost)
    epochLosses=[]
    valLosses=[]
    with tf.Session() as sess:
        print('Beginning Session!')
        sess.run(tf.global_variables_initializer())
        writer  =  tf.summary.FileWriter ( './graphs' ,  sess.graph)
        for epoch in range(NUM_EPOCHS):
            t0=time.time()
            print('Epoch #:')
            print(epoch)
            epoch_loss=0
            for pid in pidList: #get a patient's data
                os.chdir(mriDir+pid)       
                file=glob.glob('cr*')
                mri = nib.load(file[0])
                mri = mri.get_data()
                mri = mri-mri.mean()
                #mri = mri[:63,:63,:]
                mri = np.expand_dims(mri, 0)
                mri = np.expand_dims(mri, -1)
                os.chdir(txDir+pid)
                file=glob.glob('input.n*')
                tx = nib.load(file[0])
                tx = tx.get_data()
                #tx = tx[:63,:63,:]
                tx = np.expand_dims(tx, 0)
                tx = np.expand_dims(tx, -1) 
                tx = np.transpose(tx,(0,3,1,2,4))
                mri = np.transpose(mri,(0,3,1,2,4))
                os.chdir(launch)
                for zSlice in range( 1 , mri.shape[2] - 1 ):
                    for ud in range(2):
                        for lr in range(2): 
                            inPatch=mri[:,zSlice-1:zSlice+1,(ud*63):((ud+1)*63),(lr*63):((lr+1)*63),:]   
                            testPatch=tx[:,zSlice-1:zSlice+1,(ud*63):((ud+1)*63),(lr*63):((lr+1)*63),:]
                            _, c = sess.run([train_op, cost], feed_dict = {x: inPatch,y: testPatch})
                            epoch_loss += c
                save_path = saver.save(sess, "./SIMPLE_OUT/simple_test_cnn.ckpt")  
               # print(epoch_loss)
            mean_epoch_loss=epoch_loss/len(pidList) 
            print('Epoch', epoch, 'completed out of',NUM_EPOCHS,'loss:',epoch_loss) 
            print('Mean loss for epoch:', mean_epoch_loss)               
            epochLosses.append(epoch_loss)
            #Validation
            print('Running validation for', epoch, 'will cut training if mean MSE <', VALIDATION_CUTOFF)
            valLoss=0
            t1=time.time()
            t=t1-t0
            print('EPOCH #:', epoch, 'is complete')
            print('It took this much time:', t)

Он продолжает делать некоторые другие вещи, такие как проверка и все такое, но это важная часть для этого вопроса.

Затем я пытаюсь проверить сеть таким образом:

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 каждого веса / смещения изменяется во время каждого обратного прохождения (я не использую регуляризацию на моих уклонах, я просто сделал это, чтобы подтвердить, что они менялись).

0 ответов

Другие вопросы по тегам