質問編集履歴
1
大変失礼いたしました。「コードの挿入」してコードを記載いたしました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -50,6 +50,8 @@
|
|
50
50
|
625/625 [==============================] - 89s 143ms/step - loss: 2.3136 - accuracy: 0.3460 - val_loss: 2.3107 - val_accuracy: 0.6208
|
51
51
|
|
52
52
|
### 該当のソースコード
|
53
|
+
```ここに言語を入力
|
54
|
+
|
53
55
|
'''
|
54
56
|
1.CIFAR-10データセットの読み込み
|
55
57
|
'''
|
@@ -59,14 +61,14 @@
|
|
59
61
|
2.畳み込みネットワークの構築
|
60
62
|
'''
|
61
63
|
from tensorflow.keras import models, layers, optimizers, regularizers
|
62
|
-
|
64
|
+
|
63
|
-
L2正則化の係数
|
65
|
+
# L2正則化の係数
|
64
66
|
weight_decay = 1e-4
|
65
|
-
|
67
|
+
|
66
|
-
CNNを構築
|
68
|
+
# CNNを構築
|
67
69
|
model = models.Sequential()
|
68
|
-
|
70
|
+
|
69
|
-
(第1層)畳み込み層1 正則化を行う
|
71
|
+
# (第1層)畳み込み層1 正則化を行う
|
70
72
|
model.add(
|
71
73
|
layers.Conv2D(
|
72
74
|
filters=32, # フィルターの数は32
|
@@ -76,12 +78,12 @@
|
|
76
78
|
kernel_regularizer=regularizers.l2(weight_decay),
|
77
79
|
activation='relu' # 活性化関数はReLU
|
78
80
|
))
|
79
|
-
|
81
|
+
|
80
|
-
(第2層)プーリング層1:ウィンドウサイズは2×2
|
82
|
+
# (第2層)プーリング層1:ウィンドウサイズは2×2
|
81
83
|
model.add(
|
82
84
|
layers.MaxPooling2D(pool_size=(2,2)))
|
83
|
-
|
85
|
+
|
84
|
-
(第3層)畳み込み層2 正則化を行う
|
86
|
+
# (第3層)畳み込み層2 正則化を行う
|
85
87
|
model.add(
|
86
88
|
layers.Conv2D(
|
87
89
|
filters=128, # フィルターの数は64
|
@@ -90,12 +92,12 @@
|
|
90
92
|
kernel_regularizer=regularizers.l2(weight_decay),
|
91
93
|
activation='relu' # 活性化関数はReLU
|
92
94
|
))
|
93
|
-
|
95
|
+
|
94
|
-
(第4層)プーリング層2:ウィンドウサイズは2×2
|
96
|
+
# (第4層)プーリング層2:ウィンドウサイズは2×2
|
95
97
|
model.add(
|
96
98
|
layers.MaxPooling2D(pool_size=(2,2)))
|
97
|
-
|
99
|
+
|
98
|
-
(第5層)畳み込み層3 正則化を行う
|
100
|
+
# (第5層)畳み込み層3 正則化を行う
|
99
101
|
model.add(
|
100
102
|
layers.Conv2D(
|
101
103
|
filters=256, # フィルターの数は256
|
@@ -104,52 +106,53 @@
|
|
104
106
|
kernel_regularizer=regularizers.l2(weight_decay),
|
105
107
|
activation='relu' # 活性化関数はReLU
|
106
108
|
))
|
107
|
-
|
109
|
+
|
108
|
-
(第6層)プーリング層2:ウィンドウサイズは2×2
|
110
|
+
# (第6層)プーリング層2:ウィンドウサイズは2×2
|
109
111
|
model.add(
|
110
112
|
layers.MaxPooling2D(pool_size=(2,2)))
|
111
|
-
|
113
|
+
|
112
|
-
Flatten
|
114
|
+
# Flatten
|
113
115
|
model.add(layers.Flatten())
|
114
|
-
|
116
|
+
|
115
|
-
ドロップアウト:ドロップアウトは40%
|
117
|
+
# ドロップアウト:ドロップアウトは40%
|
116
118
|
model.add(layers.Dropout(0.4))
|
117
119
|
|
118
|
-
(第7層)全結合層
|
120
|
+
# (第7層)全結合層
|
119
121
|
model.add(
|
120
122
|
layers.Dense(
|
121
123
|
512, # ニューロン数は512
|
122
124
|
activation='relu')) # 活性化関数はReLU
|
123
|
-
|
125
|
+
|
124
|
-
|
126
|
+
|
125
|
-
(第8層)出力層
|
127
|
+
# (第8層)出力層
|
126
128
|
model.add(
|
127
129
|
layers.Dense(
|
128
130
|
10, # 出力層のニューロン数は10
|
129
131
|
activation='softmax')) # 活性化関数はソフトマックス
|
130
|
-
|
132
|
+
|
131
|
-
学習率
|
133
|
+
# 学習率
|
132
134
|
learning_rate = 0.0001
|
133
|
-
|
135
|
+
|
134
|
-
Sequentialオブジェクトのコンパイル
|
136
|
+
# Sequentialオブジェクトのコンパイル
|
135
137
|
model.compile(
|
136
|
-
|
138
|
+
# 損失関数はスパースラベル対応クロスエントロピー誤差
|
137
139
|
loss='sparse_categorical_crossentropy',
|
138
|
-
オプティマイザーはSGD
|
140
|
+
# オプティマイザーはSGD
|
139
141
|
optimizer=optimizers.SGD(lr=learning_rate),
|
140
|
-
学習評価として正解率を指定
|
142
|
+
# 学習評価として正解率を指定
|
141
143
|
metrics=['accuracy'])
|
142
|
-
|
144
|
+
|
145
|
+
|
143
146
|
'''
|
144
147
|
3.学習の実行
|
145
148
|
'''
|
146
149
|
from tensorflow.keras.preprocessing.image import ImageDataGenerator
|
147
150
|
from tensorflow.keras.callbacks import ReduceLROnPlateau
|
148
|
-
|
151
|
+
|
149
|
-
ミニバッチのサイズ
|
152
|
+
# ミニバッチのサイズ
|
150
153
|
batch_size = 64
|
151
|
-
|
154
|
+
|
152
|
-
データ拡張
|
155
|
+
# データ拡張
|
153
156
|
datagen = ImageDataGenerator(
|
154
157
|
rescale=1.0/255.0, # ピクセル値を255で割って正規化する
|
155
158
|
validation_split=0.2, # 20パーセントのデータを検証用にする
|
@@ -159,17 +162,17 @@
|
|
159
162
|
horizontal_flip=True, # 水平方向にランダムに反転、左右の入れ替え
|
160
163
|
zoom_range=0.2, # ランダムに拡大
|
161
164
|
)
|
162
|
-
|
165
|
+
|
163
|
-
訓練データ用のジェネレーターを生成
|
166
|
+
# 訓練データ用のジェネレーターを生成
|
164
167
|
training_generator = datagen.flow(x_train, t_train,
|
165
168
|
batch_size=batch_size,
|
166
169
|
subset='training') # 訓練用のデータを生成
|
167
|
-
検証データ用のジェネレーターを生成
|
170
|
+
# 検証データ用のジェネレーターを生成
|
168
171
|
validation_generator = datagen.flow(x_train, t_train,
|
169
172
|
batch_size=batch_size,
|
170
173
|
subset='validation') # 検証用のデータを生成
|
171
|
-
|
174
|
+
|
172
|
-
5エポックの間にval_accuracyが改善されなかったら学習率を0.5倍する。
|
175
|
+
# 5エポックの間にval_accuracyが改善されなかったら学習率を0.5倍する。
|
173
176
|
reduce_lr = ReduceLROnPlateau(
|
174
177
|
monitor='val_accuracy', # 監視対象は検証データの精度
|
175
178
|
factor=0.5, # 学習率を減衰させる割合
|
@@ -178,23 +181,23 @@
|
|
178
181
|
mode='max', # 最高値を監視する
|
179
182
|
min_lr=0.00001 # 学習率の下限
|
180
183
|
)
|
181
|
-
|
184
|
+
|
182
|
-
エポック数
|
185
|
+
# エポック数
|
183
186
|
epochs = 100
|
184
|
-
|
187
|
+
|
185
|
-
学習を行う
|
188
|
+
# 学習を行う
|
186
189
|
history = model.fit(
|
187
|
-
拡張データをミニバッチの数だけ生成
|
190
|
+
# 拡張データをミニバッチの数だけ生成
|
188
191
|
training_generator,
|
189
192
|
epochs=epochs, # エポック数
|
190
193
|
verbose=1, # 学習の進捗状況を出力する
|
191
194
|
validation_data=validation_generator,
|
192
|
-
エポック終了後にreduce_lrをコールバック
|
195
|
+
# エポック終了後にreduce_lrをコールバック
|
193
|
-
コールバックはリストで指定する
|
196
|
+
# コールバックはリストで指定する
|
194
197
|
callbacks=[reduce_lr]
|
195
198
|
)
|
196
199
|
|
197
|
-
|
200
|
+
```
|
198
201
|
### 試したこと
|
199
202
|
|
200
203
|
learning_rateを一桁、上げたり下げたりすることでaccuracyが上昇するとの記事を確認したため実施しましたが、
|