На этом шаге мы приведем реализацию этого класса.
Ранее вы узнали, что слой Dense реализует следующее преобразование входных данных, где W и b - параметры модели, а activation - поэлементная функция (обычно relu, но в последнем слое - softmax):
output = activation(dot(W, input) + b)
Реализуем на Python простой класс NaiveDense, создающий две переменные TensorFlow, W и b, и имеющий метод __call__(), который применяет предыдущее преобразование.
import tensorflow as tf class NaiveDense: def __init__(self, input_size, output_size, activation): self.activation = activation # Создать матрицу W с формой (input_size, output_size), # инициализированную случайными значениями w_shape = (input_size, output_size) w_initial_value = tf.random.uniform(w_shape, minval=0, maxval=1e-1) self.W = tf.Variable(w_initial_value) # Создать вектор b с формой (output_size,), инициализированный нулями b_shape = (output_size,) b_initial_value = tf.zeros(b_shape) self.b = tf.Variable(b_initial_value) def __call__(self, inputs): # Выполнить прямой проход return self.activation(tf.matmul(inputs, self.W) + self.b) # Вспомогательный метод для получения весов из слоя @property def weights(self): return [self.W, self.b]
На следующем шаге мы рассмотрим простой класс Sequential.