前提
特定のラベルデータだけ正規化のみを行い、それ以外のラベルデータにはImageDataGeneratorを用いたいろいろな変換をさせて学習を行いたいのです。。以前質問した際に上記の変換は実装できたので学習を行ったのですが、トレーニングデータのaccuracyは上がっているのにvalidationデータのaccuracyが上がらず詰まっております。
実現したいこと
・特定のラベルデータだけ正規化のみを行い、それ以外のラベルデータにはImageDataGeneratorを用いたいろいろな変換をさせうまく学習させたい
発生している問題・エラーメッセージ
図のような状態になっています。
該当のソースコード
python
1from random_eraser import get_random_eraser 2 3class MyImageDataGenerator(ImageDataGenerator): 4 def __init__(self, *args, **kwargs): 5 self.random_eraser = get_random_eraser() 6 super().__init__(*args, **kwargs) 7 8 def apply_transform(self, x, transform_parameters): 9 x = self.random_eraser(x) # 先に処理する 10 return super().apply_transform(x, transform_parameters) 11 12x_datagen_partial = MyImageDataGenerator( 13 # rescale = 1./255, 14 rotation_range = 180, 15 fill_mode="constant", 16 vertical_flip = True, 17 brightness_range = [0.7, 1.117], 18 horizontal_flip = True, 19 height_shift_range = 0.1, 20 width_shift_range = 0.1, 21 dtype = np.float64 22) 23 24x_datagen_base = MyImageDataGenerator( 25 horizontal_flip = True, 26 vertical_flip = True, 27 dtype = np.float64 28) 29 30x_train_generator = x_datagen_base.flow(x_train, y_train1, batch_size =16) 31 32def myflow(gen: ImageDataGenerator): 33 for x, y in gen: 34 for i, _x in enumerate(x): 35 if y[i].argmax() != 0: 36 x[i] = x_datagen_partial.random_transform(x[i]) 37 x[i] =x[i].astype("float64")/255 38 39 if y[i].argmax() == 0: 40 x[i] =x[i].astype("float64")/255 41 42 yield x, y 43 44val_datagen = image.ImageDataGenerator(rescale = 1./255,dtype = np.float64) 45val_test_generator = val_datagen.flow(val_test, y_test) 46 47model.compile( 48 optimizer = SGD(lr=1e-4, momentum = 0.9), 49 loss = 'categorical_crossentropy', 50 metrics = ['accuracy'] 51) 52 53 54batch_size = 16 55history_model = model.fit( 56 myflow(x_train_generator), 57 epochs = 100, 58 validation_data = val_test_generator, 59 # validation_data = myflow2(val_test_generator), 60 validation_steps = None, 61 shuffle = True, 62 callbacks = [modelCheckpoint], 63 class_weight =cal_weight(y_train1), 64 steps_per_epoch = int(x_train.shape[0] / batch_size) 65) 66
試したこと
myflowを使わなかったらうまく学習が進むのですが、myflowを使うと学習が進まなくなってしまいます。
補足情報(FW/ツールのバージョンなど)
windows11(64bit)
anacondaを使用
python 3.8.13
TensorFlow 2.3
Spyder 5.3.3を利用
あなたの回答
tips
プレビュー