前提
三項目の分類をしようとしており、三項目の内一つだけ正規化し他の二項目はいろいろな変換処理をできるようにしたいです。
実現したいこと
・ImageDatageneratorの変換を行う項目と行わない項目を作る
発生している問題・エラーメッセージ
追記していただいたy[i].argmax()でエラーなく動くようになりました。
しかし、画像にあるよう学習の進行度を表すゲージが表示されておらず1エポックも終わらない状態になってしまいました。
該当のソースコード
python
1import numpy as np 2from PIL import Image 3import tensorflow as tf 4import time 5import matplotlib.pyplot as plt 6# import os 7# os.environ["CUDA_VISIBLE_DEVICES"] = "-1" 8from tensorflow.keras.models import Model 9from tensorflow.keras.preprocessing import image 10from tensorflow.keras.preprocessing.image import ImageDataGenerator 11from tensorflow.keras.optimizers import Adam 12from tensorflow.keras.callbacks import EarlyStopping, LearningRateScheduler,ReduceLROnPlateau, ModelCheckpoint 13 14Image.MAX_IMAGE_PIXELS = None 15 16#-------切り取り定義------- 17def kiritori(img): 18 img_array=np.array(img,dtype='int16') #(50行,83列,3次元)の3次元配列 19 a=np.split(img_array,img.height/50) 20 img_data=np.split(a[0],img.width/50,axis=1)#stackする土台づくり 21 for i in range(len(a)-1): 22 img_data=np.vstack([img_data,np.split(a[i+1],img.width/50,axis=1)]) 23 24 return img_data 25 26#-------切り取り処理(トレーニングデータ)------- 27x_train=kiritori(Image.open('3Gatu_Data/DJI_0708.JPG'))#(#(1200,100,100,3) 28 29train_label=np.loadtxt(fname='label/3Gatu_708_50.csv',delimiter=',',dtype='int16')#(30, 40) 30train_label=np.reshape(train_label,(train_label.size)) #(1200) 31 32a_train_data = x_train[np.where(train_label==0)] 33b_train_data =x_train[np.where(train_label==1)] 34c_train_data =x_train[np.where(train_label==2)] 35 36 37#-------データをまとめる------- 38x_train=a_train_data 39x_train=np.vstack([x_train,b_train_data]) 40x_train=np.vstack([x_train,c_train_data]) 41 42#-------テストデータ処理------- 43val_test=kiritori(Image.open('3Gatu_Data/mai_0330_2022.JPG')) 44 45test_label=np.loadtxt(fname='label/3Gatu_mai_50.csv',delimiter=',',dtype='int16')#(30,40) 46test_label=np.reshape(test_label,(test_label.size)) #(1200) 47 48a_test_data = val_test[np.where(test_label==0)] 49b_test_data = val_test[np.where(test_label==1)] 50c_test_data = val_test[np.where(test_label==2)] 51 52val_test = a_test_data 53val_test = np.vstack([val_test,b_test_data]) 54val_test = np.vstack([val_test,c_test_data]) 55 56y_train=np.full((a_train_data.shape[0],1),0) 57y_train=np.vstack([y_train,np.full((b_train_data.shape[0],1),[1])]) 58y_train=np.vstack([y_train,np.full((c_train_data.shape[0],1),[2])]) 59 60y_test=np.full((a_test_data.shape[0],1),[0]) 61y_test=np.vstack([y_test,np.full((b_test_data.shape[0],1),[1])]) 62y_test=np.vstack([y_test,np.full((c_test_data.shape[0],1),[2])]) 63 64from tensorflow.keras.utils import to_categorical 65y_train = to_categorical(y_train,3) 66y_test = to_categorical(y_test,3) 67 68## 変換処理 69x_datagen_base = ImageDataGenerator( 70 rescale = 1 / 255, 71 dtype = np.float64 72) 73 74 75x_datagen_partial = image.ImageDataGenerator( 76 rescale = 1./255, 77 rotation_range = 180, 78 fill_mode="constant", 79 vertical_flip = True, 80 # brightness_range = [0.7, 1.117], 81 horizontal_flip = True, 82 dtype = np.float64 83 ) 84 85x_train_generator = x_datagen_base.flow(x_train, y_train, batch_size= 13) 86 87val_datagen = image.ImageDataGenerator(rescale=1./ 255) 88val_test_generator = val_datagen.flow(val_test, y_test,batch_size = 13) 89 90def myflow(gen: ImageDataGenerator): 91 for x, y in gen: 92 for i, _x in enumerate(x): 93 if y[i].argmax() != 0: 94 x[i] = x_datagen_base.apply_transform( 95 _x, 96 x_datagen_partial.get_random_transform(_x.shape) 97 ) 98 yield x, y 99 100 101 102 103from tensorflow.python.keras.models import Sequential 104model = Sequential() 105 106from tensorflow.python.keras.layers import Conv2D 107from tensorflow.keras.layers import PReLU 108from tensorflow.python.keras.layers import BatchNormalization 109model.add( #畳み込み 110 Conv2D( 111 filters=64, #出力 112 input_shape=(50,50,3), 113 kernel_size=(3,3), #フィルタサイズ 114 strides=(1,1), 115 padding='valid', 116 kernel_initializer = "he_uniform" 117)) 118 119model.add(BatchNormalization()) 120model.add(PReLU(alpha_initializer=tf.constant_initializer(0.25))) 121 122 123from tensorflow.python.keras.layers import MaxPooling2D 124from tensorflow.python.keras.layers import Dropout 125 126 127model.add(MaxPooling2D(pool_size=(2,2))) #マックスプーリング 128 #ドロップアウト 129 130#追加畳み込み 131model.add( 132 Conv2D( 133 filters =128, 134 kernel_size = (3,3), 135 strides = (1,1), 136 padding = 'valid', 137 kernel_initializer = "he_uniform", 138 )) 139 140model.add(BatchNormalization()) 141model.add(PReLU(alpha_initializer=tf.constant_initializer(0.25))) 142 143 144model.add(MaxPooling2D(pool_size=(2,2))) 145 146 147#追加畳み込み 148model.add( 149 Conv2D( 150 filters = 256, 151 kernel_size = (3,3), 152 strides = (1,1), 153 padding = 'valid', 154 kernel_initializer = "he_uniform", 155 )) 156 157model.add(BatchNormalization()) 158model.add(PReLU(alpha_initializer=tf.constant_initializer(0.25))) 159 160model.add(MaxPooling2D(pool_size=(2,2))) 161 162 163#追加畳み込み 164model.add( 165 Conv2D( 166 filters = 512, 167 kernel_size = (3,3), 168 strides = (1,1), 169 padding = 'valid', 170 kernel_initializer = "he_uniform", 171 )) 172 173model.add(BatchNormalization()) 174model.add(PReLU(alpha_initializer=tf.constant_initializer(0.25))) 175 176model.add(MaxPooling2D(pool_size=(2,2))) 177 178 179from tensorflow.python.keras.layers import Flatten 180model.add(Flatten()) #2次元配列に 181 182from tensorflow.python.keras.layers import Dense 183 184model.add(Dense(units=1536)) 185 186model.add(PReLU(alpha_initializer=tf.constant_initializer(0.25))) 187 188model.add(Dropout(0.5)) 189model.add(Dense(units=3,activation='softmax',name="f3")) 190 191model.summary(); 192 193reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=10, min_lr=0.0001) 194 195model.compile( 196 optimizer = Adam(), #自動で学習率が設定される 197 loss = 'categorical_crossentropy', #多分類のときにしていできる交差エントロピー 198 metrics = ['accuracy'] 199) 200 201history_model = model.fit( 202 myflow(x_train_generator), 203 epochs = 10, 204 validation_data = val_test_generator, 205 validation_steps = None, 206 shuffle = True, 207 callbacks = [reduce_lr] 208 ) 209 210## モデルの保存 211model_json_str = model.to_json() 212open('Output_file/9/cnn_model_3Gatu_50_500.json', 'w').write(model_json_str) 213model.save_weights('Output_file/9/mnist_mlp_3Gatu_50_500_weights2.h5'); 214 215score = model.evaluate( val_test_generator, verbose=0) 216print('Test loss :', score[0]) 217print('Test accuracy :', score[1]) 218 219 220loss = history_model.history['loss'] #訓練データの誤差 221val_loss = history_model.history['val_loss'] #テストデータ誤差 222accuracy = history_model.history['accuracy'] #訓練データの誤差 223val_accuracy = history_model.history['val_accuracy'] #テストデータ誤差
試したこと
myflowの適用をしてみました。
補足情報(FW/ツールのバージョンなど)
windows11(64bit)
anacondaを使用
python 3.8.13
TensorFlow 2.3
Spyder 5.3.3を利用
トレーニングデータはもっとあるのですが、省略させていただきました。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/11/04 12:09
2022/11/06 11:35 編集
2022/11/07 06:24
2022/11/07 07:00 編集
2022/11/07 08:02 編集
2022/11/07 10:22 編集
2022/11/07 11:12
2022/11/07 11:30 編集
2022/11/07 13:43 編集
2022/11/07 14:55
2022/11/08 06:32
2022/11/08 06:53
2022/11/08 06:59