Как изменить замороженные слои при обучении с помощью API обнаружения объектов Tensorflow?

Я использую API обнаружения объектов Tensorflow в процессе обучения.

В каком файле определены замороженные слои для точной настройки модели во время обучения. Мне нужно поэкспериментировать с изменением замороженных слоев при тонкой настройке.

Например, если я использую конфигурацию Resnet50, где я могу поменять замороженные слои?


person batuman    schedule 03.05.2019    source источник
comment
Если заморозить слой, не надо ли его настраивать во время тренировки?   -  person danyfang    schedule 03.05.2019
comment
Название вашего вопроса не очень понятно. Замороженный слой не предполагается изменять во время обучения. Вероятно, вы имели в виду How to freeze layers in training using TF OD API?   -  person danyfang    schedule 07.05.2019


Ответы (1)


Конечно, вы можете это сделать.

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

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

freeze_variables: ["resnet_v1_50/block1/unit_1/bottleneck_v1/conv1/weights"]

Итак, ваша конфигурация выглядит так:

train_config: {
  batch_size: 1
  freeze_variables: ["resnet_v1_50/block1/unit_1/bottleneck_v1/conv1/weights"]
  ...

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

Как показано, веса больше не работают train.

Выбирая определенные шаблоны для freeze_variables, вы можете очень гибко замораживать переменные (вы можете получить имена слоев из графика тензорного потока).

Кстати, здесь - это фактическая операция фильтрации.

person danyfang    schedule 03.05.2019
comment
Спасибо за хорошее объяснение. Вы сказали, что мы можем включить его в файл конфигурации. Но в этом конфигурационном файле https://github.com/tensorflow/models/blob/master/research/object_detection/samples/configs/faster_rcnn_resnet50_coco.config такой freezed layer реализации нет. Это мой вопрос о том, где в Tensorflow реализовано замораживание для faster_rcnn_resnet50. - person batuman; 06.05.2019
comment
Ох, неправильно это понял. Но поскольку прототип поддерживает его, вы, безусловно, можете добавить его, даже если образец конфигурации не содержит его. - person danyfang; 06.05.2019
comment
Вы имеете в виду, что Tensorflow Objection Detection API не переносит обучение только на несколько уровней? Переобучаются все слои, если такого freeze_variables: in train config file нет, не так ли? - person batuman; 07.05.2019
comment
Нет, я не это имел в виду. Он может передавать обучение на любые уровни. Если нет freeze_variables, вес всех слоев будет обновлен во время тренировки. - person danyfang; 07.05.2019
comment
@danyfang Как узнать возможные значения для freeze_variables? По умолчанию в train.proto написано: repeated string freeze_variables = 12;. Что это значит? - person xanjay; 25.09.2019
comment
@xanjay, я не знаю точно, что это 12 означает, но я думаю, что это просто используется для синтаксиса. Если вы посмотрите на train.proto, вы увидите, что обычно значения по умолчанию предоставляются в формате [default = ...]. freeze_variables не имеет значений по умолчанию. Чтобы узнать возможные значения, вы можете сделать то же самое, что и я, посмотрев на график тензорного потока. U может фактически заморозить любые обучаемые переменные, единственная проблема - указать точное имя переменной. - person danyfang; 25.09.2019
comment
Как мы можем увидеть граф Tensorflow? Я тренирую mobilenetV1, но не знаю, как я могу увидеть в нем названия разных слоев - person Kamran Hosseini; 09.06.2020
comment
Привет, @danyfang, @xanjay. На момент написания этой статьи строка repeated string freeze_variables = 12; является частью определения сообщения TrainConfig буфера протокола, найденного в прото-файле train.proto. 12 называется номером поля. Номер поля - это уникальный номер, который присваивается каждому полю сообщения protobuff и используется для идентификации во время процесса сериализации и десериализации. Подробнее о буферах протокола и номерах полей можно узнать на официальные документы - person Jonalogy; 09.10.2020