关于ResNeXt网络的pytorch实现


Posted in Python onJanuary 14, 2020

此处需要pip install pretrainedmodels

"""
Finetuning Torchvision Models

"""

from __future__ import print_function 
from __future__ import division
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
import torchvision
from torchvision import datasets, models, transforms
import matplotlib.pyplot as plt
import time
import os
import copy
import argparse
import pretrainedmodels.models.resnext as resnext

print("PyTorch Version: ",torch.__version__)
print("Torchvision Version: ",torchvision.__version__)


# Top level data directory. Here we assume the format of the directory conforms 
#  to the ImageFolder structure
#data_dir = "./data/hymenoptera_data"
data_dir = "/media/dell/dell/data/13/"
# Models to choose from [resnet, alexnet, vgg, squeezenet, densenet, inception]
model_name = "resnext"

# Number of classes in the dataset
num_classes = 171

# Batch size for training (change depending on how much memory you have)
batch_size = 16

# Number of epochs to train for 
num_epochs = 1000

# Flag for feature extracting. When False, we finetune the whole model, 
#  when True we only update the reshaped layer params
feature_extract = False

# 参数设置,使得我们能够手动输入命令行参数,就是让风格变得和Linux命令行差不多
parser = argparse.ArgumentParser(description='PyTorch seresnet')
parser.add_argument('--outf', default='/home/dell/Desktop/zhou/train7', help='folder to output images and model checkpoints') #输出结果保存路径
parser.add_argument('--net', default='/home/dell/Desktop/zhou/train7/resnext.pth', help="path to net (to continue training)") #恢复训练时的模型路径
args = parser.parse_args()


def train_model(model, dataloaders, criterion, optimizer, num_epochs=25,is_inception=False):
#def train_model(model, dataloaders, criterion, optimizer, num_epochs=25,scheduler, is_inception=False):
  since = time.time()

  val_acc_history = []
  
  best_model_wts = copy.deepcopy(model.state_dict())
  best_acc = 0.0
  print("Start Training, resnext!") # 定义遍历数据集的次数
  with open("/home/dell/Desktop/zhou/train7/acc.txt", "w") as f1:
    with open("/home/dell/Desktop/zhou/train7/log.txt", "w")as f2:
      for epoch in range(num_epochs):
        print('Epoch {}/{}'.format(epoch+1, num_epochs))
        print('*' * 10)
        # Each epoch has a training and validation phase
        for phase in ['train', 'val']:
          if phase == 'train':
            #scheduler.step()
            model.train() # Set model to training mode
          else:
            model.eval()  # Set model to evaluate mode
    
          running_loss = 0.0
          running_corrects = 0
    
          # Iterate over data.
          for inputs, labels in dataloaders[phase]:
            inputs = inputs.to(device)
            labels = labels.to(device)
    
            # zero the parameter gradients
            optimizer.zero_grad()
    
            # forward
            # track history if only in train
            with torch.set_grad_enabled(phase == 'train'):
              # Get model outputs and calculate loss
              # Special case for inception because in training it has an auxiliary output. In train
              #  mode we calculate the loss by summing the final output and the auxiliary output
              #  but in testing we only consider the final output.
              if is_inception and phase == 'train':
                # From https://discuss.pytorch.org/t/how-to-optimize-inception-model-with-auxiliary-classifiers/7958
                outputs, aux_outputs = model(inputs)
                loss1 = criterion(outputs, labels)
                loss2 = criterion(aux_outputs, labels)
                loss = loss1 + 0.4*loss2
              else:
                outputs = model(inputs)
                loss = criterion(outputs, labels)
    
              _, preds = torch.max(outputs, 1)
    
              # backward + optimize only if in training phase
              if phase == 'train':
                loss.backward()
                optimizer.step()
    
            # statistics
            running_loss += loss.item() * inputs.size(0)
            running_corrects += torch.sum(preds == labels.data)
          epoch_loss = running_loss / len(dataloaders[phase].dataset)
          epoch_acc = running_corrects.double() / len(dataloaders[phase].dataset)
    
          print('{} Loss: {:.4f} Acc: {:.4f}'.format(phase, epoch_loss, epoch_acc))
          f2.write('{} Loss: {:.4f} Acc: {:.4f}'.format(phase, epoch_loss, epoch_acc))
          f2.write('\n')
          f2.flush()           
          # deep copy the model
          if phase == 'val':
            if (epoch+1)%5==0:
              #print('Saving model......')
              torch.save(model.state_dict(), '%s/inception_%03d.pth' % (args.outf, epoch + 1))
            f1.write("EPOCH=%03d,Accuracy= %.3f%%" % (epoch + 1, 100*epoch_acc))
            f1.write('\n')
            f1.flush()
          if phase == 'val' and epoch_acc > best_acc:
            f3 = open("/home/dell/Desktop/zhou/train7/best_acc.txt", "w")
            f3.write("EPOCH=%d,best_acc= %.3f%%" % (epoch + 1,100*epoch_acc))
            f3.close()
            best_acc = epoch_acc
            best_model_wts = copy.deepcopy(model.state_dict())
          if phase == 'val':
            val_acc_history.append(epoch_acc)

  time_elapsed = time.time() - since
  print('Training complete in {:.0f}m {:.0f}s'.format(time_elapsed // 60, time_elapsed % 60))
  print('Best val Acc: {:4f}'.format(best_acc))
  # load best model weights
  model.load_state_dict(best_model_wts)
  return model, val_acc_history


def set_parameter_requires_grad(model, feature_extracting):
  if feature_extracting:
    for param in model.parameters():
      param.requires_grad = False



def initialize_model(model_name, num_classes, feature_extract, use_pretrained=True):
  # Initialize these variables which will be set in this if statement. Each of these
  #  variables is model specific.
  model_ft = None
  input_size = 0

  if model_name == "resnet":
    """ Resnet18
    """
    model_ft = models.resnet18(pretrained=use_pretrained)
    set_parameter_requires_grad(model_ft, feature_extract)
    num_ftrs = model_ft.fc.in_features
    model_ft.fc = nn.Linear(num_ftrs, num_classes)
    input_size = 224

  elif model_name == "alexnet":
    """ Alexnet
    """
    model_ft = models.alexnet(pretrained=use_pretrained)
    set_parameter_requires_grad(model_ft, feature_extract)
    num_ftrs = model_ft.classifier[6].in_features
    model_ft.classifier[6] = nn.Linear(num_ftrs,num_classes)
    input_size = 224

  elif model_name == "vgg":
    """ VGG11_bn
    """
    model_ft = models.vgg11_bn(pretrained=use_pretrained)
    set_parameter_requires_grad(model_ft, feature_extract)
    num_ftrs = model_ft.classifier[6].in_features
    model_ft.classifier[6] = nn.Linear(num_ftrs,num_classes)
    input_size = 224

  elif model_name == "squeezenet":
    """ Squeezenet
    """
    model_ft = models.squeezenet1_0(pretrained=use_pretrained)
    set_parameter_requires_grad(model_ft, feature_extract)
    model_ft.classifier[1] = nn.Conv2d(512, num_classes, kernel_size=(1,1), stride=(1,1))
    model_ft.num_classes = num_classes
    input_size = 224

  elif model_name == "densenet":
    """ Densenet
    """
    model_ft = models.densenet121(pretrained=use_pretrained)
    set_parameter_requires_grad(model_ft, feature_extract)
    num_ftrs = model_ft.classifier.in_features
    model_ft.classifier = nn.Linear(num_ftrs, num_classes) 
    input_size = 224

  elif model_name == "resnext":
    """ resnext
    Be careful, expects (3,224,224) sized images 
    """
    model_ft = resnext.resnext101_64x4d(num_classes=1000, pretrained='imagenet')
    set_parameter_requires_grad(model_ft, feature_extract)
    model_ft.last_linear = nn.Linear(2048, num_classes)   
    #pre='/home/dell/Desktop/zhou/train6/inception_009.pth'
    #model_ft.load_state_dict(torch.load(pre))
    input_size = 224

  else:
    print("Invalid model name, exiting...")
    exit()
  
  return model_ft, input_size

# Initialize the model for this run
model_ft, input_size = initialize_model(model_name, num_classes, feature_extract, use_pretrained=True)

# Print the model we just instantiated
#print(model_ft) 



data_transforms = {
  'train': transforms.Compose([
    transforms.RandomResizedCrop(input_size),
    transforms.RandomHorizontalFlip(),
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
  ]),
  'val': transforms.Compose([
    transforms.Resize(input_size),
    transforms.CenterCrop(input_size),
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
  ]),
}

print("Initializing Datasets and Dataloaders...")


# Create training and validation datasets
image_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x), data_transforms[x]) for x in ['train', 'val']}
# Create training and validation dataloaders
dataloaders_dict = {x: torch.utils.data.DataLoader(image_datasets[x], batch_size=batch_size, shuffle=True, num_workers=4) for x in ['train', 'val']}

# Detect if we have a GPU available
device = torch.device("cuda:1" if torch.cuda.is_available() else "cpu")

#we='/home/dell/Desktop/dj/inception_050.pth'
#model_ft.load_state_dict(torch.load(we))#diaoyong
# Send the model to GPU
model_ft = model_ft.to(device)

params_to_update = model_ft.parameters()
print("Params to learn:")
if feature_extract:
  params_to_update = []
  for name,param in model_ft.named_parameters():
    if param.requires_grad == True:
      params_to_update.append(param)
      print("\t",name)
else:
  for name,param in model_ft.named_parameters():
    if param.requires_grad == True:
      print("\t",name)

# Observe that all parameters are being optimized
optimizer_ft = optim.SGD(params_to_update, lr=0.01, momentum=0.9)
# Decay LR by a factor of 0.1 every 7 epochs
#exp_lr_scheduler = lr_scheduler.StepLR(optimizer_ft, step_size=30, gamma=0.95)

# Setup the loss fxn
criterion = nn.CrossEntropyLoss()
print(model_ft)
# Train and evaluate
model_ft, hist = train_model(model_ft, dataloaders_dict, criterion, optimizer_ft, num_epochs=num_epochs, is_inception=False)

以上这篇关于ResNeXt网络的pytorch实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python splitlines使用技巧
Sep 06 Python
python使用matplotlib绘制柱状图教程
Feb 08 Python
Pycharm学习教程(7)虚拟机VM的配置教程
May 04 Python
Python内建函数之raw_input()与input()代码解析
Oct 26 Python
基于循环神经网络(RNN)的古诗生成器
Mar 26 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
Jul 25 Python
django orm 通过related_name反向查询的方法
Dec 15 Python
Python装饰器用法实例分析
Jan 14 Python
学习和使用python的13个理由
Jul 30 Python
python实现堆排序的实例讲解
Feb 21 Python
python实现秒杀商品的微信自动提醒功能(代码详解)
Apr 27 Python
python利用opencv保存、播放视频
Nov 02 Python
Python属性和内建属性实例解析
Jan 14 #Python
Python程序控制语句用法实例分析
Jan 14 #Python
dpn网络的pytorch实现方式
Jan 14 #Python
Django之form组件自动校验数据实现
Jan 14 #Python
简单了解python filter、map、reduce的区别
Jan 14 #Python
Python vtk读取并显示dicom文件示例
Jan 13 #Python
Python解析多帧dicom数据详解
Jan 13 #Python
You might like
PHP一些常用的正则表达式字符的一些转换
2008/07/29 PHP
PHP常用文件操作函数和简单实例分析
2016/06/03 PHP
浅谈PHP eval()函数定义和用法
2016/06/21 PHP
JavaScript.Encode手动解码技巧
2010/07/14 Javascript
javascript 从if else 到 switch case 再到抽象
2010/07/17 Javascript
JavaScript中switch判断容易犯错的一个细节
2014/08/27 Javascript
常用的jquery模板插件——jQuery Boilerplate介绍
2014/09/23 Javascript
JS实现自适应高度表单文本框的方法
2015/02/25 Javascript
jQuery使用addClass()方法给元素添加多个class样式
2015/03/26 Javascript
跟我学习javascript的作用域与作用域链
2015/11/19 Javascript
js实现炫酷的左右轮播图
2017/01/18 Javascript
webpack学习笔记之代码分割和按需加载的实例详解
2017/07/20 Javascript
判断jQuery是否加载完成,没完成继续判断的解决方法
2017/12/06 jQuery
微信小程序代码上传、审核发布小程序
2019/05/18 Javascript
JS window对象简单操作完整示例
2020/01/14 Javascript
Python 元组(Tuple)操作详解
2014/03/11 Python
Python标准模块--ContextManager上下文管理器的具体用法
2017/11/27 Python
对python中数组的del,remove,pop区别详解
2018/11/07 Python
python基于Selenium的web自动化框架
2019/07/14 Python
pycharm编写spark程序,导入pyspark包的3中实现方法
2019/08/02 Python
解析PyCharm Python运行权限问题
2020/01/08 Python
pycharm激活码快速激活及使用步骤
2020/03/12 Python
python字符串判断密码强弱
2020/03/18 Python
numpy中生成随机数的几种常用函数(小结)
2020/08/18 Python
python线程优先级队列知识点总结
2021/02/28 Python
HTML5之WebGL 3D概述(下)—借助类库开发及框架介绍
2013/01/31 HTML / CSS
物业保安员岗位职责制度
2014/01/30 职场文书
善意的谎言事例
2014/02/15 职场文书
技术总监管理职责范本
2014/03/06 职场文书
学校校庆演讲稿
2014/05/22 职场文书
2015年大学生党员承诺书
2015/04/27 职场文书
劳动仲裁调解书
2015/05/20 职场文书
高三生物教学反思
2016/02/22 职场文书
详解CSS开发过程中的20个快速提升技巧
2021/05/21 HTML / CSS
centos8安装MongoDB的详细过程
2021/10/24 MongoDB
Python 数据可视化神器Pyecharts绘制图像练习
2022/02/28 Python