我有一个非常简单的Keras模型,我想使用TensorFlow计算不同层的梯度。 我首先在Jupyter笔记本的第一个单元格中创建计算图。 这是计算图的代码:
import tensorflow as tf
import tensorflow.keras as keras
import tensorflow.keras.backend as K
import numpy as np
from tensorflow.keras.layers import Dense, Input, Layer
from tensorflow.keras.models import Model
input_tensor = Input(shape=(20,), name="input")
print(input_tensor.name)
hidden = Dense(100, activation='relu')(input_tensor)
out1 = Dense(10, activation='relu', name="out1")(hidden)
model = Model(inputs=input_tensor, outputs=[out1])
grad = []
for i in range(4):
grad.append(tf.gradients(out1, model.trainable_weights[i]))
model.compile(loss={"out1": "mse"},
optimizer=tf.train.AdamOptimizer(learning_rate=0.001))
np.random.seed(0)
X = np.random.random((3, 20)).astype(np.float32)
Y = np.random.random((3, 10)).astype(np.float32)
model.fit(x={'input' : X}, y={'out1' : Y}, batch_size=1, epochs=10)
然后,每次我运行tf.gradients运算符时,我都会得到一个不同的梯度向量(梯度变化)。这个结果是不合理的。我的代码中的问题出在哪里?
这是创建的会话的代码:
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
out_grad = sess.run(grad, feed_dict={'input:0':X})
print(out_grad)
答案 0 :(得分:0)
我通过使用tf.keras.backend.get_session()
解决了这个问题。
我认为问题在于tf.global_variables_initializer()
每次被调用时都会重新初始化训练权重。
当我多次运行此代码时,我得到一致的结果。
sess = tf.keras.backend.get_session({'input:0':X})
out_grad = sess.run(grad, feed_dict={'input:0':X})