前提・実現したいこと
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
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/04 16:53 編集
2020/11/04 22:25
2020/11/05 07:06 編集