Keras Форма ввода предварительно обученной модели не изменяется - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь использовать трансферное обучение в Керасе. Я подготовил модель для другой задачи, но теперь я хочу использовать ее для аналогичной задачи, но формы ввода и вывода различны. Я загрузил обученную модель, используя load_model. Моя оригинальная модель:

model = Sequential()
model.add(Conv2D(32, (5,5), input_shape=(28,28,1), padding='same', activation='relu'))
model.add(Conv2D(32, (5,5), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.25))
model.add(MaxPool2D(padding='same', strides=2))
model.add(Conv2D(128, (5, 5), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.25))
model.add(MaxPool2D(padding='same', strides=2))
model.add(Conv2D(64, (4,4), padding='same', activation='relu'))
model.add(Conv2D(64, (4,4), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.25))
model.add(MaxPool2D(padding='same', strides=2))
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(26, activation='softmax'))
rmsdrp = optimizers.rmsprop(lr=0.001, epsilon=1e-08)

model.compile( loss = "categorical_crossentropy", 
               optimizer = rmsdrp, 
               metrics=['accuracy']
             )

Затем для вывода я сделал следующее:

    model.pop()
    model.add(Dense(3*168,activation='softmax'))
    model.add(Reshape((3,168)))

Это работает. Для ввода я сделал следующее:

model.layers[0] = Input(shape=(137,236))

Но когда я распечатываю сводку модели, она все равно дает прежнюю форму ввода модели. Что я делаю неправильно? Как еще я должен изменить форму ввода? Это резюме модели в конце:

Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 28, 28, 32)        832       
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 28, 28, 32)        25632     
_________________________________________________________________
batch_normalization_1 (Batch (None, 28, 28, 32)        128       
_________________________________________________________________
dropout_1 (Dropout)          (None, 28, 28, 32)        0         
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 14, 14, 32)        0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 14, 14, 128)       102528    
_________________________________________________________________
batch_normalization_2 (Batch (None, 14, 14, 128)       512       
_________________________________________________________________
dropout_2 (Dropout)          (None, 14, 14, 128)       0         
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 7, 7, 128)         0         
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 7, 7, 64)          131136    
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 7, 7, 64)          65600     
_________________________________________________________________
batch_normalization_3 (Batch (None, 7, 7, 64)          256       
_________________________________________________________________
dropout_3 (Dropout)          (None, 7, 7, 64)          0         
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 4, 4, 64)          0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 1024)              0         
_________________________________________________________________
dense_1 (Dense)              (None, 256)               262400    
_________________________________________________________________
dropout_4 (Dropout)          (None, 256)               0         
_________________________________________________________________
dense_2 (Dense)              (None, 504)               129528    
_________________________________________________________________
reshape_1 (Reshape)          (None, 3, 168)            0         
=================================================================
Total params: 595,706
Trainable params: 595,258
Non-trainable params: 448
_________________________________________________________________

1 Ответ

1 голос
/ 18 февраля 2020

Похоже, проблема в использовании Input(shape=(137,236)), который обычно используется для функциональной модели, а не последовательной. Вы можете изменить входной слой, существенно изменив модель:

input = Input(shape=(137,236))
x = model.layers[1](input) #assuming you are ignoring the first conv layer as implied in your code
for layer in model.layers[2:]:
    x = layer(x)
model = Model(inputs=input, outputs=x)
model.compile(*args, **kwargs)

Редактировать:

Чтобы убедиться, что веса не получаются, вам нужно добавить для l oop, чтобы установить их необучаемым.

for layer in model.layers[1:-2]:
    layer.trainable=False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...