Я создаю собственный сверточный слой, подклассом слоя Keras. Я сделал это с предыдущей версией Tensorflow и не получил предупреждений:
import tensorflow as tf
class MyCustomLayer(tf.Module):
def __init__(self, in_channels,
filters,
kernel_size,
padding,
strides,
activation,
kernel_initializer,
bias_initializer,
use_bias):
super(MyCustomLayer, self).__init__()
self.filters = filters
self.kernel_size = kernel_size
self.activation = activation
self.padding = padding
self.kernel_initializer = kernel_initializer
self.bias_initializer = bias_initializer
self.strides = strides
self.use_bias = use_bias
self.in_channels = in_channels
self.w = tf.Variable(
initial_value=self.kernel_initializer(shape=(*self.kernel_size,
in_channels,
self.filters),
dtype='float32'), trainable=True)
if self.use_bias:
self.b = tf.Variable(
initial_value=self.bias_initializer(shape=(self.filters,),
dtype='float32'),
trainable=True)
def __call__(self, inputs, training=None):
x = tf.nn.conv2d(inputs,
filters=self.w,
strides=self.strides,
padding=self.padding)
if self.use_bias:
x = tf.add(x, self.b)
x = self.activation(x)
return x
x = tf.keras.Input(shape=(28, 28, 3))
y = MyCustomLayer(
in_channels=3,
filters=16,
kernel_size=(3, 3),
strides=(1, 1),
activation=tf.nn.relu,
padding='VALID',
kernel_initializer=tf.initializers.GlorotUniform(),
bias_initializer=tf.initializers.Zeros(),
use_bias=True)(x)
model = tf.keras.Model(inputs=x, outputs=y)
Я получаю это предупреждение с tf.__version__ == 2.4.1
:
ВНИМАНИЕ:tensorflow: следующие переменные использовались при вызове слоя Lambda (tf.compat.v1.nn.conv2d_12), но отсутствуют в его отслеживаемых объектах: ‹tf.Variable 'Variable:0' shape=(3, 3, 3, 16) dtype=float32› Возможно, это задуманное поведение, но, скорее, это упущение. Это убедительный признак того, что этот уровень следует сформулировать как слой подкласса, а не как слой Lambda.
ВНИМАНИЕ:tensorflow: следующие переменные использовались при вызове слоя Lambda (tf.math.add_2), но отсутствуют в его отслеживаемых объектах: ‹tf.Variable 'Variable:0' shape=(16,) dtype=float32> возможно, это преднамеренное поведение, но, скорее всего, это упущение. Это убедительный признак того, что этот уровень следует сформулировать как слой подкласса, а не как слой Lambda.
Что это значит? Я использую слой с подклассом.