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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2614閲覧

Python UnboundLocalError: local variable 'batch_x' referenced before assignment

SuzuAya

総合スコア71

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/09/08 07:09

編集2019/09/08 08:09

前提・実現したいこと

以下のサイトを参考に、自作のgeneratorを作成しました。
https://qiita.com/koshian2/items/909360f50e3dd5922f32
しかし、コードを実行してみると、以下のようなエラーが発生してしまいますが、どう修正したらいいかわからず困っております。
お手数をお掛けするのですが、修正方法についてお分かりの方がいらっしゃいましたら教えていただけないでしょうか。
どうぞよろしくお願いいたします。

while True:
40 batch_x_2, batch_y_2 = next(batches)
---> 41 m1, m2 = batch_x.shape[0], batch_x_2.shape[0]
42 if m1 < m2:
43 batch_x_2 = batch_x_2[:m1]

UnboundLocalError: local variable 'batch_x' referenced before assignment

該当のソースコード

Python

1# model構築の準備 2import keras 3from keras.models import Model 4from keras.layers import Dense, GlobalAveragePooling2D,Input,Dropout,Activation 5from keras.preprocessing.image import ImageDataGenerator 6from keras import applications 7from keras.preprocessing.image import ImageDataGenerator 8from keras.optimizers import Adam 9from keras.callbacks import CSVLogger,EarlyStopping 10import numpy as np 11from keras import backend as K 12from keras.engine.topology import Layer 13import numpy as np 14import tensorflow as tf 15from keras.preprocessing.image import load_img, img_to_array, array_to_img 16import os 17import matplotlib.pyplot as plt 18%matplotlib inline 19 20 21class MyImageDataGenerator(ImageDataGenerator): 22 def __init__(self, featurewise_center = False, samplewise_center = False, 23 featurewise_std_normalization = False, samplewise_std_normalization = False, 24 zca_whitening = False, zca_epsilon = 1e-06, rotation_range = 0.0, width_shift_range = 0.0, 25 height_shift_range = 0.0, brightness_range = None, shear_range = 0.0, zoom_range = 0.0, 26 channel_shift_range = 0.0, fill_mode = 'nearest', cval = 0.0, horizontal_flip = False, 27 vertical_flip = False, rescale = None, preprocessing_function = None, data_format = None, validation_split = 0.0, 28 random_crop = None, mix_up_alpha = 0.0): 29 # 親クラスのコンストラクタ 30 super().__init__(featurewise_center, samplewise_center, featurewise_std_normalization, samplewise_std_normalization, zca_whitening, zca_epsilon, rotation_range, width_shift_range, height_shift_range, brightness_range, shear_range, zoom_range, channel_shift_range, fill_mode, cval, horizontal_flip, vertical_flip, rescale, preprocessing_function, data_format, validation_split) 31 # 拡張処理のパラメーター 32 # Mix-up 33 assert mix_up_alpha >= 0.0 34 self.mix_up_alpha = mix_up_alpha 35 # Mix-up 36 # 参考 https://qiita.com/yu4u/items/70aa007346ec73b7ff05 37 def mix_up(self, X1, y1, X2, y2): 38 assert X1.shape[0] == y1.shape[0] == X2.shape[0] == y2.shape[0] 39 batch_size = X1.shape[0] 40 l = np.random.beta(self.mix_up_alpha, self.mix_up_alpha, batch_size) 41 X_l = l.reshape(batch_size, 1, 1, 1) 42 y_l = l.reshape(batch_size, 1) 43 X = X1 * X_l + X2 * (1-X_l) 44 y = y1 * y_l + y2 * (1-y_l) 45 return X, y 46 47 def flow_from_directory(self, directory, target_size = (299,299), color_mode = 'rgb', 48 classes = None, class_mode = 'categorical', batch_size = 12, shuffle = True, 49 seed = None, save_to_dir = None, save_prefix = '', save_format = 'png', 50 follow_links = False, subset = None, interpolation = 'nearest'): 51 # 親クラスのflow_from_directory 52 batches = super().flow_from_directory(directory, target_size, color_mode, classes, class_mode, batch_size, shuffle, seed, save_to_dir, save_prefix, save_format, follow_links, subset, interpolation) 53 # 拡張処理 54 while True: 55 if self.mix_up_alpha > 0: 56 while True: 57 batch_x_2, batch_y_2 = next(batches) 58 m1, m2 = batch_x.shape[0], batch_x_2.shape[0] 59 if m1 < m2: 60 batch_x_2 = batch_x_2[:m1] 61 batch_y_2 = batch_y_2[:m1] 62 break 63 elif m1 == m2: 64 break 65 batch_x, batch_y = self.mix_up(batch_x, batch_y, batch_x_2, batch_y_2) 66 # 返り値 67 yield (batch_x, batch_y) 68 69train_dir = './train' 70validation_dir = './validation' 71 72train_datagen = MyImageDataGenerator( 73 rescale=1/255.0, 74 mix_up_alpha=0.2, 75 #rotation_range=8, 76 horizontal_flip=True) 77 78train_generator=train_datagen.flow_from_directory( 79 train_dir, 80 target_size=(299,299), 81 batch_size=12,#25, 82 class_mode='categorical', 83 shuffle=True) 84 85 86validation_datagen=ImageDataGenerator(rescale=1.0/255.) 87 88validation_generator=validation_datagen.flow_from_directory( 89 validation_dir, 90 target_size=(299,299), 91 batch_size=12,#25, 92 class_mode='categorical', 93 shuffle=True) 94 95 96batch_size = 12 97 98base_model=keras.applications.inception_resnet_v2.InceptionResNetV2(input_shape=(299,299,3), 99 weights='imagenet', 100 include_top=False) 101 102x = base_model.output 103x = GlobalAveragePooling2D()(x) 104x = Dense(1024, activation='relu')(x) 105predictions = Dense(4, activation='softmax')(x) 106model = Model(inputs=base_model.input,outputs=predictions) 107 108model.summary() 109 110 111model.compile(optimizer=Adam(lr=0.001), 112 loss='categorical_crossentropy', 113 metrics=['accuracy']) 114 115callbacks_list = [ 116 callbacks.ModelCheckpoint( 117 filepath="model.ep{epoch:02d}.h5",#delsavepath, 118 save_best_only=True), 119 120 #バリデーションlossが改善しなくなったら学習率を変更する 121callbacks.ReduceLROnPlateau( 122 monitor="val_loss", 123 factor=0.8, 124 patience=5, 125 verbose=1)]#, 126 127#callbacks.EarlyStopping(monitor='val_loss', patience=7, verbose=1)] 128 129model.fit_generator(train_generator, steps_per_epoch=7208, epochs=10, validation_steps=1805, validation_data=validation_generator, callbacks=callbacks_list) 130

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2019/09/08 08:58

参考にされたサイトの「そのままのコード」では動いたのでしょうか?
SuzuAya

2019/09/08 10:40

>meg様 ご確認ありがとうございます。 参考サイトにはコード全文が載っておらず、動作について確認ができておりません。
guest

回答2

0

パット見た感じではbatch_xが問題の行に到達するまでに一度も設定されていません。

参考サイトのコメント欄に修正がいると書いてありますがそれを取り込んでみてはどうですか?
それをいれるとbatch_xbatch_yが初期化されるみたいです。

投稿2019/09/08 12:32

nomuken

総合スコア1627

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SuzuAya

2019/09/08 13:06

>nomuken様 ご回答ありがとうございます!ご指摘いただいた内容でうまくいくことができました. 今回は,m3yrin様から先に同様のご回答をいただいていたため,ベストアンサーはそちらとさせていただきましたが,大変助かりました.ありがとうございました.
guest

0

ベストアンサー

お疲れさまです。もとのQiitaの記事に該当のエラーに関連すると思われるコメントがあったので、確認してみてください。

https://qiita.com/koshian2/items/909360f50e3dd5922f32

daisukelab

ありがとうございます。一つ問題があり、下記のような修正が必要でしたのでご連絡致します。

while True:
batch_x, batch_y = next(batches) # <-- 追加が必要ですね
if self.mix_up_alpha > 0:

投稿2019/09/08 12:24

m3yrin

総合スコア132

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SuzuAya

2019/09/08 13:04

>m3yrin様 該当のサイトまで確認して頂き,ありがとうございます. 追加したところ,うまくいきました! 今後サイトのコードを引用してエラーが発生したときは,コメント欄まで確認するように致します. 本当に助かりました.ありがとうございました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問