Я использую CNN для проблемы классификации. Код для архитектуры модели ниже:

model.add(Conv1D(256, 5,padding='same',
                 input_shape=(40,1)))
model.add(Activation('relu'))
model.add(Conv1D(128, 5,padding='same'))
model.add(Activation('relu'))
model.add(Dropout(0.1))
model.add(MaxPooling1D(pool_size=(8)))
model.add(Conv1D(128, 5,padding='same',))
model.add(Activation('relu'))
model.add(Conv1D(128, 5,padding='same',))
model.add(Activation('relu'))
model.add(Flatten())
model.add(Dense(8))
model.add(Activation('softmax'))
opt = keras.optimizers.rmsprop(lr=0.00001, decay=1e-6)


Сколько скрытых слоев у этой модели? Также какой из них является выходным и входным слоем?

-1
ioanna balsam 20 Июл 2020 в 23:38

2 ответа

Лучший ответ

Входной слой - это первый слой (тот, где указан input_shape). Каждый раз, когда вы используете model.add, создается новый слой. Вы можете использовать model.summary (), чтобы распечатать структуру слоя модели, как показано ниже.

Model: "sequential_8"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv1d_20 (Conv1D)           (None, 40, 256)           1536      
_________________________________________________________________
activation_23 (Activation)   (None, 40, 256)           0         
_________________________________________________________________
conv1d_21 (Conv1D)           (None, 40, 128)           163968    
_________________________________________________________________
activation_24 (Activation)   (None, 40, 128)           0         
_________________________________________________________________
dropout_6 (Dropout)          (None, 40, 128)           0         
_________________________________________________________________
max_pooling1d_4 (MaxPooling1 (None, 5, 128)            0         
_________________________________________________________________
conv1d_22 (Conv1D)           (None, 5, 128)            82048     
_________________________________________________________________
activation_25 (Activation)   (None, 5, 128)            0         
_________________________________________________________________
conv1d_23 (Conv1D)           (None, 5, 128)            82048     
_________________________________________________________________
activation_26 (Activation)   (None, 5, 128)            0         
_________________________________________________________________
flatten_3 (Flatten)          (None, 640)               0         
_________________________________________________________________
dense_3 (Dense)              (None, 8)                 5128      
_________________________________________________________________
activation_27 (Activation)   (None, 8)                 0         
=================================================================
Total params: 334,728
Trainable params: 334,728
Non-trainable params: 0  

Это может немного сбивать с толку в том смысле, что ваш фактический выходной слой - это слой с 8 узлами и функцией активации softmax. Я предпочитаю создавать модели следующим образом

inputs = tf.keras.Input(shape=(40,1))
x = tf.keras.layers.Conv1D(256, 5,padding='same', activation='relu')(inputs)
x=Dropout(.1)(x)
x=MaxPooling1D(pool_size=(8))(x)
x=Conv1D(128, 5,padding='same', activation='relu')(x)
x=Conv1D(128, 5,padding='same', activation='relu')(x)
x=Conv1D(128, 5,padding='same', activation='relu')(x)
x=Flatten()(x)
outputs=Dense(8, activation='softmax')(x)
model = tf.keras.Model(inputs=inputs, outputs=outputs)

It is the exact same model but I think it is clearer as to what layer is the actual output
See result below for model.summary()

> Blockquote
Model: "model_6"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_9 (InputLayer)         [(None, 40, 1)]           0         
_________________________________________________________________
conv1d_44 (Conv1D)           (None, 40, 256)           1536      
_________________________________________________________________
dropout_15 (Dropout)         (None, 40, 256)           0         
_________________________________________________________________
max_pooling1d_12 (MaxPooling (None, 5, 256)            0         
_________________________________________________________________
conv1d_45 (Conv1D)           (None, 5, 128)            163968    
_________________________________________________________________
conv1d_46 (Conv1D)           (None, 5, 128)            82048     
_________________________________________________________________
conv1d_47 (Conv1D)           (None, 5, 128)            82048     
_________________________________________________________________
flatten_11 (Flatten)         (None, 640)               0         
_________________________________________________________________
dense_12 (Dense)             (None, 8)                 5128      
=================================================================
Total params: 334,728
Trainable params: 334,728
Non-trainable params: 0

1
Gerry P 21 Июл 2020 в 15:22

Первый слой - это входной слой, а последний - выходной. Все, что находится между этими двумя, - это скрытые слои.

model.add(Conv1D(256, 5,padding='same', input_shape=(40,1))) # input layer
model.add(Activation('relu')) # hidden layer
model.add(Conv1D(128, 5,padding='same')) # hidden layer
model.add(Activation('relu')) # hidden layer
model.add(Dropout(0.1)) # hidden layer
model.add(MaxPooling1D(pool_size=(8))) # hidden layer
model.add(Conv1D(128, 5,padding='same',)) # hidden layer 
model.add(Activation('relu')) # hidden layer
model.add(Conv1D(128, 5,padding='same',)) #hidden layer
model.add(Activation('relu')) # hidden layer
model.add(Flatten()) # hidden layer
model.add(Dense(8)) # hidden layer
model.add(Activation('softmax')) # output layer
opt = keras.optimizers.rmsprop(lr=0.00001, decay=1e-6)
2
Abhishek Verma 20 Июл 2020 в 21:46