環境
系統:win10
cpu:i7-6700HQ
gpu:gtx965m
python : 3.6
pytorch :0.3
數據下載
來源自Sasank Chilamkurthy 的教程; 數據:下載鏈接。
下載后解壓放到項目根目錄:
數據集為用來分類 螞蟻和蜜蜂。有大約120個訓練圖像,每個類有75個驗證圖像。
數據導入
可以使用 torchvision.datasets.ImageFolder(root,transforms) 模塊 可以將 圖片轉換為 tensor。
先定義transform:
ata_transforms = { 'train': transforms.Compose([ # 隨機切成224x224 大小圖片 統一圖片格式 transforms.RandomResizedCrop(224), # 圖像翻轉 transforms.RandomHorizontalFlip(), # totensor 歸一化(0,255) >> (0,1) normalize channel=(channel-mean)/std transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]), "val" : transforms.Compose([ # 圖片大小縮放 統一圖片格式 transforms.Resize(256), # 以中心裁剪 transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ])}
導入,加載數據:
data_dir = './hymenoptera_data'# trans dataimage_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x), data_transforms[x]) for x in ['train', 'val']}# load datadata_loaders = {x: DataLoader(image_datasets[x], batch_size=BATCH_SIZE, shuffle=True) for x in ['train', 'val']}data_sizes = {x: len(image_datasets[x]) for x in ['train', 'val']}class_names = image_datasets['train'].classesprint(data_sizes, class_names)
{'train': 244, 'val': 153} ['ants', 'bees']
訓練集 244圖片 , 測試集153圖片 。
可視化部分圖片看看,由于visdom支持tensor輸入 ,不用換成numpy,直接用tensor計算即可 :
inputs, classes = next(iter(data_loaders['val']))out = torchvision.utils.make_grid(inputs)inp = torch.transpose(out, 0, 2)mean = torch.FloatTensor([0.485, 0.456, 0.406])std = torch.FloatTensor([0.229, 0.224, 0.225])inp = std * inp + meaninp = torch.transpose(inp, 0, 2)viz.images(inp)
創建CNN
net 根據上一篇的處理cifar10的改了一下規格:
class CNN(nn.Module): def __init__(self, in_dim, n_class): super(CNN, self).__init__() self.cnn = nn.Sequential( nn.BatchNorm2d(in_dim), nn.ReLU(True), nn.Conv2d(in_dim, 16, 7), # 224 >> 218 nn.BatchNorm2d(16), nn.ReLU(inplace=True), nn.MaxPool2d(2, 2), # 218 >> 109 nn.ReLU(True), nn.Conv2d(16, 32, 5), # 105 nn.BatchNorm2d(32), nn.ReLU(True), nn.Conv2d(32, 64, 5), # 101 nn.BatchNorm2d(64), nn.ReLU(True), nn.Conv2d(64, 64, 3, 1, 1), nn.BatchNorm2d(64), nn.ReLU(True), nn.MaxPool2d(2, 2), # 101 >> 50 nn.Conv2d(64, 128, 3, 1, 1), # nn.BatchNorm2d(128), nn.ReLU(True), nn.MaxPool2d(3), # 50 >> 16 ) self.fc = nn.Sequential( nn.Linear(128*16*16, 120), nn.BatchNorm1d(120), nn.ReLU(True), nn.Linear(120, n_class)) def forward(self, x): out = self.cnn(x) out = self.fc(out.view(-1, 128*16*16)) return out# 輸入3層rgb ,輸出 分類 2 model = CNN(3, 2)
新聞熱點
疑難解答