質問編集履歴

3

書式の修正

2021/12/06 23:39

投稿

heets
heets

スコア0

test CHANGED
File without changes
test CHANGED
@@ -2,8 +2,6 @@
2
2
 
3
3
  PyTorchによるSSDを用いた物体検出の訓練について
4
4
 
5
-
6
-
7
5
  「作りながら学ぶ PyTorchによる発展ディープラーニング」
8
6
 
9
7
  の第2章 「2-7_SSD_training.ipynb」
@@ -402,7 +400,9 @@
402
400
 
403
401
  ### 試したこと
404
402
 
403
+ シングルGPUでは問題なく動かすことができますが、net = nn.DataParallel(net)を実行すると上記のようなエラー文が出てしまいます。
404
+
405
- gpu_id付与してたりましたがうまくいきませんでした
405
+ エラー文インターネットで検索して出てき解決方法は一通行ってみました。
406
406
 
407
407
 
408
408
 

2

書式の改善

2021/12/06 23:39

投稿

heets
heets

スコア0

test CHANGED
@@ -1 +1 @@
1
- 作りながら学ぶ!!Pytorch発展ディープラーニング 第2章7節マルチGPUで学習しようとするとき、ギャザー関数がCPUテンソルに含まれていないとエラーが表示される
1
+ SSDでマルチGPUで学習しようとするとき、ギャザー関数がCPUテンソルに含まれていないとエラーが表示される
test CHANGED
File without changes

1

エラーメッセージの不足を追加

2021/12/06 18:16

投稿

heets
heets

スコア0

test CHANGED
File without changes
test CHANGED
@@ -18,6 +18,130 @@
18
18
 
19
19
  ```
20
20
 
21
+ AssertionError Traceback (most recent call last)
22
+
23
+ <ipython-input-34-56fa4f8d86af> in <module>
24
+
25
+ 1 # 学習・検証を実行する
26
+
27
+ 2 num_epochs= 10
28
+
29
+ ----> 3 train_model(net, dataloaders_dict, criterion, optimizer, num_epochs=num_epochs)
30
+
31
+
32
+
33
+ <ipython-input-33-645d91cb3a1e> in train_model(net, dataloaders_dict, criterion, optimizer, num_epochs)
34
+
35
+ 60 with torch.set_grad_enabled(phase == 'train'):
36
+
37
+ 61 # 順伝搬(forward)計算
38
+
39
+ ---> 62 outputs = net(images)
40
+
41
+ 63
42
+
43
+ 64 # 損失の計算
44
+
45
+
46
+
47
+ ~/anaconda3/envs/vgg/lib/python3.6/site-packages/torch/nn/modules/module.py in _call_impl(self, *input, **kwargs)
48
+
49
+ 725 result = self._slow_forward(*input, **kwargs)
50
+
51
+ 726 else:
52
+
53
+ --> 727 result = self.forward(*input, **kwargs)
54
+
55
+ 728 for hook in itertools.chain(
56
+
57
+ 729 _global_forward_hooks.values(),
58
+
59
+
60
+
61
+ ~/anaconda3/envs/vgg/lib/python3.6/site-packages/torch/nn/parallel/data_parallel.py in forward(self, *inputs, **kwargs)
62
+
63
+ 160 replicas = self.replicate(self.module, self.device_ids[:len(inputs)])
64
+
65
+ 161 outputs = self.parallel_apply(replicas, inputs, kwargs)
66
+
67
+ --> 162 return self.gather(outputs, self.output_device)
68
+
69
+ 163
70
+
71
+ 164 def replicate(self, module, device_ids):
72
+
73
+
74
+
75
+ ~/anaconda3/envs/vgg/lib/python3.6/site-packages/torch/nn/parallel/data_parallel.py in gather(self, outputs, output_device)
76
+
77
+ 172
78
+
79
+ 173 def gather(self, outputs, output_device):
80
+
81
+ --> 174 return gather(outputs, output_device, dim=self.dim)
82
+
83
+ 175
84
+
85
+ 176
86
+
87
+
88
+
89
+ ~/anaconda3/envs/vgg/lib/python3.6/site-packages/torch/nn/parallel/scatter_gather.py in gather(outputs, target_device, dim)
90
+
91
+ 66 # Setting the function to None clears the refcycle.
92
+
93
+ 67 try:
94
+
95
+ ---> 68 res = gather_map(outputs)
96
+
97
+ 69 finally:
98
+
99
+ 70 gather_map = None
100
+
101
+
102
+
103
+ ~/anaconda3/envs/vgg/lib/python3.6/site-packages/torch/nn/parallel/scatter_gather.py in gather_map(outputs)
104
+
105
+ 61 return type(out)(((k, gather_map([d[k] for d in outputs]))
106
+
107
+ 62 for k in out))
108
+
109
+ ---> 63 return type(out)(map(gather_map, zip(*outputs)))
110
+
111
+ 64
112
+
113
+ 65 # Recursive function calls like this create reference cycles.
114
+
115
+
116
+
117
+ ~/anaconda3/envs/vgg/lib/python3.6/site-packages/torch/nn/parallel/scatter_gather.py in gather_map(outputs)
118
+
119
+ 53 out = outputs[0]
120
+
121
+ 54 if isinstance(out, torch.Tensor):
122
+
123
+ ---> 55 return Gather.apply(target_device, dim, *outputs)
124
+
125
+ 56 if out is None:
126
+
127
+ 57 return None
128
+
129
+
130
+
131
+ ~/anaconda3/envs/vgg/lib/python3.6/site-packages/torch/nn/parallel/_functions.py in forward(ctx, target_device, dim, *inputs)
132
+
133
+ 54 def forward(ctx, target_device, dim, *inputs):
134
+
135
+ 55 assert all(map(lambda i: i.device.type != 'cpu', inputs)), (
136
+
137
+ ---> 56 'Gather function not implemented for CPU tensors'
138
+
139
+ 57 )
140
+
141
+ 58 target_device = _get_device_index(target_device, True)
142
+
143
+
144
+
21
145
  AssertionError: Gather function not implemented for CPU tensors
22
146
 
23
147
 
@@ -32,220 +156,6 @@
32
156
 
33
157
  ```python
34
158
 
35
- # パッケージのimport
36
-
37
- import os.path as osp
38
-
39
- import random
40
-
41
- import time
42
-
43
-
44
-
45
- import cv2
46
-
47
- import numpy as np
48
-
49
- import pandas as pd
50
-
51
- import torch
52
-
53
- import torch.nn as nn
54
-
55
- import torch.nn.init as init
56
-
57
- import torch.optim as optim
58
-
59
- import torch.utils.data as data
60
-
61
-
62
-
63
- # 乱数のシードを設定
64
-
65
- torch.manual_seed(1234)
66
-
67
- np.random.seed(1234)
68
-
69
- random.seed(1234)
70
-
71
-
72
-
73
- from utils.ssd_model import make_datapath_list, VOCDataset, DataTransform, Anno_xml2list, od_collate_fn
74
-
75
-
76
-
77
-
78
-
79
- # ファイルパスのリストを取得
80
-
81
- rootpath = "./data/VOCdevkit/VOC2012/"
82
-
83
- train_img_list, train_anno_list, val_img_list, val_anno_list = make_datapath_list(
84
-
85
- rootpath)
86
-
87
-
88
-
89
- # Datasetを作成
90
-
91
- voc_classes = ['aeroplane', 'bicycle', 'bird', 'boat',
92
-
93
- 'bottle', 'bus', 'car', 'cat', 'chair',
94
-
95
- 'cow', 'diningtable', 'dog', 'horse',
96
-
97
- 'motorbike', 'person', 'pottedplant',
98
-
99
- 'sheep', 'sofa', 'train', 'tvmonitor']
100
-
101
- color_mean = (104, 117, 123) # (BGR)の色の平均値
102
-
103
- input_size = 300 # 画像のinputサイズを300×300にする
104
-
105
-
106
-
107
- train_dataset = VOCDataset(train_img_list, train_anno_list, phase="train", transform=DataTransform(
108
-
109
- input_size, color_mean), transform_anno=Anno_xml2list(voc_classes))
110
-
111
-
112
-
113
- val_dataset = VOCDataset(val_img_list, val_anno_list, phase="val", transform=DataTransform(
114
-
115
- input_size, color_mean), transform_anno=Anno_xml2list(voc_classes))
116
-
117
-
118
-
119
-
120
-
121
- # DataLoaderを作成する
122
-
123
- batch_size = 64
124
-
125
-
126
-
127
- train_dataloader = data.DataLoader(
128
-
129
- train_dataset, batch_size=batch_size, shuffle=True, collate_fn=od_collate_fn)
130
-
131
-
132
-
133
- val_dataloader = data.DataLoader(
134
-
135
- val_dataset, batch_size=batch_size, shuffle=False, collate_fn=od_collate_fn)
136
-
137
-
138
-
139
- # 辞書オブジェクトにまとめる
140
-
141
- dataloaders_dict = {"train": train_dataloader, "val": val_dataloader}
142
-
143
-
144
-
145
- from utils.ssd_model import SSD
146
-
147
-
148
-
149
- # SSD300の設定
150
-
151
- ssd_cfg = {
152
-
153
- 'num_classes': 21, # 背景クラスを含めた合計クラス数
154
-
155
- 'input_size': 300, # 画像の入力サイズ
156
-
157
- 'bbox_aspect_num': [4, 6, 6, 6, 4, 4], # 出力するDBoxのアスペクト比の種類
158
-
159
- 'feature_maps': [38, 19, 10, 5, 3, 1], # 各sourceの画像サイズ
160
-
161
- 'steps': [8, 16, 32, 64, 100, 300], # DBOXの大きさを決める
162
-
163
- 'min_sizes': [30, 60, 111, 162, 213, 264], # DBOXの大きさを決める
164
-
165
- 'max_sizes': [60, 111, 162, 213, 264, 315], # DBOXの大きさを決める
166
-
167
- 'aspect_ratios': [[2], [2, 3], [2, 3], [2, 3], [2], [2]],
168
-
169
- }
170
-
171
-
172
-
173
- # SSDネットワークモデル
174
-
175
- net = SSD(phase="train", cfg=ssd_cfg)
176
-
177
-
178
-
179
- # SSDの初期の重みを設定
180
-
181
- # ssdのvgg部分に重みをロードする
182
-
183
- vgg_weights = torch.load('./weights/vgg16_reducedfc.pth')
184
-
185
- net.vgg.load_state_dict(vgg_weights)
186
-
187
-
188
-
189
- # ssdのその他のネットワークの重みはHeの初期値で初期化
190
-
191
-
192
-
193
-
194
-
195
- def weights_init(m):
196
-
197
- if isinstance(m, nn.Conv2d):
198
-
199
- init.kaiming_normal_(m.weight.data)
200
-
201
- if m.bias is not None: # バイアス項がある場合
202
-
203
- nn.init.constant_(m.bias, 0.0)
204
-
205
-
206
-
207
-
208
-
209
- # Heの初期値を適用
210
-
211
- net.extras.apply(weights_init)
212
-
213
- net.loc.apply(weights_init)
214
-
215
- net.conf.apply(weights_init)
216
-
217
-
218
-
219
- # GPUが使えるかを確認
220
-
221
- device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
222
-
223
- print("使用デバイス:", device)
224
-
225
-
226
-
227
- print('ネットワーク設定完了:学習済みの重みをロードしました')
228
-
229
-
230
-
231
- from utils.ssd_model import MultiBoxLoss
232
-
233
-
234
-
235
- # 損失関数の設定
236
-
237
- criterion = MultiBoxLoss(jaccard_thresh=0.5, neg_pos=3, device=device)
238
-
239
-
240
-
241
- # 最適化手法の設定
242
-
243
- optimizer = optim.SGD(net.parameters(), lr=1e-3,
244
-
245
- momentum=0.9, weight_decay=5e-4)
246
-
247
-
248
-
249
159
  # モデルを学習させる関数を作成
250
160
 
251
161