Обучение изготовленной на заказ модели CNN в среде программирования для активного исполнения

Я построил модель CNN, используя принцип "Подкласса моделей" в Keras. Вот класс, который представляет мою модель:

class ConvNet(tf.keras.Model):

    def __init__(self, data_format, classes):

        super(ConvNet, self).__init__()

        if data_format == "channels_first":
            axis = 1
        elif data_format == "channels_last":
            axis = -1

        self.conv_layer1 = tf.keras.layers.Conv2D(filters = 32, kernel_size = 3,strides = (1,1),
                                                  padding = "same",activation = "relu")
        self.pool_layer1 = tf.keras.layers.MaxPooling2D(pool_size = (2,2), strides = (2,2))
        self.conv_layer2 = tf.keras.layers.Conv2D(filters = 64, kernel_size = 3,strides = (1,1),
                                                  padding = "same",activation = "relu")
        self.pool_layer2 = tf.keras.layers.MaxPooling2D(pool_size = (2,2), strides = (2,2))
        self.conv_layer3 = tf.keras.layers.Conv2D(filters = 128, kernel_size = 5,strides = (1,1),
                                                  padding = "same",activation = "relu")
        self.pool_layer3 = tf.keras.layers.MaxPooling2D(pool_size = (2,2), strides = (1,1),
                                                       padding = "same")
        self.flatten = tf.keras.layers.Flatten()
        self.dense_layer1 = tf.keras.layers.Dense(units = 512, activation = "relu")
        self.dense_layer2 = tf.keras.layers.Dense(units = classes, activation = "softmax")

    def call(self, inputs, training = True):

        output_tensor = self.conv_layer1(inputs)
        output_tensor = self.pool_layer1(output_tensor)
        output_tensor = self.conv_layer2(output_tensor)
        output_tensor = self.pool_layer2(output_tensor)
        output_tensor = self.conv_layer3(output_tensor)
        output_tensor = self.pool_layer3(output_tensor)
        output_tensor = self.flatten(output_tensor)
        output_tensor = self.dense_layer1(output_tensor)

        return self.dense_layer2(output_tensor)

Я хотел бы знать, как тренировать это "с нетерпением", и под этим я имею в виду избегать использования compile а также fit методы.

Я не уверен, как именно построить цикл обучения. Я понимаю, что я должен выполнить tf.GradientTape.gradient() Функция для того, чтобы рассчитать градиенты, а затем использовать optimizers.apply_gradients() для того, чтобы обновить параметры моей модели.

Что я не понимаю, так это как я могу делать прогнозы с моей моделью, чтобы получить logits а затем использовать их для расчета потерь. Если бы кто-то мог помочь мне с идеей о том, как построить тренировочный цикл, я был бы очень признателен.

1 ответ

Решение

Стремительное выполнение - обязательный режим программирования, позволяющий разработчикам следовать естественному потоку управления Python. По сути, вам не нужно было бы сначала создавать заполнители, вычислительные графы, а затем выполнять их в сеансах TensorFlow. Вы можете использовать автоматическое дифференцирование для вычисления градиентов в цикле тренировки:

for i in range(iterations):
  with tf.GradientTape() as tape:
    logits = model(batch_examples, training = True)
    loss = tf.losses.sparse_softmax_cross_entropy(batch_labels, logits)
  grads = tape.gradient(loss, model.trainable_variables)
  opt.apply_gradients([grads, model.trainable_variables])

Это при условии, что model принадлежит к классу Model из Кераса. Я надеюсь, что это решит вашу проблему! Вам также следует ознакомиться с Руководством TensorFlow по Eager Execution.

Другие вопросы по тегам