почему он говорит это: TypeError: __call__() отсутствует 1 обязательный позиционный аргумент: «входы»

Я пытаюсь создать пользовательскую модель, подобную vgg, с функцией отключения и активации swish. Я совершенно не понимаю, в чем здесь проблема. Я новичок, поэтому, возможно, я совершенно не прав. Я бы так не думал, так как я иду на примере учебников и руководств.

Вот код:

from keras.models import Sequential
from keras.layers import Dense, Conv2D, MaxPooling2D, Dropout
from keras.layers import Flatten, Activation
from keras.applications.vgg16 import VGG16
from keras.models import Model
from keras import backend as K

def swish(x):
    return K.sigmoid(x) * x

custom_vgg = Sequential()
img_width = 224
img_height = 224
vgg_model = VGG16(include_top=False, weights='imagenet',input_shape=(img_width, img_height, 3))
print(vgg_model.get_config())
#vgg_model.save_weights('models/vgg_weights.h5')
for layer in vgg_model.layers:
    if layer.__class__.__name__=='MaxPooling2D':
        layer.trainable = False
        custom_vgg.add(layer(activation = swish))
        custom_vgg.add(Dropout(0.4))
    else :
        custom_vgg.add(layer)
custom_vgg.add(Flatten())
custom_vgg.add(Dense(1024,activation=swish))
custom_vgg.add(Dense(1024,activation=swish))
custom_vgg.add(Dense(128, activation = "softmax"))

custom_vgg.compile(optimizer = "adam", loss = "categorical_crossentropy", metrics = ["accuracy"])

custom_vgg.summary() 

консоль говорит следующее:

Traceback (most recent call last):
  File "/Users/shavkatsultanov/Documents/SCHUETZ/tensor_flow/vgg_swish.py", line 20, in <module>
    custom_vgg.add(layer(activation = swish))
TypeError: __call__() missing 1 required positional argument: 'inputs'

Мне интересно, потому что я пробовал подобные вещи, перебирая слои и добавляя к другой модели, и это сработало. Кроме того, когда он находится в строке 20, он не должен ожидать каких-либо «входов» или чего-то еще?

если бы кто-то мог помочь здесь, это было бы здорово, спасибо!

редактировать: мне интересно, если что-то с оператором if, спрашивая о class_name, если это, возможно, как-то неправильно? очень надеюсь, что кто-то может решить это


person Shaved Man    schedule 25.02.2020    source источник
comment
Я думаю, вы хотите определить новый тип слоя с собственной функцией активации, как здесь: keras.io/layers/writing-your-own-keras-layers   -  person Itamar Mushkin    schedule 25.02.2020


Ответы (1)


custom_vgg.add(layer(activation = swish))

Вы вызываете layer объект (это не создание слоя, это вызов слоя, который вы получили из существующей модели). И, очевидно, слои keras можно вызывать, layer(...) являясь оболочкой для внутренней логики (это... не очень хороший API, я думаю).

В любом случае, просто... не вызывайте слой.

person Masklinn    schedule 25.02.2020
comment
эй, какой API вы используете, если я могу спросить? - person Shaved Man; 25.02.2020