У меня есть модель Keras, которая состоит из различных слоев. Один из этих слоев - фактически другая целая модель. Когда эта модель слоя VGG16, я могу обучить Uber-модель. Это модель.summary ():
![enter image description here](https://i.stack.imgur.com/9dEYd.png)
Когда я просто поменяю VGG16 и поменяю местами в EfficientNetB0 (на намного меньше модель!) больше не могу тренировать убер-модель. Это модель.summary ():
![enter image description here](https://i.stack.imgur.com/wzmpE.png)
«А-а, - говорите вы, - что-то что-то обучаемое, что-то весит, что-то градиенты в памяти, что-то, что-то. "
Хорошо, конечно. Давайте сжимаем и / или сбрасываем кучу слоев таким образом, чтобы тренировочные веса были ниже версии VGG16. После этого я все еще не могу тренировать Uber-модель! Это модель.summary ():
![enter image description here](https://i.stack.imgur.com/74Cpt.png)
Почему я не могу обучить гораздо меньшую модель, которая имеет 30% от общего веса и 25 % обучаемых весов?
Пример кода:
img = Input(shape = (224,224,3))
# ^ Don't reuse img= or Tensorflow will break!
x = BatchNormalization()(img)
x = Efnet(x)
# x = Vgg16(x)
x = Activation('linear')(x)
# ^ Don't remove pass through or Tensorflow will break!
x = GeneralizedMeanPool2D(x)
x = NormActDrop(x)
x = DenseNormActDrop(x, 32)
x = DenseNormActDrop(x, 32)
x = DenseNormActDrop(x, 32)
x = Dense(1)(x)
model = Model(inputs = img, outputs = x)
model.summary()
Пользовательские блоки настолько просты, насколько вы можете себе представить, например:
def NormActDrop(x, activation_function = mish, dropout_rate = 0.2):
x = BatchNormalization()(x)
x = Activation(activation_function)(x)
x = Dropout(dropout_rate)(x)
return x