前语
在本文里将为咱们带来怎么进行运用pytorch中的自带的深度网络进行练习自己的数据。本文讲解可分两部分,第一部分为咱们介绍怎么进行目录式的读取自己的数据;第二部分为咱们介绍怎么进行更改为其他网络进行调试。(alexnet\densenet\mnasnet\moblienet\resnet\shufflenet\squeezenet\vgg)
目录式读取
由于咱们在做图画分类的时分,一般是往把收集到的同类图画放置在同一个文件夹内,因而咱们在这里选用目录式读取自己制造的数据集进行练习网络。
数据组成:
在这里我选用鲜花数据集为根底数据集并对此数据集进行修正。在鲜花数据会集咱们确定总数据类别为5类,在练习会集每一类中的图画数为500涨,在测验会集的每一类的图画数为150张,对练习测验内的图画进行修正巨细为224x224x3。
参阅pytorch官网示例,咱们能够将示例修正进行如下修正:
import torch
import torchvision
from torch import nn
from torch.utils.data import DataLoader
train_root = './datas/train/'
test_root = './datas/test/'
# 将文件夹的内容载入dataset
train_dataset = torchvision.datasets.ImageFolder(root=train_root, transform=torchvision.transforms.ToTensor())
test_dataset = torchvision.datasets.ImageFolder(root=test_root, transform=torchvision.transforms.ToTensor())
train_dataloader = DataLoader(train_dataset, batch_size=64)
test_dataloader = DataLoader(test_dataset, batch_size=64)
这这一步的时分咱们可捎带的将超参数进行设置一下,如下设置:
learning_rate = 0.1
batch_size = 64
epochs = 100
# Initialize the loss function
loss_fn = nn.CrossEntropyLoss()
由于练习集是需要练习而测验集不需要进行练习,那么可参阅官网的示例分别对练习集的操作和测验集的操作坚持不变如下:
def train_loop(dataloader, model, loss_fn, optimizer):
size = len(dataloader.dataset)
for batch, (X, y) in enumerate(dataloader):
# Compute prediction and loss
pred = model(X)
loss = loss_fn(pred, y)
# Backpropagation
optimizer.zero_grad()
loss.backward()
optimizer.step()
if batch % 100 == 0:
loss, current = loss.item(), batch * len(X)
print(f"loss: {loss:>7f} [{current:>5d}/{size:>5d}]")
def test_loop(dataloader, model, loss_fn):
size = len(dataloader.dataset)
num_batches = len(dataloader)
test_loss, correct = 0, 0
with torch.no_grad():
for X, y in dataloader:
pred = model(X)
test_loss += loss_fn(pred, y).item()
correct += (pred.argmax(1) == y).type(torch.float).sum().item()
test_loss /= num_batches
correct /= size
print(f"Test Error: \n Accuracy: {(100 * correct):>0.1f}%, Avg loss: {test_loss:>8f} \n")
更改网络
在pytorch的自带网络咱们可与自即将仿制出来,这样可与避免因自己的更改导致后续由于再次运用出现不必要的BUG,pytorch自带的models路径为:
envs\pytorch\Lib\site-packages\torchvision\models
咱们可与设置model为自己需要调用的网络,在这里咱们以vgg网络系列的vgg11为例子为咱们介绍怎么进行练习网络。咱们依旧坚持官网示例中的SGD练习函数作为optimizer,然后将各参数导入到train和test中进行练习自己的数据。由于网络比较多,我在这里就不逐个为咱们介绍了。
咱们可与移步我的Github
from myNets.vgg import vgg11 # 可替换为其他
if __name__ == "__main__":
model = vgg11(num_classes=5) # 可替换为其他
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
for t in range(epochs):
print(f"Epoch {t + 1}\n-------------------------------")
train_loop(train_dataloader, model, loss_fn, optimizer)
test_loop(test_dataloader, model, loss_fn)
print("Done!")
拓宽
在上一期:【实操】涨点神器你还不会,快点进来学习Label Smooth咱们介绍了Label Smooth操作,咱们可与尝试自行更改进行综合比对测验运用不同的Label Smooth操作对结果的影响,也可替换其他的学习率的衰减函数进行测验。