VGG模型构建与实现
生活随笔
收集整理的這篇文章主要介紹了
VGG模型构建与实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
VGG卷積神經網絡最大的特點就是由多個vgg_block構成,每個vgg_block包含多個卷積層,除第一個卷積層外,其余卷積層輸入輸出通道數量保持不變,卷積核大小一般為3*3,填充為1,即卷積層不改變特征圖大小,由卷積核為2步長為2的池化層進行特征圖縮放。
?vgg_block實現:
def vgg_block(conv_num, in_channel, out_channel):layers = []for _ in range(conv_num):layers.append(nn.Conv2d(in_channel, out_channel, kernel_size=3, padding=1))layers.append(nn.ReLU())in_channel = out_channellayers.append(nn.MaxPool2d(kernel_size=2, stride=2))return nn.Sequential(*layers)???????? VGG根據不同網絡深度分為VGG11、VGG13、VGG16和VGG19幾個版本,每個VGG網絡都是由5個vgg_block和三個全連接層組成。
VGG網絡實現:
def vgg(in_channel, conv_arch):conv_blocks = []for (conv_num, out_channel) in conv_arch:conv_blocks.append(vgg_block(conv_num, in_channel, out_channel))in_channel = out_channelreturn nn.Sequential(*conv_blocks,nn.Flatten(),nn.Linear(512 * 7 * 7, 4096),nn.ReLU(),nn.Dropout(),nn.Linear(4096, 4096),nn.ReLU(),nn.Dropout(),nn.Linear(4096, 2)) def vgg11(channel_num):conv_arch = ((1, 64), (1, 128), (2, 256), (2, 512), (2, 512))model = vgg(channel_num, conv_arch)return modeldef vgg13(channel_num):conv_arch = ((2, 64), (2, 128), (2, 256), (2, 512), (2, 512))model = vgg(channel_num, conv_arch)return modeldef vgg16(channel_num):conv_arch = ((2, 64), (2, 128), (3, 256), (3, 512), (3, 512))model = vgg(channel_num, conv_arch)return modeldef vgg19(channel_num):conv_arch = ((2, 64), (2, 128), (4, 256), (4, 512), (4, 512))model = vgg(channel_num, conv_arch)return model????????? 模型構建后,定義個訓練腳本,使用自定義數據集進行訓練。
def train():# 如有GPU,默認使用第一塊GPUdevice = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')print('using device {}'.format(device))#數據預處理data_transform = {"train": transforms.Compose([transforms.RandomResizedCrop(224), #隨機縮放裁剪transforms.RandomHorizontalFlip(), #隨機水平翻轉transforms.ToTensor(), #轉換為Tensortransforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) #歸一化]),"val": transforms.Compose([transforms.RandomResizedCrop(224),transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])}#加載數據集batch_size = 32data_path = 'dataset/dogs'assert os.path.exists(data_path), "{} does not exist".format(data_path)train_dataset = datasets.ImageFolder(root=os.path.join(data_path, 'train'), transform=data_transform['train'])val_dataset = datasets.ImageFolder(root=os.path.join(data_path, 'val'), transform=data_transform['val'])train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True, num_workers=8)val_loader = torch.utils.data.DataLoader(val_dataset, batch_size=5, shuffle=False, num_workers=8)model = vgg11(channel_num=3)model.to(device)loss_function = nn.CrossEntropyLoss()optimizer = torch.optim.Adam(model.parameters(), lr=0.0001)epochs = 10save_path = 'vgg11.pt'best_acc = 0.0steps = len(train_loader)for epoch in range(epochs):model.train()running_loss = 0.0for step, data in enumerate(train_loader):images, labels = dataoptimizer.zero_grad()outputs = model(images.to(device))loss = loss_function(outputs, labels.to(device))loss.backward()optimizer.step()running_loss += loss.item()print('epoch:{},step:{}/{},loss:{}'.format(epoch + 1, step + 1, steps, loss))model.eval()acc = 0.0with torch.no_grad():for val_data in val_loader:images, labels = val_dataoutputs = model(images.to(device))predict = torch.max(outputs, dim=1)[1]acc += torch.eq(predict, labels.to(device)).sum().item()val_acc = acc / len(val_dataset)print('epoch:{}, acc:{}'.format(epoch + 1, val_acc))if val_acc > best_acc:best_acc = val_acctorch.save(model.state_dict(), save_path)print("finish train")if __name__ == '__main__':train()總結
以上是生活随笔為你收集整理的VGG模型构建与实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AlexNet网络构建与训练
- 下一篇: resnet18到resnet152模型