在TensorArray中为While_loop存储可训练的值-TensorFlow

时间:2020-09-15 19:18:48

标签: python tensorflow deep-learning neural-network tensorflow2.0

我正在使用Tensorflow 2.3.0开发小型Tensorflow模型。在模型中,我使用了几个tf.while_loops和TensorArray。该模型无法正常工作。我试图解决此问题,但不幸的是,并非所有Tensorflow行为都已记录在案,并且我不确定模型中是否存在错误或我不知道是Tensorflow行为。例如,在模型中,我将数据与tf.while_loop中的一些权重相乘。然后将结果存储在TensorArray中。再次以相同的方式使用TensorArray内容,直到我将训练模型的损失降至最低为止。

我的问题是模型未按预期进行训练。我怀疑张量流会冻结权重,而不是像我期望的那样更新它们。

我如何确保最后一个TensorArray的内容是可训练的,因为它是使用具有可训练的权重变量的数据生成的。我正在尝试避免提到here的问题,但是不确定是否有问题。

下面是一个简单的示例(虚拟模型),只是为了阐明我在做什么:

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不会影响变量的可训练性?如果我做的不正确。什么是实现同一目标的最佳方法,但可以使我的结果易于训练。

更新::

好,所以我运行了一段时间我的模型,并监控了损耗,准确性和其他缩放比例指标。并发现了损耗减少和准确性以及其他与准确性相关的指标增加的总体趋势。准确度和损失也互为倒数,据我所知,这表明更新不是随机的,模型正在学习一些东西。

另外,我监视了权重和梯度分布的变化,这确认了变量正在训练中。

enter image description here

能请您确认我的结论和理解吗?

感谢您对Advance的帮助。

0 个答案:

没有答案