前提・実現したいこと
CIFAR-10データセットを用いたデータ画像認識の機械学習をサンプルコードを写経しながら勉強しています。
実行後、Accuracyが上昇していかないことについてご質問させていただければと考えます。
発生している問題・エラーメッセージ
Accuracyが上昇していきません。
Epoch 1/100
625/625 [==============================] - 90s 143ms/step - loss: 2.3269 - accuracy: 0.0780 - val_loss: 2.3245 - val_accuracy: 0.0039
Epoch 2/100
625/625 [==============================] - 91s 146ms/step - loss: 2.3253 - accuracy: 0.1071 - val_loss: 2.3235 - val_accuracy: 0.0104
Epoch 3/100
625/625 [==============================] - 92s 147ms/step - loss: 2.3248 - accuracy: 0.1402 - val_loss: 2.3227 - val_accuracy: 0.0301
Epoch 4/100
625/625 [==============================] - 92s 148ms/step - loss: 2.3239 - accuracy: 0.1699 - val_loss: 2.3215 - val_accuracy: 0.0809
Epoch 5/100
625/625 [==============================] - 92s 146ms/step - loss: 2.3227 - accuracy: 0.1993 - val_loss: 2.3205 - val_accuracy: 0.1839
Epoch 6/100
625/625 [==============================] - 91s 146ms/step - loss: 2.3223 - accuracy: 0.2318 - val_loss: 2.3200 - val_accuracy: 0.3458
Epoch 7/100
625/625 [==============================] - 92s 147ms/step - loss: 2.3213 - accuracy: 0.2586 - val_loss: 2.3191 - val_accuracy: 0.5116
Epoch 8/100
625/625 [==============================] - 92s 148ms/step - loss: 2.3208 - accuracy: 0.2861 - val_loss: 2.3182 - val_accuracy: 0.6243
Epoch 9/100
625/625 [==============================] - 92s 148ms/step - loss: 2.3199 - accuracy: 0.2993 - val_loss: 2.3174 - val_accuracy: 0.6983
Epoch 10/100
625/625 [==============================] - 89s 143ms/step - loss: 2.3195 - accuracy: 0.3175 - val_loss: 2.3168 - val_accuracy: 0.7258
Epoch 11/100
625/625 [==============================] - 89s 143ms/step - loss: 2.3189 - accuracy: 0.3325 - val_loss: 2.3160 - val_accuracy: 0.7440
Epoch 12/100
625/625 [==============================] - 89s 143ms/step - loss: 2.3182 - accuracy: 0.3447 - val_loss: 2.3153 - val_accuracy: 0.7398
Epoch 13/100
625/625 [==============================] - 89s 143ms/step - loss: 2.3177 - accuracy: 0.3487 - val_loss: 2.3148 - val_accuracy: 0.7234
Epoch 14/100
625/625 [==============================] - 89s 143ms/step - loss: 2.3165 - accuracy: 0.3504 - val_loss: 2.3138 - val_accuracy: 0.7100
Epoch 15/100
625/625 [==============================] - 89s 143ms/step - loss: 2.3159 - accuracy: 0.3492 - val_loss: 2.3130 - val_accuracy: 0.6894
Epoch 16/100
625/625 [==============================] - ETA: 0s - loss: 2.3155 - accuracy: 0.3514
Epoch 00016: ReduceLROnPlateau reducing learning rate to 4.999999873689376e-05.
625/625 [==============================] - 90s 144ms/step - loss: 2.3155 - accuracy: 0.3514 - val_loss: 2.3124 - val_accuracy: 0.6714
Epoch 17/100
625/625 [==============================] - 89s 142ms/step - loss: 2.3149 - accuracy: 0.3518 - val_loss: 2.3119 - val_accuracy: 0.6556
Epoch 18/100
625/625 [==============================] - 89s 142ms/step - loss: 2.3146 - accuracy: 0.3457 - val_loss: 2.3118 - val_accuracy: 0.6439
Epoch 19/100
625/625 [==============================] - 89s 143ms/step - loss: 2.3142 - accuracy: 0.3498 - val_loss: 2.3114 - val_accuracy: 0.6339
Epoch 20/100
625/625 [==============================] - 89s 143ms/step - loss: 2.3136 - accuracy: 0.3460 - val_loss: 2.3107 - val_accuracy: 0.6208
該当のソースコード
''' 1.CIFAR-10データセットの読み込み ''' from tensorflow.keras import datasets (x_train, t_train), (x_test, t_test) = datasets.cifar10.load_data() ''' 2.畳み込みネットワークの構築 ''' from tensorflow.keras import models, layers, optimizers, regularizers # L2正則化の係数 weight_decay = 1e-4 # CNNを構築 model = models.Sequential() # (第1層)畳み込み層1 正則化を行う model.add( layers.Conv2D( filters=32, # フィルターの数は32 kernel_size=(3,3), # 3×3のフィルターを使用 input_shape=x_train.shape[1:], # 入力データの形状 padding='same', # ゼロパディングを行う kernel_regularizer=regularizers.l2(weight_decay), activation='relu' # 活性化関数はReLU )) # (第2層)プーリング層1:ウィンドウサイズは2×2 model.add( layers.MaxPooling2D(pool_size=(2,2))) # (第3層)畳み込み層2 正則化を行う model.add( layers.Conv2D( filters=128, # フィルターの数は64 kernel_size=(3,3), # 3×3のフィルターを使用 padding='same', # ゼロパディングを行う kernel_regularizer=regularizers.l2(weight_decay), activation='relu' # 活性化関数はReLU )) # (第4層)プーリング層2:ウィンドウサイズは2×2 model.add( layers.MaxPooling2D(pool_size=(2,2))) # (第5層)畳み込み層3 正則化を行う model.add( layers.Conv2D( filters=256, # フィルターの数は256 kernel_size=(3,3), # 3×3のフィルターを使用 padding='same', # ゼロパディングを行う kernel_regularizer=regularizers.l2(weight_decay), activation='relu' # 活性化関数はReLU )) # (第6層)プーリング層2:ウィンドウサイズは2×2 model.add( layers.MaxPooling2D(pool_size=(2,2))) # Flatten model.add(layers.Flatten()) # ドロップアウト:ドロップアウトは40% model.add(layers.Dropout(0.4)) # (第7層)全結合層 model.add( layers.Dense( 512, # ニューロン数は512 activation='relu')) # 活性化関数はReLU # (第8層)出力層 model.add( layers.Dense( 10, # 出力層のニューロン数は10 activation='softmax')) # 活性化関数はソフトマックス # 学習率 learning_rate = 0.0001 # Sequentialオブジェクトのコンパイル model.compile( # 損失関数はスパースラベル対応クロスエントロピー誤差 loss='sparse_categorical_crossentropy', # オプティマイザーはSGD optimizer=optimizers.SGD(lr=learning_rate), # 学習評価として正解率を指定 metrics=['accuracy']) ''' 3.学習の実行 ''' from tensorflow.keras.preprocessing.image import ImageDataGenerator from tensorflow.keras.callbacks import ReduceLROnPlateau # ミニバッチのサイズ batch_size = 64 # データ拡張 datagen = ImageDataGenerator( rescale=1.0/255.0, # ピクセル値を255で割って正規化する validation_split=0.2, # 20パーセントのデータを検証用にする rotation_range=15, # 15度の範囲でランダムに回転させる width_shift_range=0.1, # 横サイズの0.1の割合でランダムに水平移動 height_shift_range=0.1, # 縦サイズの0.1の割合でランダムに垂直移動 horizontal_flip=True, # 水平方向にランダムに反転、左右の入れ替え zoom_range=0.2, # ランダムに拡大 ) # 訓練データ用のジェネレーターを生成 training_generator = datagen.flow(x_train, t_train, batch_size=batch_size, subset='training') # 訓練用のデータを生成 # 検証データ用のジェネレーターを生成 validation_generator = datagen.flow(x_train, t_train, batch_size=batch_size, subset='validation') # 検証用のデータを生成 # 5エポックの間にval_accuracyが改善されなかったら学習率を0.5倍する。 reduce_lr = ReduceLROnPlateau( monitor='val_accuracy', # 監視対象は検証データの精度 factor=0.5, # 学習率を減衰させる割合 patience=5, # 監視対象のエポック数 verbose=1, # 学習率を下げたときに通知する mode='max', # 最高値を監視する min_lr=0.00001 # 学習率の下限 ) # エポック数 epochs = 100 # 学習を行う history = model.fit( # 拡張データをミニバッチの数だけ生成 training_generator, epochs=epochs, # エポック数 verbose=1, # 学習の進捗状況を出力する validation_data=validation_generator, # エポック終了後にreduce_lrをコールバック # コールバックはリストで指定する callbacks=[reduce_lr] )
試したこと
learning_rateを一桁、上げたり下げたりすることでaccuracyが上昇するとの記事を確認したため実施しましたが、
Accuracyが上昇することはありませんでした。アドバイス等いただければ幸いです。
補足情報(FW/ツールのバージョンなど)
tenserflow 2.3.0
回答1件
あなたの回答
tips
プレビュー