Какую стратегию я должен использовать в своем CNN, чтобы перейти от 3D-объема к 2D-плоскости? - PullRequest
0 голосов
/ 19 января 2019

Какую стратегию я должен использовать в своем CNN, чтобы перейти от 3D-объема к 2D-плоскости в качестве выходного слоя.Могу ли я даже иметь 2D-слой в качестве выходного сигнала?

Я пытаюсь создать сеть с входным изображением 320x320x3, а выходной должен быть 68x2.

Я знаю, что один из способов сделать это будетначиная с 320x320x3, и после нескольких слоев я могу сгладить свои 3D-слои, а затем сократить их до 1D-массива 136. Но я пытаюсь понять, могу ли я каким-то образом перейти к желаемому 2-мерному измерению на конечном слое.

Спасибо, Шубхам

1 Ответ

0 голосов
/ 19 января 2019

Редактировать : Возможно, я неправильно прочитал ваш вопрос.Если вы намереваетесь иметь 136 выходных узлов, которые можно упорядочить в матрицу 68x2 (), а не выводить изображение 68x68x2, как я сначала представлял ), то вы можете использовать Reshapeслой после вашего окончательного плотного слоя с 136 единицами:

import keras
from keras.models import Sequential
from keras.layers import Conv2D, Flatten, Dense, Reshape

model = Sequential()
model.add(Conv2D(32, 3, input_shape=(320, 320, 3)))
model.add(Flatten())
model.add(Dense(136))
model.add(Reshape((68, 2)))

model.summary()

Это даст вам следующую модель с желаемой формой на выходе:

Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_2 (Conv2D)            (None, 318, 318, 32)      896       
_________________________________________________________________
flatten_2 (Flatten)          (None, 3235968)           0         
_________________________________________________________________
dense_2 (Dense)              (None, 136)               440091784 
_________________________________________________________________
reshape_1 (Reshape)          (None, 68, 2)             0         
=================================================================
Total params: 440,092,680
Trainable params: 440,092,680
Non-trainable params: 0

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


(оригинальный ответ, возможно, все еще актуален)

Да, это обычно делается в моделях семантической сегментации, где входные данные представляют собой изображения, а выходныетензоры одинаковой высоты и ширины изображения, а также с количеством каналов, равным количеству классов на выходе.Если вы хотите сделать это в TensorFlow или Keras, вы можете найти существующих реализаций , например, архитектуры U-Net.

Основная особенность этих моделей заключается в том, что эти сети являются полностью сверточными: они состоят только из сверточных слоев.Как правило, карты feaure в этих моделях сначала переходят от «широких и неглубоких» (карты больших объектов в пространственных измерениях с небольшим количеством каналов) к «маленьким и глубоким» (небольшие пространственные измерения, измерение больших размеров каналов) и обратно кжелаемый выходной размер.Отсюда U-образная форма:

enter image description here

Существует множество способов перехода от 320x320x3 к 68x2 с полностью сверточной сетью, но вход и выходвашей модели в основном будет выглядеть так:

import keras
from keras import Sequential
from keras.layers import Conv2D

model = Sequential()

model.add(Conv2D(32, 3, activation='relu', input_shape=(320,320,3)))
# Include more convolutional layers, pooling layers, upsampling layers etc
...
# At the end of the model, add your final Conv2dD layer with 2 filters
# and the required activation function
model.add(Conv2D(2, 3, activation='softmax'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...