teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

6

追記しました。

2020/09/11 07:28

投稿

oinari03
oinari03

スコア59

title CHANGED
File without changes
body CHANGED
@@ -305,6 +305,12 @@
305
305
  上記で、lossを収束させています。modelはconv1,conv2の2層です。
306
306
 
307
307
  ただ、model_cpu.pthの容量が大きすぎて中身見れないみたいです。
308
+ ### 追記3
309
+ eval.pyとtrain.pyでパラメータの保存とloadを書いた時の出力accを表示します。
310
+ ```
311
+ epochs: [1]
312
+ acc: [0.5740740740740741]
313
+ ```
308
314
 
309
315
  ### 困っていること
310
316
  以上の結果から正しい精度&推論を出すためのプログラムの書き方を教えてほしいです。

5

追記しました。

2020/09/11 07:28

投稿

oinari03
oinari03

スコア59

title CHANGED
File without changes
body CHANGED
@@ -58,8 +58,9 @@
58
58
  # optimizerの定義
59
59
  optimizer = torch.optim.SGD(
60
60
  model.parameters(), lr=0.0001, momentum=0.9, weight_decay=0.0001)
61
+ #パラメータの読み込み
62
+ model.load_state_dict(torch.load("model_cpu.pth", map_location=device))
61
63
 
62
-
63
64
  # validationのデータセット
64
65
  valid_dataset = dataset.MyDatasets(
65
66
  root_dir="./animal_dataset",
@@ -194,7 +195,7 @@
194
195
 
195
196
 
196
197
 
197
- #一つの機能を作ったら→pritで確認
198
+
198
199
  device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
199
200
 
200
201
 

4

追記しました。

2020/09/11 07:24

投稿

oinari03
oinari03

スコア59

title CHANGED
File without changes
body CHANGED
@@ -303,6 +303,8 @@
303
303
  ```
304
304
  上記で、lossを収束させています。modelはconv1,conv2の2層です。
305
305
 
306
+ ただ、model_cpu.pthの容量が大きすぎて中身見れないみたいです。
307
+
306
308
  ### 困っていること
307
309
  以上の結果から正しい精度&推論を出すためのプログラムの書き方を教えてほしいです。
308
310
  plot_accのグラフを書く関数がおかしいのか。それとももともと評価するところのプログラムがおかしいのかわかりません。どうかご指摘下ればと思います。

3

追記しました。

2020/09/11 06:50

投稿

oinari03
oinari03

スコア59

title CHANGED
File without changes
body CHANGED
@@ -174,7 +174,7 @@
174
174
  このようになっていました。
175
175
 
176
176
  ### 追記2
177
- lossを収束させたコード
177
+ lossを収束させたコード(train.py)
178
178
  ```
179
179
  import torch
180
180
  import torch.nn as nn
@@ -281,8 +281,9 @@
281
281
  """
282
282
  # for param_tensor in model.state_dict():
283
283
  print(model.state_dict()['conv1.weight'])
284
+ model = model.to('cpu')
285
+ torch.save(model.state_dict(), 'model_cpu.pth')
284
286
 
285
-
286
287
  # lossグラフ描画
287
288
  def plot_history(losses):
288
289
  fig, ax = plt.subplots()

2

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

2020/09/11 06:43

投稿

oinari03
oinari03

スコア59

title CHANGED
File without changes
body CHANGED
@@ -28,7 +28,7 @@
28
28
 
29
29
 
30
30
  ### ソースコード
31
- eval.py
31
+ eval.py(実行コード)
32
32
 
33
33
  ```
34
34
  import torch
@@ -173,6 +173,135 @@
173
173
  ```
174
174
  このようになっていました。
175
175
 
176
+ ### 追記2
177
+ lossを収束させたコード
178
+ ```
179
+ import torch
180
+ import torch.nn as nn
181
+ import torch.nn.functional as F
182
+
183
+ import torch.optim as optim
184
+ import model,dataset
185
+ from model import *
186
+
187
+ from tqdm import tqdm
188
+ from torch.autograd import Variable
189
+
190
+
191
+ import numpy as np
192
+ from matplotlib import pyplot as plt
193
+
194
+
195
+
196
+
197
+ #一つの機能を作ったら→pritで確認
198
+ device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
199
+
200
+
201
+ # 上でgpuの設定device
202
+ if __name__ == "__main__":
203
+ # modelの定義
204
+ model = model.Net().to(device)
205
+ model.train()
206
+
207
+ # optimizerの定義
208
+ optimizer = torch.optim.SGD(
209
+ model.parameters(), lr=0.0001, momentum=0.9, weight_decay=0.0001)
210
+
211
+ # datasetの定義
212
+ # training
213
+ train_dataset = dataset.MyDatasets(
214
+ root_dir="./animal_dataset",
215
+ key="train",
216
+ )
217
+ train_loader = torch.utils.data.DataLoader(
218
+ train_dataset,
219
+ batch_size=4,
220
+ shuffle= True
221
+ )
222
+
223
+ # validation
224
+ valid_dataset = dataset.MyDatasets(
225
+ root_dir="./animal_dataset",
226
+ key="val",
227
+ )
228
+
229
+ valid_loader = torch.utils.data.DataLoader(
230
+ valid_dataset,
231
+ batch_size=4,
232
+ shuffle= True
233
+ )
234
+
235
+ # batch = len(next(iter(train_loader))) #2
236
+ # for i in train_loader:
237
+ # print(i)
238
+ # for i in valid_loader:
239
+ # print(i)
240
+
241
+ # iterationの確定
242
+ sample_size = len(train_dataset) #129
243
+ # num_iters = sample_size // 4
244
+
245
+ #loss
246
+ criterion = nn.CrossEntropyLoss().to(device)
247
+
248
+ losses = []
249
+ #start epoch
250
+ epoch_num = 100
251
+ for epoch in range(epoch_num): # loop over the dataset multiple times
252
+ epoch_loss = 0
253
+ for i, data in enumerate(train_loader, 0):
254
+ # get the inputs; data is a list of [inputs, labels]
255
+ inputs, labels = data[0].to(device), data[1].to(device)
256
+ # print("label={}".format(labels))
257
+ # print("inputs={}".format(inputs))
258
+
259
+ outputs = model(inputs).to(device)
260
+ # print(model)
261
+ # with torch.no_grad():
262
+ loss = criterion(outputs, labels)
263
+ # loss.requires_grad = True
264
+ # print(loss)
265
+ optimizer.zero_grad()
266
+ loss.backward()
267
+ optimizer.step()
268
+
269
+ # print(loss)
270
+ epoch_loss += loss
271
+
272
+
273
+ losses.append(np.mean(float(epoch_loss)))
274
+
275
+ print('Finished Training')
276
+
277
+ """
278
+ 層を出力
279
+ おそらくtorch.save
280
+ torch.loadをつかう??
281
+ """
282
+ # for param_tensor in model.state_dict():
283
+ print(model.state_dict()['conv1.weight'])
284
+
285
+
286
+ # lossグラフ描画
287
+ def plot_history(losses):
288
+ fig, ax = plt.subplots()
289
+
290
+ epochs = np.arange(1, len(losses) + 1)
291
+
292
+ # 損失の推移
293
+ ax.set_title("Loss")
294
+ ax.plot(epochs, losses)
295
+ ax.set_xlabel("Epoch")
296
+
297
+ plt.savefig('loss.png')
298
+
299
+
300
+ plot_history(losses)
301
+
302
+ ```
303
+ 上記で、lossを収束させています。modelはconv1,conv2の2層です。
304
+
176
305
  ### 困っていること
177
306
  以上の結果から正しい精度&推論を出すためのプログラムの書き方を教えてほしいです。
178
307
  plot_accのグラフを書く関数がおかしいのか。それとももともと評価するところのプログラムがおかしいのかわかりません。どうかご指摘下ればと思います。

1

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

2020/09/11 06:21

投稿

oinari03
oinari03

スコア59

title CHANGED
File without changes
body CHANGED
@@ -104,6 +104,8 @@
104
104
  ax.set_title("accuracy")
105
105
  ax.plot(epochs, acc)
106
106
  ax.set_xlabel("Epoch")
107
+ print("epochs: {}".format(epochs))
108
+ print("acc: {}".format(acc))
107
109
 
108
110
  plt.savefig("acc.png")
109
111
 
@@ -157,6 +159,20 @@
157
159
  ```
158
160
  なんかこの0が並んでるのが違和感です。
159
161
 
162
+ ### 追記
163
+ プログラムにepochsとaccの内容をprintしました。
164
+ ```
165
+ .
166
+ .
167
+ .
168
+ torch.Size([2, 984064])
169
+ Accuracy of the network on the 100 test images: 50 %
170
+ epochs: [1]
171
+ acc: [0.5]
172
+
173
+ ```
174
+ このようになっていました。
175
+
160
176
  ### 困っていること
161
177
  以上の結果から正しい精度&推論を出すためのプログラムの書き方を教えてほしいです。
162
178
  plot_accのグラフを書く関数がおかしいのか。それとももともと評価するところのプログラムがおかしいのかわかりません。どうかご指摘下ればと思います。