обратный вызов вызывает ошибку значения

#python #tensorflow #machine-learning

#python #тензорный поток #машинное обучение

Вопрос:

Коды работали нормально в течение последних месяцев, но как-то пошло не так после того, что я сделал, но я не могу его восстановить.

 def bi_LSTM_model(X_train, y_train, X_test, y_test, num_classes, loss,batch_size=68, units=128, learning_rate=0.005,epochs=20, dropout=0.2, recurrent_dropout=0.2):
    
    class myCallback(tf.keras.callbacks.Callback):
        def on_epoch_end(self, epoch, logs={}):
            if (logs.get('acc') > 0.90):
                print("nReached 90% accuracy so cancelling training!")
                self.model.stop_training = True
                
    callbacks = myCallback()

    model = tf.keras.models.Sequential()
    model.add(Masking(mask_value=0.0, input_shape=(X_train.shape[1], X_train.shape[2])))
    model.add(Bidirectional(LSTM(units, dropout=dropout, recurrent_dropout=recurrent_dropout)))
    model.add(Dense(num_classes, activation='softmax'))

    model.compile(loss=loss,
                  optimizer=adamopt,
                  metrics=['accuracy'])

    history = model.fit(X_train, y_train,
                        batch_size=batch_size,
                        epochs=epochs,
                        validation_data=(X_test, y_test),
                        verbose=1,
                        callbacks=[callbacks])

    score, acc = model.evaluate(X_test, y_test,
                                batch_size=batch_size)

    yhat = model.predict(X_test)

    return history, yhat





def duo_bi_LSTM_model(X_train, y_train, X_test, y_test, num_classes, loss,batch_size=68, units=128, learning_rate=0.005,epochs=20, dropout=0.2, recurrent_dropout=0.2):
    
    class myCallback(tf.keras.callbacks.Callback):
        def on_epoch_end(self, epoch, logs={}):
            if (logs.get('acc') > 0.90):
                print("nReached 90% accuracy so cancelling training!")
                self.model.stop_training = True
                     
    callbacks = myCallback()

        
    
    model = tf.keras.models.Sequential()
    model.add(Masking(mask_value=0.0, input_shape=(X_train.shape[1], X_train.shape[2])))
    model.add(Bidirectional(
        LSTM(units, dropout=dropout, recurrent_dropout=recurrent_dropout, return_sequences=True)))
    model.add(Bidirectional(LSTM(units, dropout=dropout, recurrent_dropout=recurrent_dropout)))
    model.add(Dense(num_classes, activation='softmax'))

    model.compile(loss=loss,
                  optimizer=adamopt,
                  metrics=['accuracy'])

    history = model.fit(X_train, y_train,
                        batch_size=batch_size,
                        epochs=epochs,
                        validation_data=(X_test, y_test),
                        verbose=1,
                        callbacks=[callbacks])

    score, acc = model.evaluate(X_test, y_test,
                                batch_size=batch_size)

    yhat = model.predict(X_test)

    return history, yhat

 

В принципе, я определил две модели, и всякий раз, когда запускается вторая, появляется ошибка.

Кстати, я использую tf.keras.backend.clear_session() между моделями.

 ValueError: Tensor("Adam/bidirectional/forward_lstm/kernel/m:0", shape=(), dtype=resource) must be from the same graph as Tensor("bidirectional/forward_lstm/kernel:0", shape=(), dtype=resource).
 

Единственные изменения, которые я когда-либо вносил в коды, заключались в том, что я пытался вывести callback класс из двух моделей и поместить его перед ними, уменьшая избыточность кода.

Комментарии:

1. Где вы определяете оптимизатор? Вне двух функций? Используете ли вы один и тот же оптимизатор для обеих обучающих функций, не переопределяя его? Это может быть причиной ошибки. Попробуйте определить оптимизатор внутри функций раньше model.compile() .

2. @Tinu Это действительно сработало. хотите ли вы опубликовать официальный ответ, чтобы я мог принять ваш ответ. Я переместил оптимизаторы с той же целью, чтобы уменьшить избыточность..

Ответ №1:

Проблема не в функции обратного вызова. Ошибка появляется, потому что вы передаете один и тот же оптимизатор двум разным моделям, что невозможно, поскольку они представляют собой два разных вычислительных графика.

Попробуйте определить оптимизатор внутри функции, где вы определяете модель перед model.compile() вызовом.