我設計了一個自定義層,用于這樣的用途:
class SquaredWeightedLayer(tf.keras.layers.Layer):
def __init__(self, units=1):
super(SquaredWeightedLayer, self).__init__()
self.units = units
def build(self, input_shape):
self.w = self.add_weight(shape=(input_shape[-1], self.units), initializer="random_normal", trainable=True)
self.square_w = self.w ** 2
self.b = self.add_weight(shape=(self.units,), initializer="zeros", trainable=True)
super(SquaredWeightedLayer, self).build(input_shape)
def call(self, inputs):
return tf.sigmoid(tf.add(tf.matmul(inputs, self.square_w), self.b))
但是,tape.gradient(loss, self.w)回傳None并tape.gradient(loss, self.square_w)回傳正常值。損失是binary_crossentropy。
我將非常感謝任何解決此問題的建議。謝謝!
uj5u.com熱心網友回復:
問題是 的計算self.w ** 2已經在build函式中執行,在任何磁帶背景關系之外,因此 Tensorflow 無法追蹤square_w實際來自 的計算w,導致梯度為None。您可以通過簡單地將平方運算移入來修復它call:
def call(self, inputs):
return tf.sigmoid(tf.add(tf.matmul(inputs, self.w**2), self.b))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/382724.html
上一篇:Keras方法image_dataset_from_directory()如何區分X和Y資料?
下一篇:從.txt中洗掉引號
