Comments 7
Не понятно вот что:
Загрузим веса с ImageNet в Xception, из которой убраны последние полносвязные слои. Прогоним наш датасет через эту сеть, чтобы получить признаки, которые свёрточная сеть может извлечь из изображений (так называемые bottleneck features):
Т.е. мы делаем прямой проход изображений из нашего датасета, сохраняем выделенные последним слоем сверточной сети признаки вместе с labels изображений, поданных на вход?
Создадим полносвязную сеть и обучим её на признаках, полученных из свёрточных слоёв, используя для валидации специально отложенную часть исходного набора данных:
У нас есть только полносвязанные слои, без сверточных? И обучаем их на сохраненных в шаге 1 изображениях (признаках на выходе сверточной сети) и labels?
0
Да, мы делаем прямой проход изображений через свёрточные слои сети и сохраняем выделенные признаки. Лейблы сохранять не нужно, так как мы выставили у генератора
и потом без проблем восстановим порядок лейблов.
На следующем шаге мы создаем полносвязную сеть и тренируем её на признаках, сохранённых на первом шаге. По сути этот процесс похож на вариант, когда мы сразу добавляем к сверточной части сети полносвязную и «замораживаем» обучение у свёрточных слоёв, однако он серьёзно экономит нам ресурсы, позволяя избежать повторения прямого прогона изображений через свёрточные слои, веса которых не меняются, на каждой эпохе обучения.
shuffle=False
и потом без проблем восстановим порядок лейблов.
На следующем шаге мы создаем полносвязную сеть и тренируем её на признаках, сохранённых на первом шаге. По сути этот процесс похож на вариант, когда мы сразу добавляем к сверточной части сети полносвязную и «замораживаем» обучение у свёрточных слоёв, однако он серьёзно экономит нам ресурсы, позволяя избежать повторения прямого прогона изображений через свёрточные слои, веса которых не меняются, на каждой эпохе обучения.
+1
Такой вопрос, если последний слой делать не полносвязным, а
где x — вектор предыдущего слоя, а y подбираемые переменные?
sigm(sum(x-y)^2)
где x — вектор предыдущего слоя, а y подбираемые переменные?
0
Свернём исходный тензор 1х1 свёрткой, подобно тому как мы делали в блоке Inception, получив тензор (M−2)∗(M−2)∗C2. Эта операция называется pointwise convolution
А разве при 1x1 свертке c шагом 1 по пространственным координатам меняются размерности? Вроде должно быть M∗M∗C2.
+1
1) > InceptionResNetV2 имеет 55 873 736 обучаемых параметров и весит 215 Мб, достигая точности 80.4%.
> Xception… имеет 22 910 480 весов и весит 88 Мб. При этом точность классификации на ImageNet составляет 79%.
А можно ли догнать лидера InceptionResNetV2 по точности немного увеличив, например, количество слоёв (типа вместо 16->32 сделаем 16->35 или 40)?
2) В Rethinking the Inception Architecture for Computer Vision предлагалась архитектура, состоящая из свёрток 1xN и Nx1 в различных комбинациях. Это подход в итоге забраковали? Можно ли его скомбинировать с данным? Т.е. в итоге вместо свёртки по объёму использовать линейные свёртки по «осям».
> Xception… имеет 22 910 480 весов и весит 88 Мб. При этом точность классификации на ImageNet составляет 79%.
А можно ли догнать лидера InceptionResNetV2 по точности немного увеличив, например, количество слоёв (типа вместо 16->32 сделаем 16->35 или 40)?
2) В Rethinking the Inception Architecture for Computer Vision предлагалась архитектура, состоящая из свёрток 1xN и Nx1 в различных комбинациях. Это подход в итоге забраковали? Можно ли его скомбинировать с данным? Т.е. в итоге вместо свёртки по объёму использовать линейные свёртки по «осям».
0
А можно ли догнать лидера InceptionResNetV2 по точности немного увеличив, например, количество слоёв (типа вместо 16->32 сделаем 16->35 или 40)?
Хороший вопрос. Полагаю, что если не догнать, то приблизиться вплотную к этому результату можно. Другое дело, что этого никто пока что не сделал (насколько мне удалось нагуглить). Я думаю, что причина в следующем: если мы хотим реально выжимать доли процентов из точности на ImageNet, то в 2018 году там в ход уже идёт более тяжелая артиллерия, а Xception (и впоследствии MobileNet) как раз опирается на идеологию того, что мы хотим сделать относительно компактную архитектуру, а не выдавить максимум перфоманса.
В целом, попробовать углубить Xception-like архитектуру и довести её до 80% accuracy — интересный челлендж, но к сожалению, я не обладаю достаточными аппаратными ресурсами, чтобы поэкспериментировать в этом направлении.
Это подход в итоге забраковали? Можно ли его скомбинировать с данным?
Почему же забраковали? Насколько я понимаю, вы говорите об InceptionV3, довольно распространённой архитектуре. Её я осознанно не брал в сравнение в статье, поскольку она показывает 78.8% top-1 accuracy на ImageNet, и потому сравнивать с ней не так наглядно.
Я думаю, что пытаться совместить эти подходы не стоит. Они и так похожи между собой и, как мне кажется, являются параллельными ветвями развития одной и той же модели — Inception-модуля.
0
Sign up to leave a comment.
Xception: компактная глубокая нейронная сеть