如何解决拆分tensorflow图并计算每个模型的梯度
我尝试将图形拆分为两个图形:第一部分和第二部分。
X = np.array(data.select_dtypes(['float64','int64']))
Y = np.array(data['survived'])
X = tf.convert_to_tensor(X)
Y = tf.convert_to_tensor(Y)
print(X.shape,Y.shape) # (1309,9) (1309,)
client_model = tf.keras.models.Sequential()
client_model.add(tf.keras.layers.InputLayer(input_shape=(9,)))
client_model.add(tf.keras.layers.Dense(2,activation='relu'))
server_model = tf.keras.models.Sequential()
server_model.add(tf.keras.layers.InputLayer(input_shape=(client_model.output.shape)))
server_model.add(tf.keras.layers.Dense(1,activation='sigmoid'))
与使用传统方法一样,使用 tf.GradientTape 计算每个可训练矩阵 w.r.t loss 的梯度如下:
server_out = server_model(client_model.output)
joint_model = tf.keras.models.Model(client_model.input,server_out)
with tf.GradientTape(persistent=True) as tape:
w = joint_model.trainable_weights
tape.watch(w)
tape.watch(X)
y_hat = joint_model(X)
_loss = tf.reduce_mean(tf.keras.losses.binary_crossentropy(Y,y_hat))
w1,b1,w2,b2 = tape.gradient(_loss,w)
# (TensorShape([9,2]),TensorShape([2]),TensorShape([2,1]),TensorShape([1]))
我得到了图形第二部分的渐变形状。
with tf.GradientTape() as tape:
tape.watch(X)
h1 = client_model(X)
y_hat = server_model(h1)
_loss = tf.reduce_mean(tf.keras.losses.binary_crossentropy(Y,y_hat))
w2 == tape.gradient(_loss,server_model.trainable_weights)[0] # True True
但是,当我拆分此图并手动反向传播渐变时,它返回了错误的渐变形状。 dE/dH1 * dH1/dW1 之间不可能有内积
# Client gradient
with tf.GradientTape(persistent=True) as tape:
tape.watch(X)
h1 = client_model(X)
y_hat = server_model(h1)
_loss = tf.reduce_mean(tf.keras.losses.binary_crossentropy(Y,y_hat))
dE_dH1 = tape.gradient(_loss,h1)
dH1_dw1 = tape.gradient(h1,client_model.trainable_variables)
print(dE_dH1.shape) # (1309,2)
print(dH1_dw1[0].shape) # (9,2)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。