質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1138閲覧

kerasでのData Augmentationによるデータ数の変化の理由がわかりません。

mikan_professor

総合スコア28

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/05/08 04:36

編集2020/05/08 04:40

現在、直感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の理由がわからないです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

そこに表示されている312というのはサンプル数でなく、そのエポックの反復回数です。
各エポックの反復回数は学習データの全サンプル数 / バッチサイズです。
今回の場合、 40000//128=312

追記

そういう仕様ですね。
表示される進捗は fit() で学習した場合はサンプル数、fit_generator() で学習した場合は1エポックあたりの反復回数になります。

python

1import numpy as np 2from tensorflow.keras.datasets import mnist 3from tensorflow.keras.layers import Conv2D, Dense, Dropout, Flatten, MaxPooling2D 4from tensorflow.keras.models import Sequential 5from tensorflow.keras.preprocessing.image import ImageDataGenerator 6from tensorflow.keras.utils import to_categorical 7 8(x_train, y_train), (x_test, y_test) = mnist.load_data() 9 10x_train = np.reshape(x_train, [-1, 28, 28, 1]) 11y_train = to_categorical(y_train) 12y_test = to_categorical(y_test) 13 14# we train our network using float data 15x_train = x_train.astype("float32") / 255 16x_test = x_test.astype("float32") / 255 17 18# network parameters 19batch_size = 128 20hidden_units = 256 21data_augmentation = False 22epochs = 20 23max_batches = len(x_train) / batch_size 24 25model = Sequential() 26model.add(Conv2D(32, kernel_size=(3, 3), activation="relu", input_shape=(28, 28, 1))) 27model.add(Conv2D(64, (3, 3), activation="relu")) 28model.add(MaxPooling2D(pool_size=(2, 2))) 29model.add(Dropout(0.25)) 30model.add(Flatten()) 31model.add(Dense(128, activation="relu")) 32model.add(Dropout(0.5)) 33model.add(Dense(10, activation="softmax")) 34model.compile(loss="categorical_crossentropy", optimizer="sgd", metrics=["accuracy"]) 35 36if not data_augmentation: 37 print("Not using data augmentation.") 38 model.fit(x_train, y_train, epochs=epochs, batch_size=batch_size) 39else: 40 print("Using real-time data augmentation.") 41 datagen = ImageDataGenerator( 42 featurewise_center=True, 43 featurewise_std_normalization=True, 44 rotation_range=20, 45 width_shift_range=0.2, 46 height_shift_range=0.2, 47 horizontal_flip=False, 48 ) 49 datagen.fit(x_train) 50 model.fit_generator(datagen.flow(x_train, y_train, batch_size=batch_size))

投稿2020/05/08 05:03

編集2020/05/08 05:29
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mikan_professor

2020/05/08 05:07

ありがとうございます。なるほど、イテレーション数だったということでしょうか。 もう一つお聞きしたいのですが、同じバッチ数でAugmentationしなかった場合、ここの数が40000となっておりました。イテレーション数の場合このときも312になるかと思うのですが、どうしてでしょうか。
tiitoi

2020/05/08 05:10

> 同じバッチ数でAugmentationしなかった場合 そのコードも質問欄に追記できますか?
tiitoi

2020/05/08 05:29

追記: 確認しましたが、そういう仕様ですね。 再現コードを追記しました。
mikan_professor

2020/05/08 10:20

なるほど、ありがとうございました!スッキリしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問