質問編集履歴

3

テキストの修正

2019/08/05 12:22

投稿

yohehe
yohehe

スコア48

test CHANGED
File without changes
test CHANGED
@@ -38,9 +38,13 @@
38
38
 
39
39
 
40
40
 
41
-
41
+ 今調べてもわからない点は、
42
+
42
-
43
+ 1.weightsデータを一旦保存して、もとのネットワークにBatchNormalizationを組み込むということなのか。
44
+
43
-
45
+ 2.表を見ると,SWAを使用した時の学習率とは別の学習率を設定しているようですが、学習率も設定し直す必要があるのか
46
+
47
+ です。
44
48
 
45
49
 
46
50
 

2

文法修正

2019/08/05 12:22

投稿

yohehe
yohehe

スコア48

test CHANGED
File without changes
test CHANGED
@@ -8,7 +8,9 @@
8
8
 
9
9
  https://pytorch.org/blog/stochastic-weight-averaging-in-pytorch/
10
10
 
11
+
12
+
11
- #SWAが何をやっているかは以下の方がわかりやすかです
13
+ SWAが何をやっているかわかりやすく以下にかれていました。
12
14
 
13
15
  https://towardsdatascience.com/stochastic-weight-averaging-a-new-way-to-get-state-of-the-art-results-in-deep-learning-c639ccf36a
14
16
 
@@ -134,25 +136,189 @@
134
136
 
135
137
  learning_rate=0.01
136
138
 
137
-
138
-
139
139
  optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
140
140
 
141
141
 
142
142
 
143
143
 
144
144
 
145
+ #まずはSWAを用いない学習を行ってみる。
146
+
147
+ def train(train_loader):
148
+
149
+ #訓練モードに設定
150
+
151
+ model.train()
152
+
153
+ running_loss = 0
154
+
155
+ for batch_idx, (images, labels) in enumerate(train_loader):
156
+
157
+ #view はNumPyの reshapeと似た動作。
158
+
159
+ #images = images.view(-1, 28 * 28)
160
+
161
+
162
+
163
+ # 微分可能に変換 なしでも動く???
164
+
165
+ #images=Variable(images)
166
+
167
+ #labels=Variable(labels)
168
+
169
+
170
+
171
+ # 一度計算された勾配結果を0にリセット
172
+
173
+ optimizer.zero_grad()
174
+
175
+ # 入力dataをinputし、順伝播により出力
176
+
177
+ outputs = model(images)
178
+
179
+ #lossの計算
180
+
181
+ loss = criterion(outputs, labels)
182
+
183
+ running_loss += loss.item()
184
+
185
+ #勾配を計算
186
+
187
+ loss.backward()
188
+
189
+ #パラメーターの更新
190
+
191
+ optimizer.step()
192
+
193
+
194
+
195
+ train_loss = running_loss / len(train_loader)
196
+
197
+ return train_loss
198
+
199
+
200
+
201
+
202
+
203
+ def valid(test_loader):
204
+
205
+
206
+
207
+ model.eval()
208
+
209
+ running_loss = 0
210
+
211
+ correct = 0
212
+
213
+ total = 0
214
+
215
+ #評価時は勾配は不要: with torch.no_grad()
216
+
217
+ with torch.no_grad():
218
+
219
+ for batch_idx, (images, labels) in enumerate(test_loader):
220
+
221
+ #images = images.view(-1, 28 * 28)
222
+
223
+
224
+
225
+ outputs = model(images)
226
+
227
+
228
+
229
+ loss = criterion(outputs, labels)
230
+
231
+ running_loss += loss.item()
232
+
233
+
234
+
235
+ _, predicted = torch.max(outputs, 1)
236
+
237
+ correct += (predicted == labels).sum().item()
238
+
239
+ total += labels.size(0)
240
+
241
+
242
+
243
+ val_loss = running_loss / len(test_loader)
244
+
245
+ val_acc = float(correct) / total
246
+
247
+
248
+
249
+ return val_loss, val_acc
250
+
251
+
252
+
253
+
254
+
255
+ #テストで30回epochを回してみる。
256
+
257
+ num_epochs=30
258
+
259
+
260
+
261
+ loss_list = []
262
+
263
+ val_loss_list = []
264
+
265
+ val_acc_list = []
266
+
267
+ for epoch in range(num_epochs):
268
+
269
+ loss = train(train_loader)
270
+
271
+ val_loss, val_acc = valid(test_loader)
272
+
273
+
274
+
275
+ print('epoch %d, loss: %.4f val_loss: %.4f val_acc: %.4f'
276
+
277
+ % (epoch, loss, val_loss, val_acc))
278
+
279
+
280
+
281
+ # logを取得
282
+
283
+ loss_list.append(loss)
284
+
285
+ val_loss_list.append(val_loss)
286
+
287
+ val_acc_list.append(val_acc)
288
+
289
+ #出力:epoch 29, loss: 0.1069 val_loss: 0.1641 val_acc: 0.9537
290
+
291
+ #学習できています。
292
+
293
+
294
+
295
+
296
+
297
+
298
+
299
+
300
+
301
+ #以下はSWAを試しに組み込んでみました。
302
+
303
+
304
+
305
+ from torchcontrib.optim import SWA
306
+
307
+
308
+
145
309
  criterion = nn.CrossEntropyLoss()
146
310
 
147
311
  learning_rate=0.01
148
312
 
313
+
314
+
149
- optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
315
+ base_opt = torch.optim.SGD(model.parameters(), lr=0.1)
150
-
151
-
152
-
153
-
154
-
316
+
155
- #まずはSWAを用いい学習を行っみる。
317
+ #swa_startが10なので10回の学習以降からSWAを計算し始める(,,,,と自分りに理解します)
318
+
319
+ optimizer = SWA(base_opt, swa_start=10, swa_freq=5, swa_lr=0.05)
320
+
321
+
156
322
 
157
323
  def train(train_loader):
158
324
 
@@ -200,6 +366,8 @@
200
366
 
201
367
  optimizer.step()
202
368
 
369
+ opt.swap_swa_sgd()
370
+
203
371
 
204
372
 
205
373
  train_loss = running_loss / len(train_loader)
@@ -222,7 +390,7 @@
222
390
 
223
391
  total = 0
224
392
 
225
- #評価時は勾配は不要: with torch.no_grad()
393
+ #評価時は勾配は不要なので with torch.no_grad()をつける。
226
394
 
227
395
  with torch.no_grad():
228
396
 
@@ -262,7 +430,7 @@
262
430
 
263
431
 
264
432
 
265
- #テストで30回epochしてみる。
433
+ #SWAを導入したモデルもepoch:30にする。
266
434
 
267
435
  num_epochs=30
268
436
 
@@ -288,7 +456,7 @@
288
456
 
289
457
 
290
458
 
291
- # logを取得
459
+ # logging
292
460
 
293
461
  loss_list.append(loss)
294
462
 
@@ -296,184 +464,6 @@
296
464
 
297
465
  val_acc_list.append(val_acc)
298
466
 
299
- #出力:epoch 29, loss: 0.1069 val_loss: 0.1641 val_acc: 0.9537
300
-
301
- #学習できています。
302
-
303
-
304
-
305
-
306
-
307
-
308
-
309
-
310
-
311
- #以下はSWAを試しに組み込んでみました。
312
-
313
-
314
-
315
- from torchcontrib.optim import SWA
316
-
317
-
318
-
319
- criterion = nn.CrossEntropyLoss()
320
-
321
- learning_rate=0.01
322
-
323
-
324
-
325
- base_opt = torch.optim.SGD(model.parameters(), lr=0.1)
326
-
327
- #swa_startが10なので10回の学習以降からSWAを計算し始める(と理解してます)
328
-
329
- optimizer = SWA(base_opt, swa_start=10, swa_freq=5, swa_lr=0.05)
330
-
331
-
332
-
333
- def train(train_loader):
334
-
335
- #訓練モードに設定
336
-
337
- model.train()
338
-
339
- running_loss = 0
340
-
341
- for batch_idx, (images, labels) in enumerate(train_loader):
342
-
343
- #view はNumPyの reshapeと似た動作。
344
-
345
- #images = images.view(-1, 28 * 28)
346
-
347
-
348
-
349
- # 微分可能に変換 なしでも動く???
350
-
351
- #images=Variable(images)
352
-
353
- #labels=Variable(labels)
354
-
355
-
356
-
357
- # 一度計算された勾配結果を0にリセット
358
-
359
- optimizer.zero_grad()
360
-
361
- # 入力dataをinputし、順伝播により出力
362
-
363
- outputs = model(images)
364
-
365
- #lossの計算
366
-
367
- loss = criterion(outputs, labels)
368
-
369
- running_loss += loss.item()
370
-
371
- #勾配を計算
372
-
373
- loss.backward()
374
-
375
- #パラメーターの更新
376
-
377
- optimizer.step()
378
-
379
- opt.swap_swa_sgd()
380
-
381
-
382
-
383
- train_loss = running_loss / len(train_loader)
384
-
385
- return train_loss
386
-
387
-
388
-
389
-
390
-
391
- def valid(test_loader):
392
-
393
-
394
-
395
- model.eval()
396
-
397
- running_loss = 0
398
-
399
- correct = 0
400
-
401
- total = 0
402
-
403
- #評価時は勾配は不要なので with torch.no_grad()をつける。
404
-
405
- with torch.no_grad():
406
-
407
- for batch_idx, (images, labels) in enumerate(test_loader):
408
-
409
- #images = images.view(-1, 28 * 28)
410
-
411
-
412
-
413
- outputs = model(images)
414
-
415
-
416
-
417
- loss = criterion(outputs, labels)
418
-
419
- running_loss += loss.item()
420
-
421
-
422
-
423
- _, predicted = torch.max(outputs, 1)
424
-
425
- correct += (predicted == labels).sum().item()
426
-
427
- total += labels.size(0)
428
-
429
-
430
-
431
- val_loss = running_loss / len(test_loader)
432
-
433
- val_acc = float(correct) / total
434
-
435
-
436
-
437
- return val_loss, val_acc
438
-
439
-
440
-
441
-
442
-
443
- #SWAを導入したモデルもepoch:30回にする。
444
-
445
- num_epochs=30
446
-
447
-
448
-
449
- loss_list = []
450
-
451
- val_loss_list = []
452
-
453
- val_acc_list = []
454
-
455
- for epoch in range(num_epochs):
456
-
457
- loss = train(train_loader)
458
-
459
- val_loss, val_acc = valid(test_loader)
460
-
461
-
462
-
463
- print('epoch %d, loss: %.4f val_loss: %.4f val_acc: %.4f'
464
-
465
- % (epoch, loss, val_loss, val_acc))
466
-
467
-
468
-
469
- # logging
470
-
471
- loss_list.append(loss)
472
-
473
- val_loss_list.append(val_loss)
474
-
475
- val_acc_list.append(val_acc)
476
-
477
467
 
478
468
 
479
469
  #epoch 29, loss: 0.0137 val_loss: 0.1020 val_acc: 0.9611

1

タイトル修正

2019/08/05 12:18

投稿

yohehe
yohehe

スコア48

test CHANGED
@@ -1 +1 @@
1
- pytorchを用いたSWA stocastic weights averageを用いた場合、BatchNormalizationはいつ組み込むのでしょうか。
1
+ pytorchを用いたSWA stocastic weights averageを用いた場合、BatchNormalizationはいつ,どのように組み込むのでしょうか。
test CHANGED
File without changes