Как заменить плотный слой на сверточный? - PullRequest
0 голосов
/ 17 сентября 2018

Я хотел заменить слой Dense_out на сверточный, кто-нибудь может сказать мне, как это сделать?

код:

model = Sequential()
conv_1 = Conv2D(filters = 32,kernel_size=(3,3),activation='relu')
model.add(conv_1)
conv_2 = Conv2D(filters=64,kernel_size=(3,3),activation='relu')
model.add(conv_2)
pool = MaxPool2D(pool_size = (2,2),strides = (2,2), padding = 'same')
model.add(pool)
drop = Dropout(0.5)
model.add(drop)
model.add(Flatten())
Dense_1 = Dense(128,activation = 'relu')
model.add(Dense_1)
Dense_out = Dense(57,activation = 'softmax')
model.add(Dense_out)
model.compile(optimizer='Adam',loss='categorical_crossentropy',metric=['accuracy'])
model.fit(train_image,train_label,epochs=10,verbose = 1,validation_data=(test_image,test_label))
print(model.summary())

, когда я пытаюсь этот код:

model = Sequential()
conv_01 = Conv2D(filters = 32,kernel_size=(3,3),activation='relu')
model.add(conv_01)
conv_02 = Conv2D(filters=64,kernel_size=(3,3),activation='relu')
model.add(conv_02)
pool = MaxPool2D(pool_size = (2,2),strides = (2,2), padding = 'same')
model.add(pool)
conv_11 = Conv2D(filters=64,kernel_size=(3,3),activation='relu')
model.add(conv_11)
pool_2 = MaxPool2D(pool_size=(2,2),strides=(2,2),padding='same')
model.add(pool_2)
drop = Dropout(0.3)
model.add(drop)
model.add(Flatten())
Dense_1 = Dense(128,activation = 'relu')
model.add(Dense_1)
Dense_2 = Dense(64,activation = 'relu')
model.add(Dense_2)
conv_out = Conv2D(filters= 64,kernel_size=(3,3),activation='relu')
model.add(Dense_out)
model.compile(optimizer='Adam',loss='categorical_crossentropy',metrics=['accuracy'])
model.fit(train_image,train_label,epochs=10,verbose = 1,validation_data=(test_image,test_label))

Я получаю следующую ошибку

ValueError:Вход 0 слоя conv2d_3 несовместим со слоем: ожидаемый ndim = 4, найденный ndim = 2.Получена полная форма: [Нет, 64]

Я новичок в этом, поэтому объяснение очень поможет

1 Ответ

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

Вам потребуется изменить форму, чтобы иметь возможность использовать фильтр 2x2 по мере необходимости в слое conv2D.Вы можете использовать:

out = keras.layers.Reshape(target_shape)
model.add(out)

, а затем выполнить свертку:

conv_out = Conv2D(filters=3,kernel_size=(3,3),activation='softmax')
model.add(conv_out)

, где filters - количество каналов, которое вы хотите получить в выходном слое (3 для RGB).

Подробнее о слоях и параметрах в Документация Keras

...