現在、直感DeepLearningでKerasの勉強をしております。
CIFAR-10をData Augmentationをもちいて学習しました。
入力画像が60000件で、
訓練データ40000,
検証データ10000,
テストデータ10000,としています。
DataAugmentationを用ない場合は40000件で訓練を行っている過程がverbose=1により見えたのですが、
用いた場合はなぜか1epochあたり312件のようで、計算が合いませんでした。
以下がコードになります。
Python
1import os 2import keras 3from keras.models import Sequential 4from keras.layers.convolutional import Conv2D 5from keras.layers.convolutional import MaxPooling2D 6from keras.layers.core import Activation 7from keras.layers.core import Flatten,Dropout,Dense 8from keras.datasets import cifar10 9from keras.optimizers import RMSprop 10from keras.callbacks import TensorBoard,ModelCheckpoint 11import numpy as np 12from keras.preprocessing.image import ImageDataGenerator 13os.environ['KMP_DUPLICATE_LIB_OK']='TRUE' 14 15def network(input_shape,num_classes): 16 model=Sequential() 17 model.add(Conv2D(32,kernel_size=3,padding="same",input_shape=input_shape,activation="relu")) 18 model.add(Conv2D(32,kernel_size=3,activation="relu")) 19 model.add(MaxPooling2D(pool_size=(2,2))) 20 model.add(Dropout(0.25)) 21 model.add(Conv2D(64,kernel_size=3,padding="same",input_shape=input_shape,activation="relu")) 22 model.add(Conv2D(64,kernel_size=3,activation="relu")) 23 model.add(MaxPooling2D(pool_size=(2,2))) 24 model.add(Dropout(0.25)) 25 model.add(Flatten()) 26 model.add(Dense(512,activation="relu")) 27 model.add(Dropout(0.25)) 28 model.add(Dense(num_classes)) 29 model.add(Activation("softmax")) 30 return model 31class CIFAR10Dataset(): 32 33 def __init__(self): 34 self.image_shape=(32,32,3) 35 self.num_classes=10 36 def get_batch(self): 37 (x_train,y_train),(x_test,y_test)=cifar10.load_data() 38 x_train,x_test=[self.preprocess(d) for d in [x_train,x_test]] 39 y_train,y_test=[self.preprocess(d,label_data=True) for d in [y_train,y_test]] 40 41 return x_train,y_train,x_test,y_test 42 def preprocess(self,data,label_data=False): 43 if label_data: 44 data=keras.utils.to_categorical(data,self.num_classes) 45 else: 46 data=data.astype("float32") 47 data/=255 48 shape=(data.shape[0],)+self.image_shape 49 data=data.reshape(shape) 50 return data 51 52class Trainer(): 53 def __init__(self,model,loss,optimizer): 54 self._target=model 55 self._target.compile(loss=loss,optimizer=optimizer,metrics=["accuracy"]) 56 self.verbose=1 57 self.log_dir=os.path.join(os.path.dirname("__file__"),"logdir") 58 self.model_file_name="model_file.hdf5" 59 60 def train(self,x_train,y_train,batch_size,epochs,validation_split): 61 if os.path.exists(self.log_dir): 62 import shutil 63 shutil.rmtree(self.log_dir) 64 os.mkdir(self.log_dir) 65 datagen=ImageDataGenerator(featurewise_center=False,samplewise_center=False,featurewise_std_normalization=False,samplewise_std_normalization=False,zca_whitening=False,rotation_range=0,width_shift_range=0.1,height_shift_range=0.1,horizontal_flip=True,vertical_flip=False) 66 datagen.fit(x_train) 67 68 indices=np.arange(x_train.shape[0]) 69 np.random.shuffle(indices) 70 validation_size=int(x_train.shape[0]*validation_split)#50000*0.2=10000 71 x_train,x_valid=x_train[indices[:-validation_size],:],x_train[indices[-validation_size:],:] 72 y_train,y_valid=y_train[indices[:-validation_size],:],y_train[indices[-validation_size:],:] 73 self._target.fit_generator(datagen.flow(x_train,y_train,batch_size=batch_size),steps_per_epoch=x_train.shape[0]//batch_size,epochs=epochs,validation_data=(x_valid,y_valid),callbacks=[TensorBoard(log_dir=self.log_dir),ModelCheckpoint(os.path.join(self.log_dir,self.model_file_name),save_best_only=True)],verbose=self.verbose,workers=4) 74 # self._target.fit(x_train,y_train,batch_size=batch_size,epochs=epochs,validation_split=validation_split,callbacks=[TensorBoard(log_dir=self.log_dir),ModelCheckpoint(os.path.join(self.log_dir,self.model_file_name),save_best_only=True)],verbose=self.verbose) 75dataset=CIFAR10Dataset() 76 77model=network(dataset.image_shape,dataset.num_classes) 78x_train,y_train,x_test,y_test=dataset.get_batch() 79trainer=Trainer(model,loss="categorical_crossentropy",optimizer=RMSprop()) 80trainer.train(x_train,y_train,batch_size=128,epochs=15,validation_split=0.2) 81 82score=model.evaluate(x_test,y_test,verbose=0) 83print("Test loss:",score[0]) 84 85print("Test accuracy:",score[1]) 86
これを実行した結果、次のようにverboseにより表示されました。
Python
1Epoch 1/15 2312/312 [==============================] - 109s 350ms/step - loss: 1.8359 - accuracy: 0.3368 - val_loss: 1.5714 - val_accuracy: 0.4272 3Epoch 2/15 4312/312 [==============================] - 99s 319ms/step - loss: 1.4705 - accuracy: 0.4690 - val_loss: 1.5167 - val_accuracy: 0.4696 5Epoch 3/15 6312/312 [==============================] - 101s 323ms/step - loss: 1.2943 - accuracy: 0.5388 - val_loss: 1.2278 - val_accuracy: 0.5697 7Epoch 4/15 8312/312 [==============================] - 97s 310ms/step - loss: 1.1646 - accuracy: 0.5857 - val_loss: 0.9974 - val_accuracy: 0.6522
ここが312の理由がわからないです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/08 05:07
2020/05/08 05:10
2020/05/08 05:29
2020/05/08 10:20