pytorch训练神经网络,pytorch训练好的神经网络模型怎么保存
本文主要为大家介绍Pytorch卷积神经网络偏移学习的目标实现代码和好处。有需要的朋友可以借鉴一下,希望能有所帮助。祝大家进步很大,早日升职加薪。
00-1010前言一、经典卷积神经网络二、目标三、收益四、步骤五、迁移学习的代码
目录
在深度学习和训练的过程中,随着网络层的完善,我们训练的数量和参数会增加,训练时间也会相应增加。今天,我们将学习迁移学习。
前言
在pytorch官网,我们可以看到很多经典的卷积神经网络。
附官方网站链接:https://pytorch.org/
下面简单介绍一下经典卷积神经的发展。
1.首先可以说是卷积神经网络的开山之作,Alex Net(12年冠军)。这里简单说一下缺点:卷积核大,步长长,没有填充层,特征提取剧烈,一些重要特征容易被忽略。
2.第二个是VGG网络。其卷积核大小为3*3。一个好处是通过池层后,通道数量翻倍,可以保留更多的特征。这是VGG的特色。
在接下来的一段时间里,出现了一个问题。我们都知道,深度学习的效果应该是随着训练次数的增加越来越好,但是这里出现了一个问题。研究发现,随着VGG网络的不断完善,效果不如原来。这个时候人们以为深度学习只能发展到这里,然后就遇到了瓶颈。
3.接下来,剩余网络(Resnet)的提出,解决了上述问题。这种网络的优点是保留了原有的特征。如果卷积后提取的特征不如原图,那么保留原特征,就解决了这个问题。这里是resnet网络模型。
以下是一些培训对比:
一、经典的卷积神经网络
首先,使用迁移学习的目的是用别人训练的权重参数和偏差参数来训练我们的模型。
二、迁移学习的目标
深度学习要训练的数据量非常大。当数据量很小时,我们训练的权重参数就不会那么好了,所以这个时候我们可以使用别人训练的权重参数和偏倚参数,这样会提高我们模型的精度。
三、好处
学习可以分为三步。
1.加载模型
2.冻结图层
3.全连接层
四、步骤
这里使用的是Resnet152。
进口火炬
将torchvision作为电视导入
将torch.nn作为nn导入
进口火炬视觉
导入torch.nn.functional as F
将torchvision.transforms作为转换导入
进口火炬
从torch.utils导入数据
从火炬进口optim
来自torch.autograd导入变量
model_name=resnet
featuer _ extract=True
train _ on _ GPU=torch . cuda . is _ available()
如果不是train_on_gpu:
打印(“无gpu”)
else :
打印(是gpu )
devic=torch . device( cuda :0 if torch . cuda . is _ available()else CPU )
teature_extract=True
def set _ paremeter _ requires _ grad(模型,特征_提取):
if featuer _ extract:
对于model.parameters():中的参数
帕尔马。requirements _ grad=false #无培训
def initialize_model(模型名,类数,f
eatuer_extract,use_pretrained=True):
model_ft = None
input_size = 0
if model_name=="resnet":
model_ft=tv.models.resnet152(pretrained=use_pretrained)#下载模型
set_paremeter_requires_grad(model_ft,featuer_extract) #冻结层数
num_ftrs=model_ft.fc.in_features #改动全连接层
model_ft.fc=nn.Sequential(nn.Linear(num_ftrs,num_classes),
nn.LogSoftmax(dim=1))
input_size=224 #输入维度
return model_ft,input_size
model_ft,iput_size=initialize_model(model_name,10,featuer_extract,use_pretrained=True)
model_ft=model_ft.to(devic)
params_to_updata=model_ft.parameters()
if featuer_extract:
params_to_updata=[]
for name,param in model_ft.named_parameters():
if param.requires_grad==True:
params_to_updata.append(param)
print("\t",name)
else:
for name,param in model_ft.parameters():
if param.requires_grad==True:
print("\t",name)
opt=optim.Adam(params_to_updata,lr=0.01)
loss=nn.NLLLoss()
if __name__ == __main__:
transform = transforms.Compose([
# 图像增强
transforms.Resize(1024),#裁剪
transforms.RandomHorizontalFlip(),#随机水平翻转
transforms.RandomCrop(224),#随机裁剪
transforms.ColorJitter(brightness=0.5, contrast=0.5, hue=0.5), #亮度
# 转变为tensor 正则化
transforms.ToTensor(), #转换格式
transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225)) # 归一化处理
])
trainset = tv.datasets.CIFAR10(
root=rE:\桌面\资料\cv3\数据集\cifar-10-batches-py,
train=True,
download=True,
transform=transform
)
trainloader = data.DataLoader(
trainset,
batch_size=8,
drop_last=True,
shuffle=True, # 乱序
num_workers=4,
)
testset = tv.datasets.CIFAR10(
root=rE:\桌面\资料\cv3\数据集\cifar-10-batches-py,
train=False,
download=True,
transform=transform
)
testloader = data.DataLoader(
testset,
batch_size=8,
drop_last=True,
shuffle=False,
num_workers=4
)
for epoch in range(3):
running_loss=0
for index,data in enumerate(trainloader,0):
inputs, labels = data
inputs = inputs.to(devic)
labels = labels.to(devic)
inputs, labels = Variable(inputs), Variable(labels)
opt.zero_grad()
h=model_ft(inputs)
loss1=loss(h,labels)
loss1.backward()
opt.step()
h+=loss1.item()
if index%10==9:
avg_loss=loss1/10.
running_loss=0
print(avg_loss,avg_loss)
if index%100==99 :
correct=0
total=0
for data in testloader:
images,labels=data
outputs=model_ft(Variable(images.cuda()))
_,predicted=torch.max(outputs.cpu(),1)
total+=labels.size(0)
bool_tensor=(predicted==labels)
correct+=bool_tensor.sum()
print(1000张测试集中的准确率为%d %%%(100*correct/total))
以上就是Pytorch卷积神经网络迁移学习的目标及好处的详细内容,更多关于Pytorch卷积神经网络迁移的资料请关注盛行IT软件开发工作室其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。