Я писал несколько пользовательских слоев и понял, что мои значения смещения будут тренироваться, но мои веса не тренировались. Я собираюсь использовать очень упрощенный код, чтобы проиллюстрировать проблему.
class myWeights(Layer):
def __init__(self, units, **kwargs):
self.units = units
super(myWeights, self).__init__(**kwargs)
def build(self, input_shape):
self.w = self.add_weight(shape=(input_shape[-1], self.units),
initializer='GlorotUniform',
trainable=True)
self.b = self.add_weight(shape=(self.units,),
initializer='random_normal',
trainable=True)
super(myWeights, self).build(input_shape)
def call(self, inputs):
return tf.matmul(inputs, self.w) + self.b
def compute_output_shape(self, input_shape):
return(input_shape[0],self.units)
Теперь я настроил данные MNIST для обучения. Я также установил начальное значение, чтобы это воспроизводилось на вашем конце.
tf.random.set_seed(1234)
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train=tf.keras.utils.normalize(x_train, axis=1)
x_test=tf.keras.utils.normalize(x_test, axis=1)
Я строю модель, используя функциональный API
inp=Input(shape=(x_train.shape[1:]))
flat=Flatten()(inp)
hid=myWeights(32)(flat)
out=Dense(10, 'softmax')(hid)
model=Model(inp,out)
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
Теперь, когда я проверяю значения параметров, используя
print(model.layers[2].get_weights())
Я вижу вывод, подобный следующему, который я переформатировал для облегчения чтения.
- [array ([[0.00652369, -0.02321771, 0.01399945, .. ., -0,07599965, -0,04356881, -0,0333882], [-0,03132245, -0,05264733, 0,05576386, ..., -0,03755575, 0,07358163, -0,02338506], [-0,01808248, 0,04092623, 0,02166464, 0,07,076122, 0,07,06122, 0,07,076123, 0,0,0677643, 0,0,0677642, 0,0,0677643, 0,0,0677643, 0,0,0677643, 0,0,0677643, 0,0,0677643,0 0,0495184], ..., [-0,03780914, 0,00219346, 0,04460619, ..., -0,06373794, 0,03407502, -0,01071112], [-0,0012739, -0,0683699, -0,06152753, ..., 0,05373723, 0,03079057, 0,00855774]. 0.06245673, -0,07649396, 0,06748571 ..., -0,06948434, -0,01416317, -0,08318184]], DTYPE = float32) *
После обучения с
model.fit(x_train,y_train, epochs=3, verbose=1)
print(model.layers[2].get_weights())
нахожу следующий вывод.
- [ массив ([[0,00652369, -0,02321771, 0,01399945, ..., -0,07599965, -0,04356881, -0,0333882], [-0,03132245, -0,05264733, 0,05576386, ..., -0,03755575, 0,07358163, -0,02 08080,] , 0,04092623, 0,02177643, ..., 0,00971264, 0,0731319, 0,0495184], ..., [-0,03780914, 0,00219346, 0,04460619, ..., -0,06703794, 0,03407502, -0,01071112], -0,0012739, -0,0681575, -0,0681575, -0,0681575, , ..., 0,05373723, 0,03079057, 0,00855774], [0,06245673, -0,07649396, 0,06748571, ..., -0,06948434, -0,01416317, -0,08318184]], dtype = float32), *
- array ([ -0,250459, -0,21746232, 0,01250297, 0,00065066, -0,0909 3136, 0,04943814, -0,13446714, -0,11985168, 0,23259214, -0,14288908, 0,03274751, 0,1462888, -0,2206902, 0,14455307, 0,17767513, 0,11378342, -0,22250313, 0,216010,20,00, 0,80,20,80, 0,80,20, 0,80,20,20, 0,80,20,20,20,20,20, трафарет, тел. , 0.08827516, 0.2806849, 0.07634751, -0.32905066, -0.1860122, 0.06170518, -0.20212872], dtype = float32)] *
Я вижу, что значения смещения изменились, но значения веса Стати c. Я совсем не уверен, почему это происходит.