Ошибка типа: __call __ () принимает 2 позиционных аргумента, но 3 были заданы при создании нейронной сети - PullRequest
0 голосов
/ 06 ноября 2019

Я выполняю поиск гиперпараметров для моей нейронной сети. Мой код работает нормально для первой итерации. Но во второй итерации он выдает мне следующую ошибку:

TypeError: call () принимает 2 позиционных аргумента, но было дано 3

Мой код:


def model(conv_layer,filters):

    i1 = Input(shape=(7000,208))
    i2 = Input(shape=(7000, ))
    for j in range(conv_layer):
        if j == 0:
            c1 = Conv1D(filters, kernel_size=4,activation='relu')(i1)
        else:
            c1 = Conv1D(filters, kernel_size=4,activation='relu')(c1)

    c1 = AveragePooling1D(2)(c1)
    #c1 = Dropout(0.2)(c1)


    c1 = Flatten()(c1)

    print('pos')
    for i in range(1):

        if i == 0:
            c2 = Dense(64,  activation='relu')(i2)
            #c2 = Dropout(dropout)(c2)
        else:
            c2 = Dense(64,  activation='relu')(c2)
            #c2 = Dropout(dropout)(c2)


    print('concat')
    c = concatenate([c1, c2])

    print('here')
    for i in range(1):
        x = Dense(256, activation='relu', kernel_initializer='normal')(c)
        #x = Dropout(0.25)(x)

    print('output')
    output = Dense(5, activation='softmax')(x)
    print('')
    model = Model([i1, i2], [output])

    model.summary()

    model.compile(loss=keras.losses.categorical_crossentropy,
                  optimizer=keras.optimizers.Adam(),
                  metrics=['accuracy'])

    return model

if __name__ == '__main__':


    nb_conv = [2,3,4,5,6]
    conv_filters = [100,150,200,250,300,350,400]


    for conv_layer in nb_conv:
        for filters in conv_filters:

            print('conv layer : ',conv_layer,'   filter : ',filters)

            model = model(conv_layer,filters)
            training_generator,validation_generator = data_generation_on_the_fly()

            history = model.fit_generator(generator=training_generator,validation_data=validation_generator,use_multiprocessing=True,
                    workers=6)



            plt.subplot(211) 

            plt.plot(history.history['acc'])  
            plt.plot(history.history['val_acc'])  
            plt.title('model accuracy')  
            plt.ylabel('accuracy')  
            plt.xlabel('epoch')  
            plt.legend(['train', 'test'], loc='upper left')  

            plt.subplot(212)  
            plt.plot(history.history['loss'])  
            plt.plot(history.history['val_loss'])  
            plt.title('model loss')  
            plt.ylabel('loss')  
            plt.xlabel('epoch')  
            plt.legend(['train', 'test'], loc='upper left')  

            completename_acc = path_for_figs + '/' + str(conv_layer) + '_' + str(filters) + '.png'
            plt.savefig(completename_acc)
            plt.close()
            print('time for next iteration')

            keras.backend.clear_session()

Поэтому, когда мой conv_layer равен 2, а conv_filters равен 150 (это вторая итерация), он выдает мне ошибку


Traceback (most recent call last):
  File "model.py", line 126, in <module>
    model = model(conv_layer,filters)
TypeError: __call__() takes 2 positional arguments but 3 were given

Может кто-нибудь объяснить, почему я получаю эту ошибку, потому что она работает дляпервая итерация, когда conv_layer равен 2, а conv_filters равен 100? Мы будем признательны за понимание.

1 Ответ

1 голос
/ 06 ноября 2019

Здесь конфликт имен. Переименуйте функцию вашей модели, чтобы ее можно было отличить от вашей истинной модели

измените

def model(conv_layer,filters):

на

def get_model(conv_layer,filters):
    ....
...