46.人工智能——多标签分类模型演习与猜测_模子_精确率
数据集处理可以参看:44.人工智能——深度学习飞桨框架自定义数据集
一、模型演习# 定义丢失函数和优化器optimizer = paddle.optimizer.Adam(parameters=model.parameters(), learning_rate=0.0001)criterion = paddle.nn.CrossEntropyLoss() #交叉熵丢失函数#迭代10次for epoch in range(0, 10): Train_Loss, Val_Loss = [], [] #演习集和验证集丢失 Train_ACC1, Train_ACC2 = [], [] #两个分类的演习集准确率 Val_ACC1, Val_ACC2 = [], [] #两个分类的验证集准确率 # 模型演习 model.train() for i, (x, y1, y2) in enumerate(train_loader): pred1, pred2 = model(x) #返回两个分类的预测结果 # 种别1 loss + 种别2 loss 为统共的loss loss = criterion(pred1, y1) + criterion(pred2, y2) Train_Loss.append(loss.item()) loss.backward() #后向传播 optimizer.step() optimizer.clear_grad() #打消梯度 #打算演习集准确率 Train_ACC1.append((pred1.argmax(1) == y1.flatten()).numpy().mean()) Train_ACC2.append((pred2.argmax(1) == y2.flatten()).numpy().mean()) # 模型验证 model.eval() for i, (x, y1, y2) in enumerate(val_loader): pred1, pred2 = model(x) loss = criterion(pred1, y1) + criterion(pred2, y2) Val_Loss.append(loss.item()) Val_ACC1.append((pred1.argmax(1) == y1.flatten()).numpy().mean()) Val_ACC2.append((pred2.argmax(1) == y2.flatten()).numpy().mean())#输出每轮演习的丢失和准确率结果 if epoch % 1 == 0: print(f'\nEpoch: {epoch}') print(f'Loss {np.mean(Train_Loss):3.5f}/{np.mean(Val_Loss):3.5f}') print(f'period.ACC {np.mean(Train_ACC1):3.5f}/{np.mean(Val_ACC1):3.5f}') print(f'weather.ACC {np.mean(Train_ACC2):3.5f}/{np.mean(Val_ACC2):3.5f}')
运行时长: 14分钟32秒200毫秒 (配置:CPU 4 RAM 32GB GPU v100 显存 32GB)
Epoch: 0Loss 0.67820/0.91601period.ACC 0.83705/0.87755weather.ACC 0.90687/0.80303Epoch: 1Loss 0.45776/0.52330period.ACC 0.88003/0.91812weather.ACC 0.94154/0.92007Epoch: 2Loss 0.29609/0.43050period.ACC 0.92665/0.93465weather.ACC 0.96733/0.92488Epoch: 3Loss 0.24431/0.35368period.ACC 0.93918/0.94681weather.ACC 0.97137/0.94336Epoch: 4Loss 0.19728/0.45975period.ACC 0.94639/0.95117weather.ACC 0.97869/0.92398Epoch: 5Loss 0.15340/0.62083period.ACC 0.96285/0.92488weather.ACC 0.98532/0.87951Epoch: 6Loss 0.13045/0.30670period.ACC 0.97243/0.94787weather.ACC 0.98499/0.95418Epoch: 7Loss 0.10771/0.45103period.ACC 0.97374/0.93630weather.ACC 0.98569/0.94546Epoch: 8Loss 0.10212/0.42113period.ACC 0.97363/0.93570weather.ACC 0.98878/0.94832Epoch: 9Loss 0.08798/0.48527period.ACC 0.97622/0.94636weather.ACC 0.99042/0.93525
从演习结果来看,末了韶光和蔼象分类的结果都达到93%以上。
#保存模型参数,用于后面预测paddle.save(model.state_dict(),"pwmodel/pw.pdparams")
二、模型预测
#韶光和蔼象分类pclasses=period_dict.tolist()wclasses=weather_dict.tolist()print(pclasses)print(wclasses)
输出:
['Morning', 'Afternoon', 'Dawn', 'Dusk']['Cloudy', 'Sunny', 'Rainy']
预测图片:
00147
00949
00953
#预测import cv2model=WeatherModel() #初始化模型model_dict=paddle.load("pwmodel/pw.pdparams") model.load_dict(model_dict) #加载模型演习参数model.eval()testfile="test_images/00147.jpg"img=cv2.imread(testfile)#print(img.shape)transform=T.Compose([ T.Resize(size=(640,360)), T.RandomCrop(size=(256, 256)), T.ToTensor(), T.Normalize(mean=0.5, std=0.5)])img=transform(img)img=img.reshape((1,3,256,256))#print(img.shape)results=model(paddle.to_tensor(img))results=list(results)p=np.argsort(results[0].numpy())w=np.argsort(results[1].numpy())print(pclasses[p[0][-1]],wclasses[w[0][-1]])
预测结果:
Morning Cloudy
本文系作者个人观点,不代表本站立场,转载请注明出处!