влияние выравнивающего слоя и его правильное использование - PullRequest
0 голосов
/ 07 мая 2018

Я работаю над простой 1D моделью свертки, которая построена следующим образом

model1= Sequential()
model1.add(Conv1D(60,32, strides=1, activation='relu',padding='causal',input_shape=(64,1)))
model1.add(Conv1D(80,10, strides=1, activation='relu',padding='causal'))
model1.add(Conv1D(100,5, strides=1, activation='relu',padding='causal'))
model1.add(MaxPooling1D(2))
model1.add(Dense(300,activation='relu'))
model1.add(Flatten())
model1.add(Dense(1,activation='relu'))
print(model1.summary())

Краткое описание модели выглядит следующим образом

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv1d_1 (Conv1D)            (None, 64, 60)            1980      
_________________________________________________________________
conv1d_2 (Conv1D)            (None, 64, 80)            48080     
_________________________________________________________________
conv1d_3 (Conv1D)            (None, 64, 100)           40100     
_________________________________________________________________
max_pooling1d_1 (MaxPooling1 (None, 32, 100)           0         
_________________________________________________________________
dense_1 (Dense)              (None, 32, 300)           30300     
_________________________________________________________________
flatten_1 (Flatten)          (None, 9600)              0         
_________________________________________________________________
dense_2 (Dense)              (None, 1)                 9601      
=================================================================
Total params: 130,061
Trainable params: 130,061
Non-trainable params: 0
_________________________________________________________________

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

model1= Sequential()
model1.add(Conv1D(60,32, strides=1, activation='relu',padding='causal',input_shape=(64,1)))
model1.add(Conv1D(80,10, strides=1, activation='relu',padding='causal'))
model1.add(Conv1D(100,5, strides=1, activation='relu',padding='causal'))
model1.add(MaxPooling1D(2))
model1.add(Flatten())
model1.add(Dense(300,activation='relu'))
model1.add(Dense(1,activation='relu'))

enter image description here

1 Ответ

0 голосов
/ 07 мая 2018

Разница в том, что в первом случае у вас есть плотный слой по каналу. Слой отобразит 100 входов на 300 выходов, используя 100 x 300 = 30000 весов и 300 смещений, в общей сложности 30 300 параметров. та же самая операция будет повторена для всех 32 каналов его ввода из max_pooling1d_1.

Во втором случае вы сначала сглаживаете входные данные, так что теперь у вас есть 3200 входных данных и сопоставьте их с 300 выходными данными, что требует 300 x 3200 + 300 = 960 300 параметров.

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

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