我想创建一个与以下函数类似的自定义tf.keras.layers.Layer:
def conv_block(inputs, filters, kernel_size, strides=(1, 1, 1),
padding='valid', activation=True, block_name='conv3d'):
with tf.name_scope(block_name):
conv = Conv3D(filters=filters, kernel_size=kernel_size, strides=strides,
padding=padding, activation=None,
name='{}_conv'.format(block_name))(inputs)
batch_norm = BatchNormalization(
name='{}_batch_norm'.format(block_name))(conv)
if activation:
relu = ReLU(max_value=6, name='{}_relu'.format(block_name))(batch_norm)
res_layer = relu
else:
res_layer = batch_norm
return res_layerclass ConvBlock(tf.keras.layers.Layer):
def __init__(self, filters, kernel_size, strides=(1, 1, 1), padding='valid', activation=True, **kwargs):
super(ConvBlock, self).__init__()
self.filters = filters
self.kernel_size = kernel_size
self.strides = strides
self.padding = padding
self.activation = activation
self.conv_1 = Conv3D(filters=self.filters,
kernel_size=self.kernel_size,
strides=self.strides,
padding=self.padding,
activation=None)
self.batch_norm_1 = BatchNormalization()
self.relu_1 = ReLU(max_value=6)
def call(self, inputs):
conv = self.conv_1(inputs)
batch_norm = self.batch_norm_1(conv)
if self.activation:
relu = self.relu_1(batch_norm)
return relu
else:
return batch_norm我想在我的模型中多次使用这个Layer。我对此有几个问题:
add_weights()方法中使用build()。不过,在这种情况下是否有需要呢?build()方法?如何使用此函数计算输出层的形状?
发布于 2021-03-17 13:01:20
也许您可以直接使用一个函数来封装您的重复操作,而不是子类层,只有当您认为需要使用权重或初始化权重模式时才可以使用子类,因为这是比后者更正确的方法。
示例:
def simple_conv(x):
x = Conv2d(x)
x = Bathcnorm(x)
return xhttps://stackoverflow.com/questions/57081006
复制相似问题