Будет ли tf.keras.Sequential, содержащий несколько пользовательских слоев, корректно полностью сериализуемым и десериалиPython

Программы на Python
Ответить
Anonymous
 Будет ли tf.keras.Sequential, содержащий несколько пользовательских слоев, корректно полностью сериализуемым и десериали

Сообщение Anonymous »

Я реализую вариант U-Net в TensorFlow/Keras с настраиваемыми слоями. В одном из пользовательских слоев UPDoubleConv у меня есть Sequential self.blocks, содержащий повторяющийся шаблон UpSampling2D, за которым следует пользовательский слой DoubleConv. Я хочу убедиться, что эта часть будет полностью сериализуемой и десериализуемой с помощью model.save() и tf.keras.models.load_model() . Вот соответствующий код:

Код: Выделить всё

@tf.keras.utils.register_keras_serializable(package="CustomLayers", name="UPDoubleConv")
class UPDoubleConv(layers.Layer):
def __init__(self, out_channels, num_layer=1, **kwargs):
super(UPDoubleConv, self).__init__(**kwargs)
self.out_channels = out_channels
self.num_layer = num_layer

self.deconv = tf.keras.Sequential([
layers.UpSampling2D(size=(2, 2), interpolation="bilinear"),
DoubleConv(out_channels=out_channels, spatial_dim=2)
])

blocks_layers = []
for _ in range(num_layer):
blocks_layers.append(layers.UpSampling2D(size=(2,2), interpolation="bilinear"))
blocks_layers.append(DoubleConv(out_channels=out_channels, spatial_dim=2))
self.blocks = tf.keras.Sequential(blocks_layers)

def call(self, x, training=None):
x = self.deconv(x, training=training)
x = self.blocks(x, training=training)
return x

def get_config(self):
config = super().get_config()
config.update({
"out_channels": self.out_channels,
"num_layer": self.num_layer,
})
return config

@classmethod
def from_config(cls, config):
return cls(**config)

@tf.keras.utils.register_keras_serializable(package="CustomLayers", name="DoubleConv")
class DoubleConv(tf.keras.layers.Layer):
def __init__(self, out_channels, spatial_dim=2, **kwargs):
super(DoubleConv, self).__init__(**kwargs)
assert spatial_dim in (2, 3), f"spatial_dim must be 2 or 3, got {spatial_dim}"
self.out_channels = out_channels
self.spatial_dim = spatial_dim

Conv = layers.Conv2D if spatial_dim == 2 else layers.Conv3D

self.double_conv = tf.keras.Sequential([
Conv(out_channels, kernel_size=3, strides=1, padding="same", use_bias=False),
layers.BatchNormalization(),
layers.ReLU(),
Conv(out_channels, kernel_size=3, strides=1, padding="same", use_bias=False),
layers.BatchNormalization(),
layers.ReLU()
])

self.identity = tf.keras.Sequential([
Conv(out_channels, kernel_size=1, strides=1, padding="valid", use_bias=False),
layers.BatchNormalization(),
layers.ReLU()
])

def call(self, x, training=None):
out = self.double_conv(x, training=training)
skip = self.identity(x, training=training)
return out + skip

def get_config(self):
config = super().get_config()
config.update({
"out_channels": self.out_channels,
"spatial_dim": self.spatial_dim,
})
return config

@classmethod
def from_config(cls, config):
return cls(**config)

Мои вопросы:
1. Будет ли

Код: Выделить всё

self.blocks = tf.keras.Sequential(blocks_layers)
строка гарантирует, что все слои UpSampling2D и слои DoubleConv внутри полностью сериализованы и правильно десериализованы при сохранении и загрузке модели? Есть ли какие-либо подводные камни, о которых мне следует знать?
2. Будет ли аргумент обучения в

Код: Выделить всё

x = self.blocks(x, training=training)
правильно распространяться на слои внутри self.blocks, которым это требуется, и пропускаться для слоев, которые этого не требуют?


Подробнее здесь: https://stackoverflow.com/questions/798 ... y-fully-se
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»