Saya membuat lapisan konvolusional khusus dengan mensubklasifikasikan Lapisan Keras. Saya melakukan ini dengan Tensorflow versi sebelumnya, dan tidak menerima peringatan:
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)
Saya mendapat peringatan ini, dengan tf.__version__ == 2.4.1
:
PERINGATAN:tensorflow: Variabel berikut digunakan panggilan lapisan Lambda (tf.compat.v1.nn.conv2d_12), tetapi tidak ada dalam objek yang dilacak: ‹tf.Variable 'Variable:0' shape=(3, 3, 3, 16) dtype=float32› Ada kemungkinan bahwa ini adalah perilaku yang disengaja, namun lebih mungkin merupakan kelalaian. Ini merupakan indikasi kuat bahwa lapisan ini harus diformulasikan sebagai Lapisan subkelas dan bukan lapisan Lambda.
PERINGATAN:tensorflow: Variabel berikut digunakan panggilan lapisan Lambda (tf.math.add_2), tetapi tidak ada dalam objek yang dilacak: ‹tf.Variable 'Variable:0' shape=(16,) dtype=float32› It Ada kemungkinan bahwa ini adalah perilaku yang disengaja, namun kemungkinan besar ini adalah kelalaian. Ini merupakan indikasi kuat bahwa lapisan ini harus diformulasikan sebagai Lapisan subkelas dan bukan lapisan Lambda.
Apa artinya ini? Saya saya menggunakan Lapisan subkelas.