#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 не повлияли на обучаемость моих переменных? Если то, что я сделал, было неправильным. какой наилучший подход для достижения того же, но сохраняет мой результат обучаемым.
Обновить ::
Хорошо, итак, я несколько раз запускал свою модель и отслеживал потери, точность и другие показатели масштабирования. И обнаружил общую тенденцию к снижению потерь и увеличению точности и других показателей, связанных с точностью. точность и потери также обратны друг другу, насколько я понимаю, это указывает на то, что обновления не являются случайными, и модель чему-то учится.
Кроме того, я отслеживал изменение распределений весов и градиентов, что подтверждает, что переменные обучаются.
Не могли бы вы подтвердить мой вывод и понимание?
Заранее спасибо за вашу помощь.