質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.49%

Python 3 UnboundLocalError: local variable 'callbacks' referenced before assignmentについて

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,343

score 59

前提・実現したいこと

以下のエラーの解消方法について教えていただきたいです。
調べると、ローカル変数内でcallbackを定義していることが影響しているようなのですが、どのように修正すればよいか分からず、こちらに質問をさせていただきました。
お手数をおかけいたしますがどうぞよろしくお願い致します。

発生している問題・エラーメッセージ

UnboundLocalError: local variable 'callbacks' referenced before assignment

該当のソースコード

import keras
from keras.applications.inception_v3 import InceptionV3
from keras.optimizers import Adam, SGD
from keras.models import Model
from keras.layers import GlobalAveragePooling2D, Dense
from keras import backend as K
from keras.callbacks import CSVLogger,EarlyStopping, ModelCheckpoint
from sklearn.neighbors import LocalOutlierFactor
from sklearn import metrics
from sklearn.preprocessing import MinMaxScaler


input_shape = (299, 299, 3)
classes = 4#10
batchsize = 12#128

def train_and_evaluate(number):#, anomaly=True):
    print("Model build...")

    model = InceptionV3(include_top=True, input_shape=input_shape, weights='imagenet')

    # 最終層削除
    model.layers.pop()
    model = Model(inputs=model.input,outputs=model.layers[-1].output)

    # L2層と全結合層を付ける
    c = keras.layers.Lambda(lambda xx: 5*(xx)/K.sqrt(K.sum(xx**2)))(model.output) #metric learning
    c = Dense(classes, activation='softmax')(c)
    model = Model(inputs=model.input,outputs=c)

    #model.summary()

    model.compile(loss='categorical_crossentropy',
                  optimizer=Adam(lr=0.0001, amsgrad=True),
                  metrics=['accuracy'])

    print(number,"training...")

    callbacks = callbacks.ModelCheckpoint(filepath="model.ep{epoch:02d}.h5",save_best_only=True)#,

    hist = model.fit_generator(train_generator, steps_per_epoch=8072, epochs=1, 
                               validation_steps=952, validation_data=validation_generator, callbacks=callbacks)

    # 最終層削除
    model.layers.pop()
    model = Model(inputs=model.input,outputs=model.layers[-1].output)

    train = model.predict(train_generator[57173:])
    test_normal = model.predict(x_test_normal)
    test_anomaly = model.predict(x_test_anomaly)

    train = train.reshape((len(train),-1))
    test_normal = test_normal.reshape((len(x_test_normal),-1))
    test_anomaly = test_anomaly.reshape((len(x_test_anomaly),-1))

    #0-1変換
    ms = MinMaxScaler()
    train = ms.fit_transform(train)
    test_normal = ms.transform(test_normal)
    test_anomaly = ms.transform(test_anomaly)

    # LOF
    clf = LocalOutlierFactor(n_neighbors=5)
    y_pred = clf.fit(train)

    # plot the level sets of the decision function
    Z1 = -clf._decision_function(test_normal)
    Z2 = -clf._decision_function(test_anomaly)

    #ROC曲線の描画
    y_true = np.zeros(len(test_normal)+len(test_anomaly))
    y_true[len(test_normal):] = 1#0:正常、1:異常

    # FPR, TPR(, しきい値) を算出
    fpr, tpr, _ = metrics.roc_curve(y_true, np.hstack((Z1, Z2)))

    # AUC
    auc = metrics.auc(fpr, tpr)

    # ROC曲線をプロット
    plt.plot(fpr, tpr, label='metric learning(AUC = %.2f)'%auc)
    plt.legend()
    plt.title(str(number)+'ROC curve')
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    plt.grid(True)
    plt.show()

for i in range(10):
    train_and_evaluate(i+1)
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

from keras.callbacks import CSVLogger,EarlyStopping, ModelCheckpoint

このように import しているので、ModelCheckpoint クラスを利用する際は以下のようにするべきではないでしょうか。

- callbacks = callbacks.ModelCheckpoint(filepath="model.ep{epoch:02d}.h5",save_best_only=True)
+ callbacks = ModelCheckpoint(filepath="model.ep{epoch:02d}.h5",save_best_only=True)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/22 18:09

    >tiitoi様 
    いただいたご回答をもとに、最終的に以下の通りにしたところうまくいきました。
    hist = model.fit_generator(train_generator, steps_per_epoch=8072, epochs=1,
    validation_steps=952, validation_data=validation_generator, callbacks=[ModelCheckpoint(filepath="model.ep{epoch:02d}.h5",save_best_only=True)])
    いつもありがとうございます。本当に助かります。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る