Я работаю с изображениями и хочу создать собственный слой для своей модели. Я хочу умножить каждый пиксель на вес и добавить к нему смещение (x.w+b). Я знаю, что для этого подойдет flatten, но у меня есть дополнительные задачи по расчету, и для некоторых из них мне также может понадобиться транспонирование. мои вопросы, могу ли я умножить 2D-форму каждого входа и веса и добавить к ней двумерное смещение для моего пользовательского плотного слоя? Я пытался, но форма принимает только одномерный ввод и дает количество единиц вывода shape=(input_dim, единиц). Я хочу, чтобы input_dim был 2D как для веса, так и для смещения!
класс Плотный (слои. Слой):
def __init__(self, units):
super(Dense, self).__init__()
self.units = units
def build(self, input_shape):
self.w = self.add_weight(
name = "w",
shape=(input_shape[-1], self.units),
initializer = "random_normal",
trainable=True,
)
self.b = self.add_weight(
name = "b", initializer = "random_normal", trainable=True, shape=(input_shape[-1], self.units),
)
def call(self, inputs):
return tf.matmul(inputs, self.w) + self.b
IIUC, это зависит от желаемого результата. Вы можете попробовать что-то вроде этого:
import tensorflow as tf
class Dense2D(tf.keras.layers.Layer):
def __init__(self, units):
super(Dense2D, self).__init__()
self.units = units
def build(self, input_shape):
self.w = self.add_weight(
name = "w",
shape=(input_shape[-1], self.units),
initializer = "random_normal",
trainable=True,
)
self.b = self.add_weight(
name = "b", initializer = "random_normal", trainable=True, shape=(input_shape[1], input_shape[-1]),
)
def call(self, inputs):
return tf.matmul(inputs, self.w) + self.b
dense2d = Dense2D(units = 10)
samples = 1
x = tf.random.normal((samples, 5, 10))
print(dense2d(x).shape)
# (1, 5, 10)