日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

VGG模型构建与实现

發布時間:2024/1/23 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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模型构建与实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。