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

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

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

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

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python

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

Q&A

解決済

2回答

4765閲覧

fit_generatorで学習させたいが、TypeError: 'NoneType' object is not callable により動作しない

Sparrow42

総合スコア36

Keras

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

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python

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

0グッド

0クリップ

投稿2020/11/04 14:05

編集2020/11/05 07:10

前提・実現したいこと

kerasのmodel.fit_generatorによって画像データを学習させたいと考えています。
fit_generatorを実行した際に、以下のようなエラーメッセージが発生します。

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

TypeError Traceback (most recent call last) <ipython-input-67-1b470d28ac00> in <module> 1 print(type(train_gen)) 2 #fit_generator(self, generator, steps_per_epoch=None, epochs=1, verbose=1, callbacks=None, validation_data=None, validation_steps=None, class_weight=None, max_queue_size=10, workers=1, use_multiprocessing=False, shuffle=True, initial_epoch=0) ----> 3 history = model.fit_generator(train_gen, epochs=epochs, steps_per_epoch = steps_per_epoch, validation_data = val_gen, validation_steps = validation_steps) 4 #callbacks=[es_cb, cp_cb], ~\anaconda3\lib\site-packages\tensorflow\python\util\deprecation.py in new_func(*args, **kwargs) 322 'in a future version' if date is None else ('after %s' % date), 323 instructions) --> 324 return func(*args, **kwargs) 325 return tf_decorator.make_decorator( 326 func, new_func, 'deprecated', ~\anaconda3\lib\site-packages\tensorflow\python\keras\engine\training.py in fit_generator(self, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, validation_freq, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch) 1813 """ 1814 _keras_api_gauge.get_cell('fit_generator').set(True) -> 1815 return self.fit( 1816 generator, 1817 steps_per_epoch=steps_per_epoch, ~\anaconda3\lib\site-packages\tensorflow\python\keras\engine\training.py in _method_wrapper(self, *args, **kwargs) 106 def _method_wrapper(self, *args, **kwargs): 107 if not self._in_multi_worker_mode(): # pylint: disable=protected-access --> 108 return method(self, *args, **kwargs) 109 110 # Running inside `run_distribute_coordinator` already. ~\anaconda3\lib\site-packages\tensorflow\python\keras\engine\training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_batch_size, validation_freq, max_queue_size, workers, use_multiprocessing) 1096 batch_size=batch_size): 1097 callbacks.on_train_batch_begin(step) -> 1098 tmp_logs = train_function(iterator) 1099 if data_handler.should_sync: 1100 context.async_wait() ~\anaconda3\lib\site-packages\tensorflow\python\eager\def_function.py in __call__(self, *args, **kwds) 778 else: 779 compiler = "nonXla" --> 780 result = self._call(*args, **kwds) 781 782 new_tracing_count = self._get_tracing_count() ~\anaconda3\lib\site-packages\tensorflow\python\eager\def_function.py in _call(self, *args, **kwds) 805 # In this case we have created variables on the first call, so we run the 806 # defunned version which is guaranteed to never create variables. --> 807 return self._stateless_fn(*args, **kwds) # pylint: disable=not-callable 808 elif self._stateful_fn is not None: 809 # Release the lock early so that multiple threads can perform the call TypeError: 'NoneType' object is not callable

該当のソースコード

関連のあるコードを抜粋して書きます。

Python

1batch_size = 8 2epochs = 20 3 4load_dir_prefix = 'C:/Users/furu/Documents/HSCvideo/npy_files/classifydata/' 5npy_classify_list = os.listdir(load_dir_prefix + 'train_edge') 6 7# DnCNN作成(追記しました) 8input_img = Input(shape=(height, width, 6)) 9 10x = Conv2D(64, (3, 3), padding='same')(input_img) 11x = Activation('relu')(x) 12 13for i in range(15): 14 x = Conv2D(72, (3, 3),strides=(1, 1), padding='same', use_bias=True)(x) 15 x = BatchNormalization()(x) 16 x = Activation('relu')(x) 17 18x = Conv2D(1, (3, 3), padding='same')(x) 19output_img = Activation('tanh')(x) 20 21model = Model(input_img, output_img) 22model.compile(optimizer='adam', loss='mean_squared_error') 23 24#GENERATOR作成 25def get_generator(mode): 26 if(mode == 'train' or mode == 'test'): 27 for npy_name in npy_classify_list: 28 npy_edge = np.load(load_dir_prefix + mode +'_edge/' + npy_name) 29 npy_mid = np.load(load_dir_prefix + mode +'_mid/' + npy_name) 30 31 npy_edge = npy_edge.astype('float32') 32 npy_mid = npy_mid.astype('float32') 33 npy_edge /= 255 34 npy_mid /= 255 35 36 for i in range(npy_edge.shape[0]): 37 yield (npy_edge[i].reshape(1, height, width, 6), npy_mid[i].reshape(1, height, width, 1)) 38 39train_gen = get_generator('train') 40val_gen = get_generator('test') 41 42#steps_per_epoch, validation_stepsを作成 43train_len = 0 44test_len = 0 45for npy_name in npy_classify_list: 46 npy_train = np.load(load_dir_prefix + 'train_mid/' + npy_name) 47 npy_test = np.load(load_dir_prefix + 'test_mid/' + npy_name) 48 train_len += npy_train.shape[0] 49 test_len += npy_test.shape[0] 50 print(npy_name, "finish") 51 52steps_per_epoch = train_len // batch_size 53validation_steps = test_len // batch_size 54 55history = model.fit_generator(train_gen, epochs=epochs, steps_per_epoch = steps_per_epoch, validation_data = val_gen, validation_steps = validation_steps)

試したこと

エラー文では、TypeError: 'NoneType' object is not callableとあったので、主に以下の2点を中心に調べました。

  • train_gen, val_genのtypeが'NoneType'となっているか
  • train_gen, val_genがcallableであるか

まず、generatorとして動作していることは確認できました。

Python

1for i in val_gen: 2 print(i[1].shape) 3#result-> 4#(1, 128, 288, 1) 5#(1, 128, 288, 1) 6#(1, 128, 288, 1) 7#(1, 128, 288, 1) 8#(1, 128, 288, 1) 9#...

fit_generator引数の数値、type、callableを調べました。fit_generatorの直前で実行しました。

Python

1print(steps_per_epoch) # -> 4028 2print(validation_steps) # -> 1091 3print(type(train_gen)) # -> <class 'generator'> 4print(type(val_gen)) # -> <class 'generator'> 5print(callable(train_gen)) # -> False 6print(callable(val_gen)) # -> False 7print(callable(get_generator('test'))) # -> False 8print(callable(get_generator('train'))) # -> False

generatorなのにcallable=falseという結果となり、手詰まりになりました。
何か原因等が分かりましたら、ご教授いただきたく存じます。

###(※追記※)追加で試したこと
model.fit_generator自体のtypeとcallableについても調べました。

Python

1print(callable(model.fit_generator)) # -> True 2print(type(model.fit_generator)) # -> <class 'method'>

補足情報(FW/ツールのバージョンなど)

Python 3.8.3
keras 2.4.3
Jupyter Notebook 6.0.3

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

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

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

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

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

guest

回答2

0

model.fit_generatorがNoneなのではないかと。

投稿2020/11/04 14:59

y_waiwai

総合スコア87774

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

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

Sparrow42

2020/11/04 16:53 編集

ご回答ありがとうございます。 なぜそう思われるのでしょうか? model.fit_generatorがNoneType(=not callable, 返り値なし)と考えると、model.fit_generatorの引数が適切でないということでしょうか? (念のためですが、modelの定義は既にされています。)
y_waiwai

2020/11/04 22:25

> TypeError: 'NoneType' object is not callable Noneタイプは呼び出しできない、といってますんで、Noneタイプを実行させようとしてるってことですね こうしてるはず、こうなってるはず、というのをいくら強弁したところで目の前のエラーはなくなってくれませんよ。 実際に、modelとかmodel.fit_generatorになにがはいってるのか確認してみてはどうでしょう
Sparrow42

2020/11/05 07:06 編集

model.fit_generatorについて調べました。試したことに追記しましたのでご確認願います。 ソースコードもこれから確認します。 (追)エラー文に従ってfit_generatorのソースコードを追ってみましたが、fit_generatorがNoneTypeである旨の記述は見つかりませんでした。 1つ質問です。model.fit_generatorがNoneTypeであるならば、それはどのような原因でNoneTypeになっていると考えられますか? 私が思いつく限りだと、①引数が不適切、②modelの設定が不適切、の2点です。 コードを追う中で、fitのtmp_logs = train_function(iterator)(エラー文下から3つ目)からバグが発生しているように見えるので、iteratorに原因があるように思いました。train_functionの中身も追ってみましたが、そこから先は理解が及びませんでした。
guest

0

自己解決

fit_generatorをfitに変えたところ動作しました。原因は不明です。
お忙しい中回答していただき、ありがとうございました。

投稿2020/11/05 07:21

Sparrow42

総合スコア36

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問