本人是初学神经网络,对代码里面的配置设计不是很了解,尝试搜索了各种方法,但都没法解决,
先摆一下基本参数:
python:3.9.19
cuda:11.5 # nvidia-smi查看的最高支持版本是12.2
cudnn:8302
pytorch:1.11.0+cu115
在这个配置的pytorch_gpu环境下尝试运行过别人的代码,是可以在GPU上跑的,也就是说环境应该是没问题的
以下是我自己的代码:(删减了一些print,主体是没有删减的)
class BPNeuralNetwork(nn.Module):
def __init__(self): # 设置在BP神经网络中用到的参数
self.dataloader = None
self.model = None
self.input_n = 0
self.hidden_n = 0
self.output_n = 0
self.dataset = 'single_tone_estimation'
self.save_dir = 'modelsave'
self.model_name = 'bpnntest'
super(BPNeuralNetwork, self).__init__()
def setup(self, arg): # 参数设置
self.input_n = arg.ni
self.hidden_n = arg.nh
self.output_n = arg.no
self.model = nn.Sequential(nn.Linear(self.input_n, self.hidden_n, True),
nn.Sigmoid(),
nn.Linear(self.hidden_n, self.output_n, True),
nn.Sigmoid())
def bptrain(self, batch_size, epochs, learn_rate, filenum):
self.train_hist = {}
self.train_hist['loss'] = []
self.train_hist['per_epoch_time'] = []
self.train_hist['total_time'] = []
# loss
self.criterion = torch.nn.MSELoss()
# optimizer
self.optimizer = torch.optim.SGD(self.model.parameters(), learn_rate, weight_decay=1e-6)
if torch.cuda.is_available():
print(True)
self.model = self.model.cuda() # 将模型加载到GPU上去
self.criterion = self.criterion.cuda()
print("-" * 25)
print('BPNN开始循环训练...\n')
loss_list = []
lr_list = []
start_time = time.time()
for j in range(epochs):
epoch_start_time = time.time()
for datafile in range(filenum): # 共四个训练数据集
self.dataloader = load_data(batch_size, datafile)
for iters, (datas, labels) in enumerate(self.dataloader, 0): # 依次提取样本数据,一次循环是一个batch
datas = Variable(datas).cuda()
labels = Variable(labels).cuda()
model_outputs = self.model(datas)
# ===========求在偏差范围内的输出个数==========detach().
acc_temp = 0
model_outputs_cpu = model_outputs.cpu().detach().numpy()
labels_cpu = labels.cpu().detach().numpy()
for i in range(len(labels)):
if abs(labels_cpu[i, 0] - model_outputs_cpu[i, 0]) <= 0.001:
if abs(labels_cpu[i, 1] - model_outputs_cpu[i, 1]) <= 0.01:
acc_temp += 1
acc += acc_temp # 计算模型当前的识别率
total += batch_size
# 求损失loss
labels = labels.to(torch.float32) # 由于backward(),需要先转换类型
loss = self.criterion(model_outputs, labels)
loss_list.append(float(loss))
# 使用优化器优化损失
self.optimizer.zero_grad() # 清空上一步残余更新参数值
loss.backward() # 误差反向传播,计算参数更新值
self.optimizer.step()
train_loss += loss.item()
print("file:[%4d] Loss:%.3f | acc: %.3f%%" %
(datafile, (train_loss / (j + 1)), 100 * acc / total))
lr_list.append(self.optimizer.state_dict()['param_groups'][0]['lr'])
self.train_hist['per_epoch_time'].append(time.time() - epoch_start_time)
# 保存训练的模型
self.save()
按照之前搜到的帖子,模型、损失函数、数据,我都添加了.cuda(),加.to(device)也尝试过,但运行起来GPU调用还是0
自己也在想会不会是其他配置或者代码有问题,但目前实在是不知道问题出在哪,如果有佬之前有类似情况并解决,也麻烦给我参考参考,万分感谢!
针对已有回答的回复:
(1)有使用如下代码,
print(torch.cuda.is_available()) # 输出为 True
print(labels.device, datas.device, next(self.model.parameters()).device) # 输出均为cuda:0
(2).to(device)尝试过了,前面已经说过了
(3)问答区真的没有真人吗?