用C3模块实现天气识别
一、导入库
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 torchsummary as summary
import copy
import matplotlib. pyplot as plt
二、数据导入及分割数据集
1. 查看使用的是cpu还是gpu
warnings. filterwarnings( "ignore" )
device = torch. device( "cuda" if torch. cuda. is_available( ) else "cpu" )
2.导入数据及标准化
data_dir = './data/weather_photos'
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 ] )
] )
2. 划分训练集和测试集
total_data = datasets. ImageFolder( "./data/weather_photos" , transform= train_transforms)
total_data
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/weather_photos" , 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] )
3. 训练批次
batch_size = 4
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 )
三、搭建模型
模型结构
import torch. nn. functional as F
def autopad ( k, p= None ) :
if p is None :
p = k // 2 if isinstance ( k, int ) else [ x // 2 for x in k]
return p
class Conv ( nn. Module) :
def __init__ ( self, c1, c2, k= 1 , s= 1 , p= None , g= 1 , act= True ) :
super ( ) . __init__( )
self. conv = nn. Conv2d( c1, c2, k, s, autopad( k, p) , groups= g, bias= False )
self. bn = nn. BatchNorm2d( c2)
self. act = nn. SiLU( ) if act is True else ( act if isinstance ( act, nn. Module