我有一个继承自tf.keras.model
的类:
class MyModel(tf.keras.Model):
def __init__(...):
super(MyModel, self).__init__()
self.input_layer = InputLayer(input_shape=(num_states,))
self.hidden_layer = ConcreteDropout(Dense(i, activation='relu'),weight_regularizer=wd, dropout_regularizer=dd))
self.output_layer = tf.keras.layers.Dense(num_actions, activation='linear', kernel_initializer='RandomNormal')
def call(self,inputs):
z = self.input_layer(inputs)
z, loss = self.hidden_layer(z)
output = self.output_layer(z)
class ConcreteDropout(Wrapper):
def build(self, input_shape=None):
self.input_spec = InputSpec(shape=input_shape)
...
def call(self, inputs, training=True):
...
return self.layer.call(self.concrete_dropout(inputs, p)), regularizer
我的问题是,当我将MyModel的调用函数中的具体Dropout层的batch_size(input_spec的一部分)设置为1时,后来又用实际的batch_size调用模型时,输入不匹配。
这里是仓库的link,我从中获得了具体的Dropout层。他们使用model.compile
,而我想使用Gradient.tape
。
我已经花了几个小时进行调试。有人可以给我指点如何在MyModel class
/ Gradient.tape
中使Concrete Dropout类起作用。我有Pytorch的背景,现在有点迷路了;(