Keras: изменение структуры обученной модели

#python #tensorflow #machine-learning #keras #neural-network

#python #тензорный поток #машинное обучение #keras #нейронная сеть

Вопрос:

Я новичок в машинном обучении. Я изучаю это с помощью Keras, выполняя упражнения для себя.

Вот видео из моего последнего упражнения. Я обучил сверточную нейронную сеть идентифицировать три разных объекта. Телефон отправляет изображение на веб-сервер на моем рабочем столе, который запускает Keras.

Потребовалось некоторое время, пока я не получил модель, которая работала. Я начал с обучения на видеокадрах этих 3 объектов на стерильном фоне. Я не знаю, есть ли общепринятое название для этой техники, но я использовал своего рода подход «обучающих колес». Сначала я обучил модель на действительно простом фоне. Затем снял больше видеороликов на более загруженных фонах. Я провел 6 раундов, каждый раунд на другом фоне. В каждом раунде я загружал веса из предыдущих раундов и обучал сеть на объединенном наборе данных из всех предыдущих раундов. Идея заключалась в том, чтобы запустить нейронную сеть с чего-то простого, а затем постепенно расширять ее знания, а не пытаться сразу дать ей сложную задачу.

Похоже, это сработало, теперь у меня хорошая точность при идентификации этих объектов на разных фонах. Я сохранил веса модели в файл.

Мой вопрос: теперь, когда у меня есть хорошая обученная сеть, возможно ли изменить ее структуру? Например, прямо сейчас я обрезаю и изменяю размер изображений до 64×64. Если бы я захотел увеличить ее до 128×128, смогу ли я использовать веса, которые я обучил до сих пор? Что, если бы я хотел добавить цвет (таким образом, 3 канала вместо 1), возможно ли это без запуска обучения с нуля?

Ответ №1:

Немного разбираемся в нейронных сетях. Первые уровни архитектуры вашей нейронной сети изучают простые функции.
Например
, рассмотрим изображения, первые слои научатся обнаруживать горизонтальные или вертикальные края, а позже смогут обнаруживать более сложные объекты. Взгляните на это и это.

Теперь у вас есть обученная нейронная сеть с хорошей точностью, и вы хотите использовать эти обученные веса, но в то же время изменить архитектуру.

Сохранение постоянной верхней части модели и изменение архитектуры нижних слоев:

Этот подход будет работать, если вы сохраните верхние слои такими, какие они есть, и измените архитектуру нижних слоев. т. Е. добавляете / удаляете плотные слои, добавляете / удаляете слои свертки.

Это потому, что функции, изученные на предыдущем уровне, отвечают за функции следующего уровня. Взгляните на это. Если вы измените количество нейронов в первом слое, представление объектов изменится в следующих слоях.

Итак, если вы добавите еще один сверточный слой к существующему слою, он возьмет функцию, сгенерированную из обученной модели, и будет использовать эти функции для изучения еще более сложных функций.

Теперь, если вы хотите сохранить верхнюю часть вашей модели постоянной, вы должны использовать тот же формат ввода, на котором обучена ваша модель.

Изменение отдела:
При изменении входных данных изменяется количество параметров, а также тип слоев, которые могут обрабатывать этот конкретный ввод.

 model = tf.keras.models.Sequential([
  tf.keras.layers.Conv2D(3, 3,input_shape=(64,64,1)),
  tf.keras.layers.Dense(512, activation=tf.nn.relu),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.summary()
  

Вывод:

 Model: "sequential_5"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_5 (Conv2D)            (None, 62, 62, 3)         30        
_________________________________________________________________
dense_10 (Dense)             (None, 62, 62, 512)       2048      
_________________________________________________________________
dense_11 (Dense)             (None, 62, 62, 10)        5130      
=================================================================
Total params: 7,208
Trainable params: 7,208
Non-trainable params: 0
  

Код:

 model = tf.keras.models.Sequential([
  tf.keras.layers.Conv2D(3, 3,input_shape=(64,64,3)),
  tf.keras.layers.Dense(512, activation=tf.nn.relu),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.summary()
  

Вывод:

 Model: "sequential_6"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_6 (Conv2D)            (None, 62, 62, 3)         84        
_________________________________________________________________
dense_12 (Dense)             (None, 62, 62, 512)       2048      
_________________________________________________________________
dense_13 (Dense)             (None, 62, 62, 10)        5130      
=================================================================
Total params: 7,262
Trainable params: 7,262
Non-trainable params: 0
  

Как вы можете видеть, параметры различны для обеих моделей. Таким образом, вы не сможете использовать веса из одной модели во второй модели, поскольку размеры матрицы весов не будут совпадать.

Изменение размера ввода:

Если вы измените размер ввода без изменения количества каналов, т.е. (64,64,1) —> (128, 128, 1) ваши параметры останутся прежними. Таким образом, вы можете использовать ранее обученные веса с новой моделью.
Однако знайте, что полученные веса зависят от размера входных данных. Итак, то, что хорошо работало для (64,64,1), не обязательно будет работать для (128,128,1), но может действовать как хорошие веса инициализации.

Добавление неподготовленного слоя перед вашей обученной архитектурой:

Это не сработает, потому что, как мы видели ранее, функции, созданные из предыдущих слоев, отвечают за функции следующего уровня. Если функции предыдущих слоев изменяются, функции следующих слоев должны измениться соответствующим образом.

Ключевые моменты:

  1. Если вы хотите использовать предварительно обученную модель, сохраните модель как верхнюю часть вашей новой архитектуры и используйте ту же структуру ввода, которая использовалась для обучения предварительно обученной модели.

  2. Если вы хотите изменить количество каналов, вам лучше обучить свою модель с нуля.

  3. Если вы хотите изменить размер входных данных, вы можете использовать предварительно обученные веса модели в качестве хорошей отправной точки.

Комментарии:

1. Не могли бы вы принять и поддержать, если решение сработало.