質問編集履歴
6
追記しました。
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
追記しました。
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
|
-
|
198
|
+
|
198
199
|
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
|
199
200
|
|
200
201
|
|
4
追記しました。
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
追記しました。
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
さらに追記いたしました。
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
修正依頼個所を追記しました。
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のグラフを書く関数がおかしいのか。それとももともと評価するところのプログラムがおかしいのかわかりません。どうかご指摘下ればと思います。
|