Как скопировать веса из 2D-конвета в 3D-Convnet на Keras? - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь реализовать 3D-коннет, а затем слой LSTM для генерации последовательности с использованием 3D-изображений в качестве входных данных на Keras с бэкэндом Tensorflow.

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

Чтобы начать с базового примера, я взял VGG-16 и реализовал «3D» версию этой сети (без слоев FC):

img_input = Input((100,80,80,3))
x = Conv3D(64, (3, 3 ,3), activation='relu', padding='same', name='block1_conv1')(img_input)

x = Conv3D(64, (3, 3 ,3), activation='relu', padding='same', name='block1_conv2')(x)

x = MaxPooling3D((1, 2, 2), strides=(1, 2, 2), name='block1_pool')(x)

x = Conv3D(128, (3, 3 ,3), activation='relu', padding='same', name='block2_conv1')(x)

x = Conv3D(128, (3, 3 ,3), activation='relu', padding='same', name='block2_conv2')(x)
x = MaxPooling3D((1, 2 ,2), strides=(1,2, 2), name='block2_pool')(x)

x = Conv3D(256, (3, 3 ,3), activation='relu', padding='same', name='block3_conv1')(x)
x = Conv3D(256, (3, 3 , 3), activation='relu', padding='same', name='block3_conv2')(x)
x = Conv3D(256, (3, 3, 3), activation='relu', padding='same', name='block3_conv3')(x)
x = MaxPooling3D((1, 2 ,2), strides=(1,2, 2), name='block3_pool')(x)

x = Conv3D(512, (3, 3 ,3), activation='relu', padding='same', name='block4_conv1')(x)
x = Conv3D(512, (3, 3 ,3), activation='relu', padding='same', name='block4_conv2')(x)
x = Conv3D(512, (3, 3 ,3), activation='relu', padding='same', name='block4_conv3')(x)
x = MaxPooling3D((1, 2 ,2), strides=(1, 2, 2), name='block4_pool')(x)

x = Conv3D(512, (3, 3 ,3), activation='relu', padding='same', name='block5_conv1')(x)
x = Conv3D(512, (3, 3 ,3), activation='relu', padding='same', name='block5_conv2')(x)
x = Conv3D(512, (3, 3 ,3), activation='relu', padding='same', name='block5_conv3')(x)
x = MaxPooling3D((1, 2 ,2), strides=(1, 2, 2), name='block5_pool')(x)

Поэтому я хотел бы знать, как я могу загрузить веса предварительно обученного VGG-16 в каждый из 100 срезов (мои 3D-изображения составлены из 100 срезов 80x80 rgb),

Любой совет, который вы можете дать мне, был бы полезен,

Спасибо

1 Ответ

0 голосов
/ 25 сентября 2018

Это зависит от того, что вы хотите сделать в вашем приложении.Если вы просто хотите обработать трехмерное изображение в терминах срезов, то вы можете определить, как будет работать TimeDistributed VGG16 (Conv2D вместо Conv3D).

Модель становится примерно такой для каждого слоя, который вы определили выше:

img_input = Input((100,80,80,3))
x = TimeDistributed(Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv1', trainable=False))(img_input)
x = TimeDistributed(Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv2', trainable=False))(x)
x = TimeDistributed((MaxPooling2D((2, 2), strides=(2, 2), name='block1_pool', trainable=False)(x)
...
...

Обратите внимание, что здесь я включил опцию 'trainable = False'.Это очень полезно, если вы хотите обучить только более глубокие слои и заморозить нижние слои с помощью хорошо обученных весов VGG.

Чтобы загрузить веса VGG для модели, вы можете использовать load_weights функция Keras.

model.load_weights(filepath, by_name=True)

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

Однако изучение пространственно-временных характеристик - это то, что потенциально может быть гораздо лучше, если использовать 3D ConvNets.Если это основа вашего приложения, то вы не можете напрямую импортировать весы VGG16 в модель Conv3D, потому что число параметров в каждом слое теперь увеличивается, потому что фильтр изменился с 3 * 3 до 3 * 3 * 3 дляпример.

Вы все еще можете загружать веса по слоям в модель, учитывая, какой патч 3 * 3 из 3 * 3 * 3 будет наиболее подходящим для инициализации с весами VGG16. set_weights () функция принимает в качестве входных данных список пустых массивов (для весов ядра и смещения соответственно).Вы можете извлечь вес каждого слоя из VGG16, а затем создать новый массив для эквивалентной матрицы весов Conv3D и передать его в свою модель Conv3D.

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

Например, C3D - одна из таких популярных моделей. ShapeNet и Pascal3D являются популярными наборами 3D-данных.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...