在pytorch中计算平均loss如下代码:
- t = tqdm(trainLoader, leave=False, total=len(trainLoader))
- for i, (idx, targetVar, inputVar, _, _) in enumerate(t):
- inputs = inputVar.to(device)
- label = targetVar.to(device)
- optimizer.zero_grad()
- net.train()
- pred = net(inputs) # B,S,C,H,W
- loss = lossfunction(pred, label)
- loss_aver = loss.item() / args.batch_size #pytorch中直接用.item()转换为标量
- train_losses.append(loss_aver)
- loss.backward()
- optimizer.step()
而mindspore中item不行
- data_iterator = validDataset.create_tuple_iterator()
- for data, label in data_iterator:
- output = net(data)
- loss = lossfunction(output, label)
- loss_aver = loss.item() / args.batch_size
- valid_losses.append(loss_aver)
会报错
ValueError: Can only convert an array of size 1 to a Python scalar
float也不行
- data_iterator = validDataset.create_tuple_iterator()
- for data, label in data_iterator:
- output = net(data)
- loss = lossfunction(output, label)
- loss_aver = float(loss) / args.batch_size
- valid_losses.append(loss_aver)
会报错
TypeError: float() argument must be a string or a number, not 'Tensor'
那请问如何操作把tensor转为标量呢? 已经翻了一下午mindspore文档了都找不到呜呜呜
解答:
loss.asnumpy().item()解决的 先转为numpy再换标量