前提・実現したいこと
kerasを用いて2入力のCNNを実装したいと考えています.
発生している問題
エラーなどは表示されないのですが,Epoch数が表示されてから一向に処理が進みません.(https://teratail.com/questions/91452 で取り扱われている問題とほぼ同じ状況ですが,こちらは1エポック目すら始まらず,下の四角内の表示から一切動きません.)エラーメッセージも出ないのでどこを調べたらよいかもわからず詰まってしまいました.考えられる問題はどのようなものがあるでしょうか?
Epoch 1/100
該当のソースコード
python
1import numpy as np 2import pandas as pd 3import matplotlib.pyplot as plt 4import os 5import pathlib 6from keras.models import Sequential, load_model, Model 7from keras.layers.convolutional import Conv2D, MaxPooling2D 8from keras.layers.core import Activation, Flatten, Dense, Dropout 9from keras.layers import concatenate 10from keras.optimizers import Adam, Adagrad, RMSprop, SGD 11from keras.utils.np_utils import to_categorical 12from keras.callbacks import EarlyStopping, ModelCheckpoint, ReduceLROnPlateau, TensorBoard 13from keras.datasets import cifar10 14 15class ImageDataGenerator(object): 16 def __init__(self): 17 self.reset() 18 19 def reset(self): 20 self.images1 = [] 21 self.images2 = [] 22 self.labels = [] 23 24 def flow_from_directory(self, directory_pcm ,directory_paf, classes, batch_size=32): 25 classes = {v: i for i, v in enumerate(sorted(classes))} 26 while True: 27 for path_pcm in pathlib.Path(directory_pcm).iterdir(): 28 self.images1 = (np.load(path_pcm)) 29 self.images2 = (np.load(os.path.join(directory_paf,os.path.basename(path_pcm)))) 30 _, y = path_pcm.stem.split('_') 31 self.labels.append(to_categorical(classes[y], len(classes))) 32 33 if len(self.images1) == batch_size: 34 inputs1 = np.asarray(self.images1) 35 inputs2 = np.asarray(self.images2) 36 inputs1 = inputs1.reshape(1,64,64,19).astype("float32") 37 inputs2 = inputs2.reshape(1,64,64,38).astype("float32") 38 targets = np.asarray(self.labels) 39 self.reset() 40 yield [inputs1, inputs2], targets 41 42batch_size=10 43epochs=100 44 45model1 = Sequential() 46model2 = Sequential() 47 48model1.add(Conv2D(64,kernel_size=5,padding='same',activation='relu',input_shape=(64,64,19))) 49model2.add(Conv2D(64,kernel_size=5,padding='same',activation='relu',input_shape=(64,64,38))) 50 51model1.add(Conv2D(64,kernel_size=5,activation='relu')) 52model2.add(Conv2D(64,kernel_size=5,activation='relu')) 53 54model1.add(MaxPooling2D(pool_size=(2,2))) 55model2.add(MaxPooling2D(pool_size=(2,2))) 56 57model1.add(Dropout(0.2)) 58model2.add(Dropout(0.2)) 59 60model1.add(Flatten()) 61model2.add(Flatten()) 62 63model1.add(Dense(256,activation='relu')) 64model2.add(Dense(256,activation='relu')) 65 66merged = concatenate([model1.output,model2.output]) 67output = Dense(1,activation='sigmoid')(merged) 68 69model = Model([model1.input,model2.input],output) 70 71optimizer = Adam(lr = 0.001) 72model.compile( 73 optimizer = optimizer, 74 loss = "binary_crossentropy", 75 metrics = ["accuracy"] 76) 77 78early_stopping = EarlyStopping( 79 monitor='val_loss', 80 patience=10, 81 verbose=1 82) 83 84weights_dir = './weights/' 85if os.path.exists(weights_dir) == False:os.mkdir(weights_dir) 86model_checkpoint = ModelCheckpoint( 87 weights_dir + "val_loss{val_loss:.3f}.hdf5", 88 monitor = 'val_loss', 89 verbose = 1, 90 save_best_only = True, 91 save_weights_only = True, 92 period = 3 93) 94 95reduce_lr = ReduceLROnPlateau( 96 monitor = 'val_loss', 97 factor = 0.1, 98 patience = 3, 99 verbose = 1 100) 101 102logging = TensorBoard(log_dir = "log/") 103 104pcm_train = pathlib.Path('dataset/pcm_train2/') 105paf_train = pathlib.Path('dataset/paf_train2/') 106train_datagen = ImageDataGenerator() 107classes = ['0', '1'] 108 109model.fit_generator( 110 generator=train_datagen.flow_from_directory(pcm_train, paf_train, classes), 111 steps_per_epoch=int(np.ceil(len(list(pcm_train.iterdir()))/ batch_size)), 112 epochs=epochs, 113 verbose=1)
試したこと
・トレーニングデータの正規化
・fit_generatorに与える引数のうちsteps_per_epochが(トレーニングデータの長さ)//(バッチサイズ)になっているかの確認
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー