初めて質問させていただきます。
私はPythonで画像に関する深層学習を勉強も兼ねて初心者なりに行っている者なのですが、その実行結果についてわからないことがあり、今回こちらで質問いたしました。
ご教授頂けますと幸いです、どうぞよろしくお願いいたします。
私は現在、画面一番下のソースコードを使用し、Google ColaboratoryとJupyter上で深層学習を動かしているのですが、
それぞれの環境で学習した2つのモデルが、恐らく全く異なったものになっているといった問題が起きています。
具体的には、ealry stoppingも使用し、各々モデルの学習を進めた際の抜粋した段階的な結果が、以下のようになっております。
Google Colaboratoryの場合:
Epoch 1/100
3/3 [===========] - 23s 6s/step - loss: 3.8230 - accuracy: 0.4375 - val_loss: 2.6128 - val_accuracy: 0.5000
Epoch 2/100
3/3 [===========] - 17s 5s/step - loss: 2.6188 - accuracy: 0.4741 - val_loss: 1.0412 - val_accuracy: 0.5000
...
Epoch 69/100
3/3 [===========] - 17s 5s/step - loss: 0.2823 - accuracy: 0.9120 - val_loss: 0.4176 - val_accuracy: 0.7833
Epoch 70/100
3/3 [===========] - 17s 5s/step - loss: 0.2613 - accuracy: 0.9159 - val_loss: 0.5028 - val_accuracy: 0.8000
Epoch 71/100
3/3 [===========] - 17s 5s/step - loss: 0.2283 - accuracy: 0.9517 - val_loss: 0.4454 - val_accuracy: 0.7333
Epoch 00071: early stopping
Jupyterの場合:
Epoch 1/100
4/3 [===========] - 28s 7s/step - loss: 1.5470 - accuracy: 0.5333 - val_loss: 0.7188 - val_accuracy: 0.4667
Epoch 2/100
4/3 [===========] - 17s 4s/step - loss: 0.6885 - accuracy: 0.5750 - val_loss: 0.7233 - val_accuracy: 0.5167
...
Epoch 16/100
4/3 [===========] - 18s 5s/step - loss: 0.3899 - accuracy: 0.8833 - val_loss: 1.0496 - val_accuracy: 0.5167
Epoch 17/100
4/3 [===========] - 18s 5s/step - loss: 0.4316 - accuracy: 0.8083 - val_loss: 0.7981 - val_accuracy: 0.5033
Epoch 18/100
4/3 [===========] - 17s 4s/step - loss: 0.4079 - accuracy: 0.8083 - val_loss: 1.3481 - val_accuracy: 0.5167
Epoch 00018: early stopping
このように特にJupyter上で深層学習を実行した際に、恐らく検証データについて学習が進んでいないのではという問題が生じております。
実際にテストデータを用いて実装モデルの実験を行ったのですが、Jupyterの場合、2クラスに分類したいにも関わらず、学習ができていないためか、一方のクラスにしか予測できないといった結果になりました。
使用しているJupyterの実行環境は、
Google Colaboratoryを動作させている同じCent OS7上で、Python3とJupyterをインストールしたものになっております。
その他の基本的な設定としましては、起動に当たっての最低限のもの以外は特に変更しておりません。
ここまで読んでいただきありがとうございます。
もし上記の問題について、原因や設定の改善点等、お気づきの方がいらっしゃいましたら、お手数おかけいたしますがアドバイス頂けると幸いです。
どうぞよろしくお願いいたします。
使用しているソースコード:(データの参照方法以外は、Google Colaboratory・Jupyter共に以下の同じコードを使用しております。)
python
1import keras 2from keras.layers import Dense, Dropout, InputLayer 3from keras.optimizers import Adam 4import glob 5import argparse 6from PIL import Image 7import numpy as np 8from keras.utils import np_utils 9import os 10import json 11from keras.preprocessing.image import ImageDataGenerator 12from keras.callbacks import ModelCheckpoint 13from keras.callbacks import EarlyStopping 14 15 16#データのロード 17 18import numpy as np 19import glob 20from PIL import Image 21from keras.utils import np_utils 22 23def loaddata(datadir,phase,size,c): 24 if phase == "train": 25 traindir = datadir + "/train/*" 26 valdir = datadir + "/val/*" 27 trainlists = glob.glob(traindir) 28 vallists = glob.glob(valdir) 29 Xtrain = [] 30 Ytrain = [] 31 Xval = [] 32 Yval = [] 33 print(trainlists) 34 35 for i, trainlist in enumerate(trainlists): 36 picturelists = glob.glob(trainlist + "/*") 37 for picturelist in picturelists: 38 img = Image.open(picturelist) 39 data = np.asarray(img) 40 Xtrain.append(data) 41 Ytrain.append(i) 42 Xtrain = np.array(Xtrain) 43 Ytrain = np.array(Ytrain) 44 Xtrain = Xtrain.astype("float32") 45 Xtrain = Xtrain / 255.0 46 Ytrain = np_utils.to_categorical(Ytrain, len(trainlists)) 47 48 for i, vallist in enumerate(vallists): 49 picturelists = glob.glob(vallist + "/*") 50 for picturelist in picturelists: 51 img = Image.open(picturelist) 52 data = np.asarray(img) 53 Xval.append(data) 54 Yval.append(i) 55 Xval = np.array(Xval) 56 Yval = np.array(Yval) 57 Xval = Xval.astype("float32") 58 Xval = Xval / 255.0 59 Yval = np_utils.to_categorical(Yval,len(vallists)) 60 return Xtrain, Ytrain, Xval, Yval 61 else: 62 testdir = datadir + "/test/*" 63 testlists = glob.glob(testdir) 64 Xtest = [] 65 Ytest = [] 66 for i, testlist in enumerate(testlists): 67 picturelists = glob.glob(testlist + "/*") 68 for picturelist in picturelists: 69 img = Image.open(picturelist) 70 data = np.asarray(img) 71 Xtest.append(data) 72 Ytest.append(i) 73 Xtest = np.array(Xtest) 74 Ytest = np.array(Ytest) 75 Xtest = Xtest.astype("float32") 76 Xtest = Xtest / 255.0 77 Ytest = np_utils.to_categorical(Ytest, len(testlists)) 78 return Xtest, Ytest 79 80 81#lossとAccを描画する関数 82 83import matplotlib.pyplot as plt 84 85def plot_history_loss(fit, modelname): 86 plt.plot(fit.history['loss'],label="loss for training") 87 plt.plot(fit.history['val_loss'],label="loss for validation") 88 plt.title('model loss') 89 plt.xlabel('epoch') 90 plt.ylabel('loss') 91 plt.legend(loc='upper right') 92 plt.grid(which="both") 93 plt.close() 94 95def plot_history_acc(fit, modelname): 96 plt.plot(fit.history['acc'],label="accuracy for training") 97 plt.plot(fit.history['val_acc'],label="accuracy for validation") 98 plt.title('model accuracy') 99 plt.xlabel('epoch') 100 plt.ylabel('accuracy') 101 plt.legend(loc='lower right') 102 plt.grid(which="both") 103 plt.close() 104 105 106# モデルを定義する関数(今回はInceptionV3モデルを使用) 107 108from keras.models import Sequential 109from keras.layers.convolutional import Conv2D 110from keras.layers.pooling import MaxPool2D 111from keras.layers.core import Dense, Activation, Dropout, Flatten 112from keras.layers import GlobalAveragePooling2D 113from keras.applications import VGG16, InceptionV3 114from keras import models 115 116def modelInceptionV3(inputh, inputw, c, nb_classes): 117 vgg = InceptionV3(weights="imagenet",include_top=False, 118 input_shape=(inputh, inputw, c)) 119 last = vgg.output 120 model = GlobalAveragePooling2D()(last) 121 #model = Flatten()(last) 122 model = Dense(1024, activation="relu")(model) 123 #model = Dropout(0.5)(model) 124 preds = Dense(nb_classes, activation="softmax")(model) 125 126 returnmodel = models.Model(vgg.input, preds) 127 for layer in vgg.layers: 128 layer.trainable = False 129 #print(returnmodel.summary()) 130 return returnmodel 131 132 133# main関数 134 135if __name__ == '__main__': 136 dirname = "face1" 137 phase = "train" 138 picsize = 256 139 chanel = 3 140 numcategory = 2 141 epoch = 100 142 batch = 32 143 opt = "Adam" 144 name = "train" 145 rotation = 3 146 width_shift = 0.01 147 height_shift = 0.01 148 149 if phase == "train": 150 #os.mkdir("./"+name) 151 Xtrain, Ytrain, Xval, Yval = loaddata(dirname, phase, picsize, chanel) 152 early_stopping = EarlyStopping(monitor='val_loss', patience=10, verbose=1) 153 datagen = ImageDataGenerator(rescale=1.0 / 255, rotation_range=rotation, 154 width_shift_range=width_shift, 155 height_shift_range=height_shift, 156 horizontal_flip=True) 157 test_datagen = ImageDataGenerator(rescale=1.0 / 255) 158 datagen.fit(Xtrain) 159 print(len(Xtrain)) 160 train_generator = datagen.flow_from_directory(dirname+'/train', 161 target_size=(picsize, picsize), 162 batch_size=batch, 163 class_mode='categorical',classes=['0', '1'], 164 shuffle=True, color_mode='rgb') 165 val_generator = test_datagen.flow_from_directory(dirname+'/val', 166 target_size=(picsize, picsize), 167 batch_size=batch, 168 class_mode='categorical',classes=['0', '1'], 169 shuffle=True, color_mode='rgb') 170 model = modelInceptionV3(picsize, picsize, chanel, numcategory) 171 model.compile(loss="categorical_crossentropy", 172 optimizer='adam', 173 metrics=['accuracy']) 174 cp = ModelCheckpoint(filepath=name+"/weights{epoch:04d}.h5", 175 monitor='val_loss', 176 verbose=1, 177 save_best_only=True, 178 save_weights_only=True, 179 mode="min", 180 period=1) 181 modelhistory = model.fit_generator(train_generator, steps_per_epoch=len(Xtrain)/batch, epochs=epoch, verbose=1, 182 validation_data=val_generator, validation_steps=len(Xval)/batch, callbacks=[early_stopping],) 183 plot_history_loss(modelhistory, name) 184 with open(name+"/history.json","w") as f: 185 json.dump(modelhistory.history, f) 186 model.save_weights('param.hdf5') 187 else: 188 Xtest, Ytest = loaddata(dirname, phase) 189 print(Xtest[0]) 190 191 192# ~ モデルの学習後 〜 193# モデルのテスト: 194 195import glob 196p = glob.glob(dirname + "/test/1/*.png") 197#print(p) 198cnt = 0 199for i in p: 200 img = Image.open(i) 201 data = np.asarray(img) 202 data = np.resize(data, (1, 256, 256, 3)).astype("float32") 203 data = data / 255.0 204 predictions = model.predict(data) 205 #print(predictions) 206 print(str(np.argmax(max(predictions)))+":"+str(max(max(predictions)))) 207 if np.argmax(max(predictions)) == 1: 208 cnt += 1 209print(str(cnt)+"/"+str(len(p)))
あなたの回答
tips
プレビュー