概要
メモリ容量を超えた画像を用いて、CNNを学習させるために、以下のプログラムを作成いたしました(抜粋)
その結果、学習がうまく開始できず、Sequenceから継承した"idx"の値や、
本来値が変わるはずのない、"self.length"が変わってしまいます。
また、与えているデータの長さは同じなのですが、最後にデータ数が一致しない結果となっています。
下記を試しましたがうまくいきませんでした。
・validation_data = Noneで実行
・再度プログラム実行 ⇒ idxの値が変化するが同様の挙動を示す
train用とvalidation用で同じclassを使用しており、"idx"と"self.length"の値が
非常に見にくく大変恐縮なのですが、
原因に心当たりがございましたらご教授いただけないでしょうか。
#追記
下記の点は解決いたしました。
・ランダムな"idx"の値について
⇒fit_generatorでshaffle=True(default)のためでした
・"self.length"の値の変化
⇒train_sequenceとval_sequenceのそれぞれで算出していました
・学習が進まない点
⇒self.length = int(np.ceil(DATA_ROW_NUM / float(batch_size)))
とすることで学習可能になりました
#残っている質問
・現在は学習は問題なく進みますが、上記のデータが合わなかった点については
最後にデータ数が一致しなかった理由はまだわかっていません。
#参考
https://qiita.com/simonritchie/items/d7168d1d9cea9ceb6af7
スクリプト
python
1class data_sequence(Sequence): 2 def __init__(self, X_paths, y_data, batch_size, image_size): 3 DATA_ROW_NUM = len(X_paths) 4 5 self.batch_size = batch_size 6 self.X_paths = X_paths 7 self.y_data = y_data 8 self.length = int(math.ceil(DATA_ROW_NUM / batch_size)) 9 self.image_size = image_size 10 11 def __getitem__(self, idx): 12 13 print("idx:", idx) 14 15 start_idx = idx * self.batch_size 16 last_idx = (idx + 1) * self.batch_size 17 18 print("start_idx:" ,start_idx) 19 20 print("self.length:", self.length) 21 22 print("last_idx:", last_idx) 23 24 batch_X = self.X_paths[start_idx:last_idx] 25 batch_y = self.y_data[start_idx:last_idx] 26 27 X = np.array([resize(imread(file_name), (self.image_size, self.image_size)) for file_name in batch_X]) 28 X = X / 255 29 y = np.array(batch_y) 30 31 32 return X, y 33 34 def __len__(self): 35 36 return self.length 37 38 39image_size = 224 40batch_size = 8 41 42# 指定フォルダ内のファイル名読み込み 43X_paths = glob.glob("./(ディレクトリ名)/" + "/*.bmp") 44 45# 画像とラベルをtrain, validation, testで分割 46X_train_paths, X_test_paths, y_train, y_test = train_test_split(X_paths, y_GroundTruth, test_size=0.2, random_state=1) 47X_train_paths, X_val_paths , y_train, y_val = train_test_split(X_train_paths, y_train, test_size=0.2, random_state=1) 48 49 50y_train = to_categorical(y_train) 51y_val = to_categorical(y_val) 52y_test = to_categorical(y_test) 53 54 55model = Sequential() 56 57# 入力画像は224 X 224 X 3 58model.add(Conv2D(16, kernel_size=(5, 5),padding='same', activation='relu', 59 kernel_initializer='he_normal', input_shape=(224, 224, 3))) 60model.add(MaxPooling2D(pool_size=(2, 2))) 61model.add(Conv2D(64, kernel_size=(5, 5),padding='same', activation='relu', 62 kernel_initializer='he_normal')) 63model.add(MaxPooling2D(pool_size=(2, 2))) 64model.add(Conv2D(128, kernel_size=(5, 5),padding='same', activation='relu', 65 kernel_initializer='he_normal')) 66model.add(MaxPooling2D(pool_size=(2, 2))) 67 68model.add(Flatten()) 69model.add(Dense(units=512)) 70model.add(Activation('relu')) 71model.add(Dense(units=256)) 72model.add(Activation('relu')) 73model.add(Dense(units=256)) 74model.add(Activation('relu')) 75model.add(Dense(8, activation='softmax')) 76model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) 77 78 79train_sequence = data_sequence(X_paths=X_train_paths, y_data=y_train, batch_size=batch_size, image_size=image_size) 80val_sequence = data_sequence(X_paths=X_val_paths, y_data=y_val, batch_size=batch_size, image_size=image_size) 81 82history = model.fit_generator(generator=train_sequence, 83 verbose=1, 84 epochs=15, 85 validation_data=None) 86 87model.save('my_model.h5', include_optimizer=False)
結果
python
1Using TensorFlow backend. 2Epoch 1/15idx: 0 3start_idx: 0 4self.length: 39 5last_idx: 8 6 7idx: 71 8start_idx: 568 9self.length: 155 10last_idx: 576 11idx: 1 12start_idx: 8 13self.length: 39 14last_idx: 16 15idx: 2 16start_idx: 16 17self.length: 39 18last_idx: 24 19idx: 23 20start_idx: 184 21self.length: 155 22last_idx: 192 23idx: 38 24start_idx: 304 25self.length: 155 26last_idx: 312 27idx: 3 28start_idx: 24 29self.length: 39 30last_idx: 32 31idx: 90 32start_idx: 720 33self.length: 155 34last_idx: 728 35idx: 4 36start_idx: 32 37self.length: 39 38last_idx: 40 39idx: 144 40start_idx: 1152 41self.length: 155 42last_idx: 1160 43idx: 5 44start_idx: 40 45self.length: 39 46last_idx: 48 47idx: 74 48start_idx: 592 49self.length: 155 50last_idx: 600 51idx: 6 52start_idx: 48 53self.length: 39 54last_idx: 56 55idx: 47 56start_idx: 376 57self.length: 155 58last_idx: 384 59idx: 7 60start_idx: 56 61self.length: 39 62last_idx: 64 63idx: 80 64start_idx: 640 65self.length: 155 66last_idx: 648 67idx: 8 68start_idx: 64 69self.length: 39 70last_idx: 72 71idx: 135 72start_idx: 1080 73self.length: 155 74last_idx: 1088 75idx: 9 76start_idx: 72 77self.length: 39 78last_idx: 80 79idx: 112 80start_idx: 896 81self.length: 155 82last_idx: 904 83idx: 10 84start_idx: 80 85self.length: 39 86last_idx: 88 87idx: 12 88start_idx: 96 89self.length: 155 90last_idx: 104 91idx: 72 92start_idx: 576 93self.length: 155 94last_idx: 584 95 1/155 [..............................] - ETA: 30:42 - loss: 2.0789 - accuracy: 0.1250idx: 153 96start_idx: 1224 97self.length: 155 98last_idx: 1232 99Traceback (most recent call last): 100 101 File "<ipython-input-3-11fe17aecda1>", line 34, in <module> 102 validation_data=val_sequence) 103 104 File "C:\ProgramData\Anaconda3\envs\general\lib\site-packages\keras\legacy\interfaces.py", line 91, in wrapper 105 return func(*args, **kwargs) 106 107 File "C:\ProgramData\Anaconda3\envs\general\lib\site-packages\keras\engine\training.py", line 1732, in fit_generator 108 initial_epoch=initial_epoch) 109 110 File "C:\ProgramData\Anaconda3\envs\general\lib\site-packages\keras\engine\training_generator.py", line 220, in fit_generator 111 reset_metrics=False) 112 113 File "C:\ProgramData\Anaconda3\envs\general\lib\site-packages\keras\engine\training.py", line 1508, in train_on_batch 114 class_weight=class_weight) 115 116 File "C:\ProgramData\Anaconda3\envs\general\lib\site-packages\keras\engine\training.py", line 621, in _standardize_user_data 117 exception_prefix='target') 118 119 File "C:\ProgramData\Anaconda3\envs\general\lib\site-packages\keras\engine\training_utils.py", line 145, in standardize_input_data 120 str(data_shape)) 121 122ValueError: Error when checking target: expected dense_12 to have shape (8,) but got array with shape (7,)
あなたの回答
tips
プレビュー