我正在尝试编写自己的keras图层。在这一层中,我想使用其他一些keras层。有什么办法可以做这样的事情:
class MyDenseLayer(tf.keras.layers.Layer):
def __init__(self, num_outputs):
super(MyDenseLayer, self).__init__()
self.num_outputs = num_outputs
def build(self, input_shape):
self.fc = tf.keras.layers.Dense(self.num_outputs)
def call(self, input):
return self.fc(input)
layer = MyDenseLayer(10)
Run Code Online (Sandbox Code Playgroud)
当我做类似的事情
input = tf.keras.layers.Input(shape = (16,))
output = MyDenseLayer(10)(input)
model = tf.keras.Model(inputs = [input], outputs = [output])
model.summary()
Run Code Online (Sandbox Code Playgroud)
我如何使weith在密集的地方训练?
小智 11
如果您查看有关如何添加自定义图层的文档,则他们建议您使用该.add_weight(...)方法。此方法在内部将所有权重放置在中self._trainable_weights。因此,要做您想做的事情,您首先必须定义要使用的keras图层,构建它们,复制权重,然后构建您自己的图层。如果我更新您的代码,它应该类似于
class mylayer(tf.keras.layers.Layer):
def __init__(self, num_outputs, num_outputs2):
self.num_outputs = num_outputs
super(mylayer, self).__init__()
def build(self, input_shape):
self.fc = tf.keras.layers.Dense(self.num_outputs)
self.fc.build(input_shape)
self._trainable_weights = self.fc.trainable_weights
super(mylayer, self).build(input_shape)
def call(self, input):
return self.fc(input)
layer = mylayer(10)
input = tf.keras.layers.Input(shape=(16, ))
output = layer(input)
model = tf.keras.Model(inputs=[input], outputs=[output])
model.summary()
Run Code Online (Sandbox Code Playgroud)
将现有层放入 tf.keras.models.Model 类中更加舒适和简洁。如果您定义非自定义层(例如层、conv2d),则默认情况下这些层的参数不可训练。
class MyDenseLayer(tf.keras.Model):
def __init__(self, num_outputs):
super(MyDenseLayer, self).__init__()
self.num_outputs = num_outputs
self.fc = tf.keras.layers.Dense(num_outputs)
def call(self, input):
return self.fc(input)
def compute_output_shape(self, input_shape):
shape = tf.TensorShape(input_shape).as_list()
shape[-1] = self.num_outputs
return tf.TensorShape(shape)
layer = MyDenseLayer(10)
Run Code Online (Sandbox Code Playgroud)
检查本教程:https://www.tensorflow.org/guide/keras#model_subclassing
| 归档时间: |
|
| 查看次数: |
3523 次 |
| 最近记录: |