Используйте обученный слой модели при создании другой модели в керасе - PullRequest
1 голос
/ 06 мая 2019

Я создал модель в Керасе, как показано ниже:

    m = Sequential()
    m.add(Dense(912, activation='relu', input_shape=(943, 1)))
    m.add(Dense(728, activation='relu'))
    m.add(Dense(528, activation='relu'))
    m.add(Flatten())
    m.add(Dense(500, activation='relu', name="bottleneck"))
    m.add(Dense(528, activation='relu'))
    m.add(Dense(728, activation='relu'))
    m.add(Dense(943, activation='linear'))

    m.compile(loss='mean_squared_error', optimizer='SGD')
    m.summary()

Теперь я хочу взять слой bottleneck и добавить в мою созданную ниже сеть:

    model = Sequential()
    model.add(Dense(930, activation='relu', input_shape=(943, 1)))
    model.add(Flatten())
    model.add(m.get_layer('bottleneck'))
    model.add(m.get_layer('bottleneck'))
    model.add(m.get_layer('bottleneck'))
    model.add(m.get_layer('bottleneck'))
    model.add(Flatten())
    model.add(Dense(100, activation='linear'))

, но после обучения модели m выдает ошибку при появлении ошибки:

ValueError: Input 0 is incompatible with layer bottleneck: expected axis -1 of input shape to have value 497904 but got shape (None, 876990)

1 Ответ

0 голосов
/ 06 мая 2019

Сообщение об ошибке пытается сообщить вам, что форма вашего ввода для слоя «узкого места» во второй модели отличается от первой.

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

Я подозреваю, что вы хотите что-то более подобное (заметьте, у меня естьв каждом случае сразу сглаживается, чтобы мы могли лучше контролировать количество входов на каждом слое):

m = Sequential()
m.add(Flatten(input_shape=(943, 1)))
m.add(Dense(912, activation='relu'))
m.add(Dense(728, activation='relu'))
m.add(Dense(528, activation='relu'))
m.add(Dense(500, activation='relu', name="bottleneck"))
m.add(Dense(528, activation='relu'))
m.add(Dense(728, activation='relu'))
m.add(Dense(943, activation='linear'))

m.compile(loss='mean_squared_error', optimizer='SGD')
m.summary()
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
flatten (Flatten)            (None, 943)               0         
_________________________________________________________________
dense (Dense)                (None, 912)               860928    
_________________________________________________________________
dense_1 (Dense)              (None, 728)               664664    
_________________________________________________________________
dense_2 (Dense)              (None, 528)               384912    
_________________________________________________________________
bottleneck (Dense)           (None, 500)               264500    
_________________________________________________________________
dense_3 (Dense)              (None, 528)               264528    
_________________________________________________________________
dense_4 (Dense)              (None, 728)               385112    
_________________________________________________________________
dense_5 (Dense)              (None, 943)               687447    
=================================================================
Total params: 3,512,091
Trainable params: 3,512,091
Non-trainable params: 0

И обратите внимание, что вход для нашего узкого слоя имеет форму (None,528).Итак, теперь во второй модели мы можем сделать:

model = Sequential()
model.add(Dense(930, activation='relu', input_shape=(943, 1)))
model.add(Flatten())
model.add(Dense(528, activation='relu'))
model.add(m.get_layer('bottleneck'))
model.add(Flatten())
model.add(Dense(100, activation='linear'))
model.summary()
Model: "sequential_2"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_9 (Dense)              (None, 943, 930)          1860      
_________________________________________________________________
flatten_3 (Flatten)          (None, 876990)            0         
_________________________________________________________________
dense_10 (Dense)             (None, 528)               463051248 
_________________________________________________________________
bottleneck (Dense)           (None, 500)               264500    
_________________________________________________________________
flatten_4 (Flatten)          (None, 500)               0         
_________________________________________________________________
dense_11 (Dense)             (None, 100)               50100     
=================================================================
Total params: 463,367,708
Trainable params: 463,367,708
Non-trainable params: 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...