前提・実現したいこと
以下のサンプルコードを参考に、自前のデータセットで実装をしたいと考えています。
サンプルコード
サンプルコードではfit関数を使っていましたが、自前のデータセットが大容量のため、fit_generator関数に書き換え実行したところ、以下のようなエラーが発生してしまいました。
とても基本的な質問となってしまいますが、generatorを使って学習を行う場合、どうすればX_trainやY_trainを定義できるのかご教示いただけないでしょうか。
説明に不足している点がありましたらお手数ですがお知らせいただけますと幸いです。
どうぞよろしくお願いいたします。
発生している問題・エラーメッセージ
NameError Traceback (most recent call last) <ipython-input-12-c5e53abddd3d> in <module> 5 #L2-SoftmaxLoss 6 print("L2-SoftmaxLoss training...") ----> 7 model0 = train_L2(X_train, to_categorical(Y_train), 4, 50) 8 9 # roc graph NameError: name 'X_train' is not defined
該当のソースコード
Python
1import keras 2from keras.models import Model 3from keras.layers import Dense, GlobalAveragePooling2D,Input,Dropout,Activation 4from keras import applications 5from keras.preprocessing.image import ImageDataGenerator 6from keras.optimizers import Adam 7from keras.callbacks import CSVLogger,EarlyStopping 8import numpy as np 9from keras import backend as K 10from keras.engine.topology import Layer 11import numpy as np 12import tensorflow as tf 13from keras.preprocessing.image import load_img, img_to_array, array_to_img 14import os 15import matplotlib.pyplot as plt 16%matplotlib inline 17 18os.environ["CUDA_VISIBLE_DEVICES"]="2"#specify GPU 19 20#学習データの準備 21class train_Generator_xandy(object): # rule1 22 def __init__(self): 23 datagen = ImageDataGenerator(rescale=1.0/255.) 24 25 train_generator=datagen.flow_from_directory( 26 train_dir, 27 target_size=(299,299), 28 batch_size=12,#25, 29 class_mode='categorical', 30 shuffle=True) 31 32 self.gene = train_generator 33 34 def __iter__(self): 35 # __next__()はselfが実装してるのでそのままselfを返す 36 return self 37 38 def __next__(self): 39 X, Y = self.gene.next() 40 return X, Y 41 42class val_Generator_xandy(object): 43 def __init__(self): 44 validation_datagen=ImageDataGenerator(rescale=1.0/255.) 45 46 validation_generator=validation_datagen.flow_from_directory( 47 validation_dir, 48 target_size=(299,299), 49 batch_size=12,#25, 50 class_mode='categorical', 51 shuffle=True) 52 53 self.gene = validation_generator 54 55 def __iter__(self): 56 # __next__()はselfが実装してるのでそのままselfを返す 57 return self 58 59 def __next__(self): 60 X, Y = self.gene.next() 61 return X, Y 62 63 64train_dir = './train' 65validation_dir = './validation' 66train_generator = train_Generator_xandy() 67val_generator = val_Generator_xandy() 68 69#model構築 70input_shape = (299, 299, 3) 71 72classes = 4#10 73batchsize = 12#128 74#alpha = 0.5 75def train_L2(x, y, classes, epochs, batchsize=12): 76 base_model=keras.applications.inception_resnet_v2.InceptionResNetV2(input_shape=input_shape, 77 weights='imagenet', 78 include_top=False) 79 80 c = base_model.output 81 c = GlobalAveragePooling2D()(c) 82 c = keras.layers.Lambda(lambda xx: 5*(xx)/K.sqrt(K.sum(xx**2)))(c) #metric learning 83 c = Dense(classes, activation='softmax')(c) 84 model = Model(inputs=base_model.input,outputs=c) 85 86 #model.summary() 87 88 model.compile(loss='categorical_crossentropy', 89 #optimizer=Adam(lr=0.001), 90 #optimizer=SGD(lr=0.01, decay=1e-6, momentum=0.9), 91 optimizer=SGD(lr=5e-4, decay=0.00005), 92 metrics=['accuracy']) 93 94 callbacks_list = [ 95 callbacks.ModelCheckpoint( 96 filepath="model.simple.InceptionResNetV2.P5.SGD.a0.5.ep{epoch:02d}.h5",#delsavepath, 97 save_weights_only=False, 98 save_best_only=True), 99 100 callbacks.EarlyStopping(monitor='val_loss', patience=5, verbose=1)] 101 102 103 history = model.fit_generator(train_generator, steps_per_epoch=8072, epochs=30, 104 validation_steps=952, validation_data=validation_generator, 105 callbacks=callbacks_list) 106 107 return model 108 109def plot_roc(model0, train, test_normal, test_anomaly, name, layer1, layer2, layer3, layer4, layer5): 110 #層削除 get score 111 Z1_1, Z2_1 = model_modify(model0, train, test_normal, test_anomaly, layer1) 112 Z1_2, Z2_2 = model_modify(model0, train, test_normal, test_anomaly, layer2) 113 Z1_3, Z2_3 = model_modify(model0, train, test_normal, test_anomaly, layer3) 114 Z1_4, Z2_4 = model_modify(model0, train, test_normal, test_anomaly, layer4) 115 Z1_5, Z2_5 = model_modify(model0, train, test_normal, test_anomaly, layer5) 116 117 auc1 = roc(Z1_1, Z2_1, "L2 SoftmaxLoss") 118 auc2 = roc(Z1_2, Z2_2, "block_16_project_BN") 119 auc3 = roc(Z1_3, Z2_3, "block_14_project_BN") 120 auc4 = roc(Z1_4, Z2_4, "block_12_project_BN") 121 auc5 = roc(Z1_5, Z2_5, "block_10_project_BN") 122 plt.legend() 123 plt.title(name + '(ROC)') 124 plt.xlabel('False Positive Rate') 125 plt.ylabel('True Positive Rate') 126 plt.grid(True) 127 128 return auc1, auc2, auc3, auc4, auc5, Z2_3 # 異常サンプルだけあとで可視化 129 130#学習 131result1, result2, result3, result4, result5, = [], [], [], [], [] 132 133for i in range(10): 134 print("Try:",i+1,"/10") 135 #L2-SoftmaxLoss 136 print("L2-SoftmaxLoss training...") 137 model0 = train_L2(X_train, to_categorical(Y_train), 4, 50) 138