Хранение обучаемых значений в TensorArray для While_loop — tensorflow

#python #tensorflow #deep-learning #neural-network #tensorflow2.0

#python #тензорный поток #глубокое обучение #нейронная сеть #тензорный поток 2.0

Вопрос:

Я работаю над небольшой моделью тензорного потока, используя Tensorflow 2.3.0. в модели я использую несколько tf.while_loops и TensorArray. Модель работает не так, как ожидалось. Я пытался устранить проблему, но, к сожалению, не все поведение Tensorflow задокументировано, и я не уверен, есть ли ошибка в моей модели или это поведение Tensorflow, о котором я не знаю. Например, в моей модели я умножаю свои данные на некоторые веса внутри tf.while_loop. Затем я сохраняю результат в TensorArray . Содержимое TensorArray снова используется тем же способом, пока я не минимизирую потери для обучения модели.

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

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

ниже приведен простой пример (фиктивная модель), просто чтобы уточнить, что я делаю :

 import tensorflow.compat.v1 as tf
tf.compat.v1.disable_eager_execution()
import numpy as np


size=20
randvalues = np.random.choice(a=[0.0, 1.0], size=(size,10, 10), p=[.5, 1-.5]) 
x = tf.constant(randvalues , tf.float32) 
y = tf.constant(randvalues , tf.float32) 
init_range = np.sqrt(6.0 /20)
initial = tf.random_uniform([  10, 10 ], minval=-init_range,
                                maxval=init_range, dtype=tf.float32)
weights = tf.Variable(initial, name="testWeight1")
w1_summ = tf.summary.histogram("testWeight1" ,weights )
init_range = np.sqrt(6.0 /15)
initial2 = tf.random_uniform([  10, 5 ], minval=-init_range,
                                maxval=init_range, dtype=tf.float32)
weights_tied = tf.Variable(initial2, name="tiedWeight")
w2_summ = tf.summary.histogram("tiedWeight" ,weights_tied )




ta = tf.TensorArray(dtype = tf.float32 , size=0 , dynamic_size=True , clear_after_read=False , infer_shape=False  )
ta2 = tf.TensorArray(dtype = tf.float32 , size=0 , dynamic_size=True , clear_after_read=False , infer_shape=False  )





def condition(counter ,ta1): 
    return counter < size


def body(counter ,ta1):
    with tf.name_scope("firstloop"):
        operation1 = tf.matmul(x[counter],weights)
        operation2= tf.nn.relu(operation1)
        operation3= tf.matmul(operation2,weights_tied)
        operation4= tf.matmul(operation3,tf.transpose(weights_tied))        
        ta1 = ta1.write(counter,tf.reshape(operation4,[-1]))
        return counter  1 , ta1 

runloop , array1 = tf.while_loop(condition,body,[0 , ta ] , back_prop=True  ) 

def condition2(counter ,ta1 , array1): 
    return counter < 1


def body2(counter , ta2 ,array1 ):
    with tf.name_scope("secondloop"):
        operation = array1.stack()  
        operation4= tf.nn.relu(operation)
        ta2 = ta2.write(counter,tf.reshape(operation4,[-1]))
        return counter  1 , ta2 ,array1

runloop2 , array2 , _ = tf.while_loop(condition2,body2,[0 , ta2  ,array1] ,back_prop=True) 
predictions= array2.stack()

loss=tf.nn.weighted_cross_entropy_with_logits(logits=tf.reshape(predictions,[-1]), targets=tf.reshape(y,[-1]), pos_weight=1)
cost = tf.reduce_mean(loss) 
optimizer = tf.train.AdamOptimizer(learning_rate=.001)  
gvs = optimizer.compute_gradients(cost)
additional_summeries = [ tf.summary.histogram( "GRAD" str(g[1]) , g[0]) for g in gvs]
opt_op= optimizer.apply_gradients(gvs) 
merge= tf.summary.merge([w2_summ , w1_summ]    additional_summeries )
sess = tf.Session()
summ_writer = tf.summary.FileWriter('C:\Users\USER\Documents\Projects\MastersEnv\GraphAutoEncoder\gae\summaries', sess.graph)

sess.run(tf.global_variables_initializer())
for cc in range(1000) : 
    a , b, = sess.run([runloop2 , opt_op])
    c = sess.run(merge)
    summ_writer.add_summary(c,cc)
    print(cc)
    
print('done')
  

В приведенном выше примере содержимое array2 должно быть предсказаниями. как я могу убедиться, что циклы и TensorArray не повлияли на обучаемость моих переменных? Если то, что я сделал, было неправильным. какой наилучший подход для достижения того же, но сохраняет мой результат обучаемым.

Обновить ::

Хорошо, итак, я несколько раз запускал свою модель и отслеживал потери, точность и другие показатели масштабирования. И обнаружил общую тенденцию к снижению потерь и увеличению точности и других показателей, связанных с точностью. точность и потери также обратны друг другу, насколько я понимаю, это указывает на то, что обновления не являются случайными, и модель чему-то учится.

Кроме того, я отслеживал изменение распределений весов и градиентов, что подтверждает, что переменные обучаются.

введите описание изображения здесь

Не могли бы вы подтвердить мой вывод и понимание?

Заранее спасибо за вашу помощь.