質問編集履歴

6

追記しました。

2020/09/11 07:28

投稿

oinari03
oinari03

スコア59

test CHANGED
File without changes
test CHANGED
@@ -612,6 +612,18 @@
612
612
 
613
613
  ただ、model_cpu.pthの容量が大きすぎて中身見れないみたいです。
614
614
 
615
+ ### 追記3
616
+
617
+ eval.pyとtrain.pyでパラメータの保存とloadを書いた時の出力accを表示します。
618
+
619
+ ```
620
+
621
+ epochs: [1]
622
+
623
+ acc: [0.5740740740740741]
624
+
625
+ ```
626
+
615
627
 
616
628
 
617
629
  ### 困っていること

5

追記しました。

2020/09/11 07:28

投稿

oinari03
oinari03

スコア59

test CHANGED
File without changes
test CHANGED
@@ -118,7 +118,9 @@
118
118
 
119
119
  model.parameters(), lr=0.0001, momentum=0.9, weight_decay=0.0001)
120
120
 
121
-
121
+ #パラメータの読み込み
122
+
123
+ model.load_state_dict(torch.load("model_cpu.pth", map_location=device))
122
124
 
123
125
 
124
126
 
@@ -390,7 +392,7 @@
390
392
 
391
393
 
392
394
 
393
- #一つの機能を作ったら→pritで確認
395
+
394
396
 
395
397
  device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
396
398
 

4

追記しました。

2020/09/11 07:24

投稿

oinari03
oinari03

スコア59

test CHANGED
File without changes
test CHANGED
@@ -608,6 +608,10 @@
608
608
 
609
609
 
610
610
 
611
+ ただ、model_cpu.pthの容量が大きすぎて中身見れないみたいです。
612
+
613
+
614
+
611
615
  ### 困っていること
612
616
 
613
617
  以上の結果から正しい精度&推論を出すためのプログラムの書き方を教えてほしいです。

3

追記しました。

2020/09/11 06:50

投稿

oinari03
oinari03

スコア59

test CHANGED
File without changes
test CHANGED
@@ -350,7 +350,7 @@
350
350
 
351
351
  ### 追記2
352
352
 
353
- lossを収束させたコード
353
+ lossを収束させたコード(train.py)
354
354
 
355
355
  ```
356
356
 
@@ -564,7 +564,9 @@
564
564
 
565
565
  print(model.state_dict()['conv1.weight'])
566
566
 
567
-
567
+ model = model.to('cpu')
568
+
569
+ torch.save(model.state_dict(), 'model_cpu.pth')
568
570
 
569
571
 
570
572
 

2

さらに追記いたしました。

2020/09/11 06:43

投稿

oinari03
oinari03

スコア59

test CHANGED
File without changes
test CHANGED
@@ -58,7 +58,7 @@
58
58
 
59
59
  ### ソースコード
60
60
 
61
- eval.py
61
+ eval.py(実行コード)
62
62
 
63
63
 
64
64
 
@@ -348,6 +348,264 @@
348
348
 
349
349
 
350
350
 
351
+ ### 追記2
352
+
353
+ lossを収束させたコード
354
+
355
+ ```
356
+
357
+ import torch
358
+
359
+ import torch.nn as nn
360
+
361
+ import torch.nn.functional as F
362
+
363
+
364
+
365
+ import torch.optim as optim
366
+
367
+ import model,dataset
368
+
369
+ from model import *
370
+
371
+
372
+
373
+ from tqdm import tqdm
374
+
375
+ from torch.autograd import Variable
376
+
377
+
378
+
379
+
380
+
381
+ import numpy as np
382
+
383
+ from matplotlib import pyplot as plt
384
+
385
+
386
+
387
+
388
+
389
+
390
+
391
+
392
+
393
+ #一つの機能を作ったら→pritで確認
394
+
395
+ device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
396
+
397
+
398
+
399
+
400
+
401
+ # 上でgpuの設定device
402
+
403
+ if __name__ == "__main__":
404
+
405
+ # modelの定義
406
+
407
+ model = model.Net().to(device)
408
+
409
+ model.train()
410
+
411
+
412
+
413
+ # optimizerの定義
414
+
415
+ optimizer = torch.optim.SGD(
416
+
417
+ model.parameters(), lr=0.0001, momentum=0.9, weight_decay=0.0001)
418
+
419
+
420
+
421
+ # datasetの定義
422
+
423
+ # training
424
+
425
+ train_dataset = dataset.MyDatasets(
426
+
427
+ root_dir="./animal_dataset",
428
+
429
+ key="train",
430
+
431
+ )
432
+
433
+ train_loader = torch.utils.data.DataLoader(
434
+
435
+ train_dataset,
436
+
437
+ batch_size=4,
438
+
439
+ shuffle= True
440
+
441
+ )
442
+
443
+
444
+
445
+ # validation
446
+
447
+ valid_dataset = dataset.MyDatasets(
448
+
449
+ root_dir="./animal_dataset",
450
+
451
+ key="val",
452
+
453
+ )
454
+
455
+
456
+
457
+ valid_loader = torch.utils.data.DataLoader(
458
+
459
+ valid_dataset,
460
+
461
+ batch_size=4,
462
+
463
+ shuffle= True
464
+
465
+ )
466
+
467
+
468
+
469
+ # batch = len(next(iter(train_loader))) #2
470
+
471
+ # for i in train_loader:
472
+
473
+ # print(i)
474
+
475
+ # for i in valid_loader:
476
+
477
+ # print(i)
478
+
479
+
480
+
481
+ # iterationの確定
482
+
483
+ sample_size = len(train_dataset) #129
484
+
485
+ # num_iters = sample_size // 4
486
+
487
+
488
+
489
+ #loss
490
+
491
+ criterion = nn.CrossEntropyLoss().to(device)
492
+
493
+
494
+
495
+ losses = []
496
+
497
+ #start epoch
498
+
499
+ epoch_num = 100
500
+
501
+ for epoch in range(epoch_num): # loop over the dataset multiple times
502
+
503
+ epoch_loss = 0
504
+
505
+ for i, data in enumerate(train_loader, 0):
506
+
507
+ # get the inputs; data is a list of [inputs, labels]
508
+
509
+ inputs, labels = data[0].to(device), data[1].to(device)
510
+
511
+ # print("label={}".format(labels))
512
+
513
+ # print("inputs={}".format(inputs))
514
+
515
+
516
+
517
+ outputs = model(inputs).to(device)
518
+
519
+ # print(model)
520
+
521
+ # with torch.no_grad():
522
+
523
+ loss = criterion(outputs, labels)
524
+
525
+ # loss.requires_grad = True
526
+
527
+ # print(loss)
528
+
529
+ optimizer.zero_grad()
530
+
531
+ loss.backward()
532
+
533
+ optimizer.step()
534
+
535
+
536
+
537
+ # print(loss)
538
+
539
+ epoch_loss += loss
540
+
541
+
542
+
543
+
544
+
545
+ losses.append(np.mean(float(epoch_loss)))
546
+
547
+
548
+
549
+ print('Finished Training')
550
+
551
+
552
+
553
+ """
554
+
555
+ 層を出力
556
+
557
+ おそらくtorch.save
558
+
559
+ torch.loadをつかう??
560
+
561
+ """
562
+
563
+ # for param_tensor in model.state_dict():
564
+
565
+ print(model.state_dict()['conv1.weight'])
566
+
567
+
568
+
569
+
570
+
571
+ # lossグラフ描画
572
+
573
+ def plot_history(losses):
574
+
575
+ fig, ax = plt.subplots()
576
+
577
+
578
+
579
+ epochs = np.arange(1, len(losses) + 1)
580
+
581
+
582
+
583
+ # 損失の推移
584
+
585
+ ax.set_title("Loss")
586
+
587
+ ax.plot(epochs, losses)
588
+
589
+ ax.set_xlabel("Epoch")
590
+
591
+
592
+
593
+ plt.savefig('loss.png')
594
+
595
+
596
+
597
+
598
+
599
+ plot_history(losses)
600
+
601
+
602
+
603
+ ```
604
+
605
+ 上記で、lossを収束させています。modelはconv1,conv2の2層です。
606
+
607
+
608
+
351
609
  ### 困っていること
352
610
 
353
611
  以上の結果から正しい精度&推論を出すためのプログラムの書き方を教えてほしいです。

1

修正依頼個所を追記しました。

2020/09/11 06:21

投稿

oinari03
oinari03

スコア59

test CHANGED
File without changes
test CHANGED
@@ -210,6 +210,10 @@
210
210
 
211
211
  ax.set_xlabel("Epoch")
212
212
 
213
+ print("epochs: {}".format(epochs))
214
+
215
+ print("acc: {}".format(acc))
216
+
213
217
 
214
218
 
215
219
  plt.savefig("acc.png")
@@ -316,6 +320,34 @@
316
320
 
317
321
 
318
322
 
323
+ ### 追記
324
+
325
+ プログラムにepochsとaccの内容をprintしました。
326
+
327
+ ```
328
+
329
+ .
330
+
331
+ .
332
+
333
+ .
334
+
335
+ torch.Size([2, 984064])
336
+
337
+ Accuracy of the network on the 100 test images: 50 %
338
+
339
+ epochs: [1]
340
+
341
+ acc: [0.5]
342
+
343
+
344
+
345
+ ```
346
+
347
+ このようになっていました。
348
+
349
+
350
+
319
351
  ### 困っていること
320
352
 
321
353
  以上の結果から正しい精度&推論を出すためのプログラムの書き方を教えてほしいです。