Предположим, необходимо создать пользовательский слой, например, для Re sNet, который содержит набор готовых tf.keras
слоев (например, Conv2D). Давайте рассмотрим приведенный ниже фрагмент псевдо-re snet кода, чтобы лучше понять проблему:
# custom layer
class ScBlock(tensorflow.keras.Layer):
def __init__(self, filters, layer_num, kernel=(3, 3), stride=1):
super(ScBlock, self).__init__(name="block_num{}".format(layer_num))
self.layer_name = 'layer_{}_'.format(layer_num)
self.batch_norm_first = BatchNormalization(name=self.layer_name + 'bn')
self.relu_first = Activation('relu', name=self.layer_name + 'relu')
self.conv_first = Conv2D(filters=filters, kernel_size=kernel, strides=stride, name=self.layer_name + 'conv')
# ...
def call(self, inputs):
res = self.batch_norm_first(inputs)
res = self.relu_first(res)
res = self.conv_first(res)
# ...
return res
# custom layer of blocks
class ResLayer(tensorflow.keras.Layer):
def __init__(self, filters, layer_num, kernel=(3, 3), stride=2):
super(ResLayer, self).__init__(name="res_num{}".format(layer_num))
self.block = ScBlock(filters=filters, layer_num=layer_num, kernel=kernel, stride=stride,)
# ...
def call(self, inputs):
res = self.block(inputs)
# ...
return res
Эти пользовательские слои будут в дальнейшем использоваться в теле re snet:
def resnet(input):
inputs = Input(shape=input)
# ...
res = MaxPool2D((3, 3), strides=2)(res)
# ...
res = ResidualLayer(filters=64, layer_num=1, stride=1)(res)
# ...
resnet_mod = training.Model(inputs, res)
resnet_mod.load_weights('imagenet_1000.h5', by_name=True)
return resnet_mod
Как видите, сеть предварительно обучена - загружены гигабайты enet в HDF5. В imagenet_1000.h5
имена слоев равны именам слоев внутри новых ScBlock
, например, layer1_conv
- имена, которые были до новых пользовательских слоев, которые теперь их инкапсулируют. Итак, после введения новых пользовательских слоев ScBlock
и ResLayer
сводка модели (model.summary()
) содержит только ожидаемые значения, например, res_num_1
.
. Вопрос в том, что происходит с процессом. загрузки весов HDF5? Они сопоставляются со слоями (например: `layer1_conv`) внутри новых пользовательских слоев автоматически или необходимо каким-либо образом изменить пользовательские слои, чтобы загрузить эти веса прямо в инкапсулированные слои (например:` layer1_conv`)? Если необходимо изменить пользовательские слои - как правильно?
Заранее спасибо