一、导入库
import torch
import torch. nn as nn
import torchvision. transforms as transforms
import torchvision
from torchvision import transforms, datasets
import os, PIL, pathlib, warnings
import os, PIL, random, pathlib
import torch. nn. functional as F
import torch
import torch. nn as nn
import torchsummary as summary
import copy
import matplotlib. pyplot as plt
查看使用的是GPU还是CPU
warnings. filterwarnings( "ignore" )
device = torch. device( "cuda" if torch. cuda. is_available( ) else "cpu" )
二、导入数据
data_dir = './data/PotatoPlants/'
data_dir = pathlib. Path( data_dir)
data_paths = list ( data_dir. glob( '*' ) )
classeNames = [ str ( path) . split( "\\" ) [ 2 ] for path in data_paths]
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 ] )
] )
test_transform = 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/PotatoPlants/" , transform= train_transforms)
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] )
batch_size = 32
train_dl = torch. utils. data. DataLoader( train_dataset,
batch_size= batch_size,
shuffle= True ,
num_workers= 1 )
test_dl = torch. utils. data. DataLoader( test_dataset,
batch_size= batch_size,
shuffle= True ,
num_workers= 1 )
三、搭建模型
class vgg16 ( nn. Module) :
def __init__ ( self) :
super ( vgg16, self) . __init__( )
self. block1 = nn. Sequential(
nn. Conv2d( 3 , 64 , kernel_size= ( 3 , 3 ) , stride= ( 1 , 1 ) , padding= ( 1 , 1 ) ) ,
nn. ReLU( ) ,
nn. Conv2d( 64 , 64 , kernel_size= ( 3 , 3 ) , stride= ( 1 , 1 ) , padding= ( 1 , 1 ) ) ,
nn. ReLU( ) ,
nn. MaxPool2d( kernel_size= ( 2 , 2 ) , stride= ( 2 , 2 ) )
)
self. block2 = nn. Sequential(
nn. Conv2d( 64 , 128 , kernel_size= ( 3 , 3 ) , stride= ( 1 , 1 ) , padding= ( 1 , 1 ) ) ,
nn. ReLU( ) ,
nn. Conv2d( 128 , 128 , kernel_size= ( 3 , 3 ) , stride= ( 1 , 1 ) , padding= ( 1 , 1 ) ) ,
nn. ReLU( ) ,
nn. MaxPool2d( kernel_size= ( 2 , 2 ) , stride= ( 2 , 2 ) )
)
self. block3 = nn. Sequential(
nn. Conv2d( 128 , 256 , kernel_size= ( 3 , 3 ) , stride= ( 1 , 1 ) , padding= ( 1 , 1 ) ) ,
nn. ReLU( ) ,
nn. Conv2d( 256 , 256 , kernel_size= ( 3 , 3 ) , stride= ( 1 , 1 ) , padding= ( 1 , 1 ) ) ,
nn. ReLU( ) ,
nn. Conv2d( 256 , 256 , kernel_size= ( 3 , 3 ) , stride= ( 1 , 1 ) , padding= ( 1 , 1 ) ) ,
nn. ReLU( ) ,
nn. MaxPool2d( kernel_size= ( 2 , 2 ) , stride= ( 2 , 2 ) )
)
self. block4 = nn. Sequential(
nn. Conv2d( 256 , 512 , kernel_size= ( 3 , 3 ) , stride= ( 1 , 1 ) , padding= ( 1 , 1 ) ) ,
nn