怎样建设公司的网站,网站刚通过备案,杭州建网站的公司,淄博手机网站建设报价目录
一、前言#xff1a;
二、前期准备#xff1a;
1、设备查看
2、导入收集到的数据集
3、数据预处理
4、划分数据集#xff08;8:2#xff09;
5、加载数据集
三、搭建神经网络
四、训练模型
1、设置超参数
2、编写训练函数
3、编写测试函数
4、正式训练
…目录
一、前言
二、前期准备
1、设备查看
2、导入收集到的数据集
3、数据预处理
4、划分数据集8:2
5、加载数据集
三、搭建神经网络
四、训练模型
1、设置超参数
2、编写训练函数
3、编写测试函数
4、正式训练
五、可视化结果
六、预测
1、预测函数
2、指定图片进行预测
七、模型保存
八、运行结果展示
①使用原有的网络模型测试集的精确度基本上在82%左右。
②在原有网络模型的基础上添加了relu激活函数
③减小学习率
④增大学习率 本文为365天深度学习训练营 中的学习记录博客 原作者K同学啊 | 接辅导、项目定制 一、前言
本篇博文主要使用猴痘数据集来训练模型大部分的代码还是之前的很类似不同的地方在意使用的模型参数不同模型也都是类似的。这篇文章里面你可以学会如何保存训练好的模型如何使用保存的的模型进行预测。
如以往一样可以先大概看下目录你的脑海会有大概得流程。
二、前期准备
1、设备查看
# 1、设备相关
device torch.device(cuda:0 if torch.cuda.is_available() else cpu)
print(device)
2、导入收集到的数据集
我的数据集文件夹是这样的
①一个是带有猴痘的图片的文件夹②一个是其他痘的文件夹 # 2、导入数据
data_dir ./data
data_dir pathlib.Path(data_dir) # 获取到文件data的名称data_paths list(data_dir.glob(*)) # 获取到文件夹data下面子文件夹的名称 [PosixPath(data/Others), PosixPath(data/Monkeypox)]
classNames [str(path).split(/)[1] for path in data_paths] # 获取到子文件夹的名称 [Others, Monkeypox]3、数据预处理
# 3、数据处理
train_transforms transforms.Compose([transforms.Resize([224, 224]),transforms.ToTensor(),transforms.Normalize(mean[0.485, 0.456, 0.406],std[0.229, 0.224, 0.225])
])total_data datasets.ImageFolder(./data,transformtrain_transforms)
# print(total_data.class_to_idx) # {Monkeypox: 0, Others: 1} total_data.class_to_idx 是一个存储了数据集类别和对应索引的字典。4、划分数据集8:2
# 4、划分数据集
train_size int(0.8*len(total_data))
test_size len(total_data) - train_size
train_dataset, test_dataset torch.utils.data.random_split(total_data,[train_size, test_size])
# print(len(train_dataset), len(test_dataset)) # 1713 4295、加载数据集
# 5、加载数据集
batch_size 32
train_dl torch.utils.data.DataLoader(train_dataset,batch_sizebatch_size,shuffleTrue,num_workers1)
test_dl torch.utils.data.DataLoader(test_dataset,batch_sizebatch_size,shuffleTrue,num_workers1)
print(准备工作结束。。。。)
三、搭建神经网络
网络图如下 # 猴痘的模型
class Network_bn(nn.Module):def __init__(self):super(Network_bn, self).__init__()默认stride为1 padding为0self.conv1 nn.Conv2d(in_channels3, out_channels12, kernel_size5, stride1, padding0)self.bn1 nn.BatchNorm2d(12)self.conv2 nn.Conv2d(in_channels12, out_channels12, kernel_size5, stride1, padding0)self.bn2 nn.BatchNorm2d(12)self.pool1 nn.MaxPool2d(2, 2)self.conv3 nn.Conv2d(in_channels12, out_channels24, kernel_size5, stride1, padding0)self.bn3 nn.BatchNorm2d(24)self.conv4 nn.Conv2d(in_channels24, out_channels24, kernel_size5, stride1, padding0)self.bn4 nn.BatchNorm2d(24)self.pool2 nn.MaxPool2d(2, 2)self.fc nn.Linear(24*50*50, 2)self.relu nn.ReLU(inplaceTrue)def forward(self, x):x F.relu(self.bn1(self.conv1(x)))x F.relu(self.bn2(self.conv2(x)))x self.pool1(x)x F.relu(self.bn3(self.conv3(x)))x F.relu(self.bn4(self.conv4(x)))x self.pool2(x)x x.view(-1, 24*50*50)x self.fc(x)x self.relu(x)return xmodel Network_bn().to(device)
print(model)
四、训练模型
1、设置超参数
# 三、训练模型
# 1、 设置超参数
loss_fn nn.CrossEntropyLoss() # 创建损失函数
learn_rate 1e-4 # 学习率
opt torch.optim.SGD(model.parameters(), lrlearn_rate)2、编写训练函数
# 2、编写训练函数
def train(dataloader, model, loss_fn, optimizer):size len(dataloader.dataset) # 训练集大小num_batches len(dataloader) # 批次数目train_acc, train_loss 0, 0for X, y in dataloader: # 获取图片及其标签X, y X.to(device), y.to(device)# 计算预测误差pred model(X) # 网络输出loss loss_fn(pred, y) # 计算网络输出与真实值之间的差距。# 反向传播optimizer.zero_grad() # grad属性归零loss.backward() # 反向传播optimizer.step() # 每一步自动更新# 记录acc与losstrain_acc (pred.argmax(1) y).type(torch.float).sum().item()train_loss loss.item()train_acc / sizetrain_loss / num_batchesreturn train_acc, train_loss
3、编写测试函数
# 3、 编写测试函数def test(dataloader, model, loss_fn):size len(dataloader.dataset) # 测试集大小num_batches len(dataloader) # 批次数目test_acc, test_loss 0, 0# 当不进行训练时停止梯度更新节省计算内存消耗with torch.no_grad():for imgs, target in dataloader:imgs, target imgs.to(device), target.to(device)# 计算损失target_pred model(imgs)loss loss_fn(target_pred, target)test_acc (target_pred.argmax(1) target).type(torch.float).sum().item()test_loss loss.item()test_acc / sizetest_loss / num_batchesreturn test_acc, test_loss
4、正式训练
# 正式训练
epochs 20
train_loss []
train_acc []
test_loss []
test_acc []for epoch in range(epochs):model.train()epoch_train_acc, epoch_train_loss train(train_dl, model, loss_fn, opt)model.eval()epoch_test_acc, epoch_test_loss test(test_dl, model, loss_fn)train_acc.append(epoch_train_acc)train_loss.append(epoch_train_loss)test_acc.append(epoch_test_acc)test_loss.append(epoch_test_loss)template Epoch:{:2d}, Train_acc:{:.1f}%, Train_loss:{:.3f}, Test_acc:{:.1f}%, Test_loss:{:.3f}print(template.format(epoch1, epoch_train_acc*100, epoch_train_loss, epoch_test_acc*100, epoch_test_loss))
print(Done)
五、可视化结果
# 结果可视化
warnings.filterwarnings(ignore) # 忽略警告信息
plt.rcParams[axes.unicode_minus] False # 用来正常显示负号
plt.rcParams[figure.dpi] 100 # 分辨率epochs_range range(epochs)plt.figure(figsize(12,3))
plt.subplot(1, 2, 1)
plt.plot(epochs_range, train_acc, labelTraining Acc)
plt.plot(epochs_range, test_acc, labelTest Acc)
plt.legend(loclower right)
plt.title(Training and Validation Acc)plt.subplot(1, 2, 2)
plt.plot(epochs_range, train_loss, labelTraining Loss)
plt.plot(epochs_range, test_loss, labelTest Loss)
plt.legend(locupper right)
plt.title(Training and Validation Loss)plt.savefig(/data/jupyter/deepinglearning_train_folder/p04_weather/resultImg.jpg)
plt.show()
六、预测
1、预测函数
classes list(total_data.class_to_idx)
print(classes:, classes)# 预测训练集中的某张图片
predict_one_image(image_path./data/Monkeypox/M01_01_00.jpg,modelmodel,transformtrain_transforms,classesclasses)
2、指定图片进行预测
# 预测函数
def predict_one_image(image_path, model, transform, classes):test_img Image.open(image_path).convert(RGB)test_img transform(test_img)img test_img.to(device).unsqueeze(0)model.eval()output model(img)_, pred torch.max(output, 1)pred_class classes[pred]print(f预测结果是{pred_class})
七、模型保存
# 模型保存
PATH ./model.pth # 保存的模型
torch.save(model.state_dict(), PATH)# 将参数加载到model当中
model.load_state_dict(torch.load(PATH, map_locationdevice)) 我是在具有GPU的服务器上训练的模型
八、运行结果展示
①使用原有的网络模型测试集的精确度基本上在82%左右。 ②在原有网络模型的基础上添加了relu激活函数
可使得精度提高2%左右。但是训练精度减少了。 ③减小学习率
使得测试精度直线下降 ④增大学习率
也可以使得测试精确度提高2%左右还会使得训练的精确度更好达到98.7%