Python 如何在Keras的自定义层中深度复制权重矩阵。I';我试图存储旧的权重矩阵,以便以后重新分配

Python 如何在Keras的自定义层中深度复制权重矩阵。I';我试图存储旧的权重矩阵,以便以后重新分配,python,tensorflow,keras,conv-neural-network,Python,Tensorflow,Keras,Conv Neural Network,我试图将神经元的权重重新分配到它在前一个时期的权重。为了做到这一点,我试图保存旧的权重,但我在复制矩阵时遇到了困难 我不知道如何在自定义层中复制渴望张量。我尝试使用tf.identity和复制库,但都给了我错误,尽管我很可能没有正确地实现它。如有任何建议,将不胜感激。我附加了下面的一个错误,上面说如果启用了“急切执行”,它应该可以工作,这让我很困惑,因为我使用的是tensorflow 2,而“急切执行”默认情况下应该启用 class RevertWeightMatrixDenseLayer(ke

我试图将神经元的权重重新分配到它在前一个时期的权重。为了做到这一点,我试图保存旧的权重,但我在复制矩阵时遇到了困难

我不知道如何在自定义层中复制渴望张量。我尝试使用tf.identity和复制库,但都给了我错误,尽管我很可能没有正确地实现它。如有任何建议,将不胜感激。我附加了下面的一个错误,上面说如果启用了“急切执行”,它应该可以工作,这让我很困惑,因为我使用的是tensorflow 2,而“急切执行”默认情况下应该启用

class RevertWeightMatrixDenseLayer(keras.layers.Layer):
def __init__(self, units, prob, **kwargs):
    super(RevertWeightMatrixDenseLayer, self).__init__(**kwargs)
    self.units = units
    self.prob = prob


def build(self, input_shape):
    self.w = self.add_weight(
        shape=(input_shape[-1], self.units),
        initializer="random_normal",
        trainable=True,
    )
    self.b = self.add_weight(
        shape=(self.units,), initializer="random_normal", trainable=True
    )

    self.last_weight_1 = self.w
    self.last_weight_2 = self.w

def call(self, inputs, training=False):
    current_weights = self.w
    if training:
        if self.prob > random.random():
            self.w.assign(self.last_weight_2)  # Assign preserves tf.Variable
        #deep copy all the weights here here before assignement
        self.last_weight_2 = self.last_weight_1 
        self.last_weight_1 = current_weights
    else:
        pass #could think about multiplying all weights by a constant here
    return tf.nn.relu(tf.matmul(inputs, self.w) + self.b)


model = make_base_model() #sets up a sequential model with some conv layers
model.add(ResetWeightMatrixDenseLayer(units=dense_units, prob=0.1)) #Custom layer
model.add(ResetWeightMatrixDenseLayer(units=dense_units, prob=0.1)) #Custom layer

model.add(layers.Dense(classes, activation='softmax'))

model.compile(loss = 'CategoricalCrossentropy',
          optimizer = 'adam',
          metrics=['accuracy'])

history = model.fit(train_dataset, validation_data=validation_dataset, epochs=epochs)
plot(history)

尝试在我评论的地方进行深度复制会导致以下错误*NotImplementedError:deepcopy()仅在启用了急切执行时可用。*

您希望在层中保留状态:这正是
tf.Variable
的用途。(见指南:)

将您的
last_权重
设置为不可训练的
tf.变量
,并使用assign复制周围的值

class RevertWeightMatrixDenseLayer(keras.layers.Layer):
定义初始值(自身、单位、概率,**kwargs):
超级(还原权重矩阵密度层,自我)。\uuuu初始化(**kwargs)
self.units=单位
self.prob=prob
def构建(自我,输入_形状):
self.w=self.add\u重量(
形状=(输入形状[-1],自身单位),
初始化器=“随机\正常”,
可训练的,
)
self.b=self.add\u重量(
形状=(自身单位),初始值设定项=“随机\正常”,可训练=真
)
self.last\u weight\u 1=tf.Variable(self.w,trainable=False)
self.last_weight_2=tf.Variable(self.w,trainable=False)
#我们需要一个额外的变量来存储w的原始值
#在闲逛的时候
self.tmp=tf.Variable(self.w,trainable=False)
def呼叫(自我、输入、培训=错误):
self.tmp.assign(self.w)
如果培训:
如果self.prob>random.random():
self.w.assign(self.last_weight_2)#assign保留tf.Variable
self.last\u weight\u 2.分配(self.last\u weight\u 1)
self.last\u weight\u 1.assign(self.tmp)
其他:
pass#可以考虑将所有权重乘以一个常数
返回tf.nn.relu(tf.matmul(输入,self.w)+self.b)
尝试使用
获取权重()
/
设置权重()
。但我不确定是否可以在
call()
方法中设置权重