VGG网络模型

VGG网络模型详解以及代码实现 VGG网络模型详解以及代码实现一、背景1. VGG原理二、VGG网络模型详解及代码实现1. VGG网络模型详解2. 代码实现三、参考资料: 一、背景 VGGNet是在2014年由Karen Simonyan和Andrew Zisserman提出的,网络模型包括VGG-11、VGG-13、VGG-16以及VGG-19,其中VGG-16和VGG-19在分类和定位任务上效果最好,因此作者在2014年ImageNet Challenge上获得分类第二和定位第一的网络。 论文地址:VERY DEEP CONVOLUT 阅读详情

1.网络架构

2.网络搭建

import torch.nn as nn
import torch

# official pretrain weights
model_urls = {
    'vgg11': 'https://download.pytorch.org/models/vgg11-bbd30ac9.pth',
    'vgg13': 'https://download.pytorch.org/models/vgg13-c768596a.pth',
    'vgg16': 'https://download.pytorch.org/models/vgg16-397923af.pth',
    'vgg19': 'https://download.pytorch.org/models/vgg19-dcbb9e9d.pth'
}

class VGG(nn.Module):
    def __init__(self,features,num_classes=1000,init_weights=False):
        super(VGG,self).__init__()
        self.features=features
        self.classifier = nn.Sequential(
            nn.Linear(512*7*7, 4096),
            nn.ReLU(True),
            nn.Dropout(p=0.5),
            nn.Linear(4096, 4096),
            nn.ReLU(True),
            nn.Dropout(p=0.5),
            nn.Linear(4096, num_classes)
        )
        if init_weights:
            self._initialize_weights()
    
    def forward(self,x):
        # N x 3 x 224 x 224
        x = self.features(x)
        # N x 512 x 7 x 7
        x = torch.flatten(x, start_dim=1)
        # N x 512*7*7
        x = self.classifier(x)
        return x

    def _initialize_weights(self):
        for m in self.modules():
            if isinstance(m, nn.Conv2d):
                # nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
                nn.init.xavier_uniform_(m.weight)
                if m.bias is not None:
                    nn.init.constant_(m.bias, 0)
            elif isinstance(m, nn.Linear):
                nn.init.xavier_uniform_(m.weight)
                # nn.init.normal_(m.weight, 0, 0.01)
                nn.init.constant_(m.bias, 0)

def make_features(cfg:list):
    layers=[]
    in_channels = 3
    for v in cfg:
        if v == 'M':
            layers += [nn.MaxPool2d(kernel_size=2,stride=2)]
        else:
            conv2d = nn.Conv2d(in_channels,v,kernel_size=3,padding=1)
            layers += [conv2d,nn.ReLU(True)]
            in_channels = v
    return nn.Sequential(*layers)


cfgs = {
    'vgg11': [64, 'M', 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'],
    'vgg13': [64, 64, 'M', 128, 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'],
    'vgg16': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 'M', 512, 512, 512, 'M', 512, 512, 512, 'M'],
    'vgg19': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 256, 'M', 512, 512, 512, 512, 'M', 512, 512, 512, 512, 'M'],
}

def vgg(model_name="vgg16", **kwargs):
    assert model_name in cfgs, "Warning: model number {} not in cfgs dict!".format(model_name)
    cfg = cfgs[model_name]

    model = VGG(make_features(cfg), **kwargs)
    return model

3.模型训练

import os
import sys
import json
import torch
import torch.nn as nn
from torchvision import transforms,datasets
import torch.optim as optim
from tqdm import tqdm
from model import vgg

def main():
    device = 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(),
            transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))
        ]),
        "val":transforms.Compose([
            transforms.Resize((224,224)),# cannot(224),must(224,224)
            transforms.ToTensor(),
            transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))
        ])
    }

    image_path = './flower_data'
    train_dataset = datasets.ImageFolder(root=os.path.join(image_path,"train"),transform=data_transform["train"])
    train_num = len(train_dataset)
    # {'daisy':0, 'dandelion':1, 'roses':2, 'sunflower':3, 'tulips':4}
    flower_list = train_dataset.class_to_idx
    cla_dict = dict((val,key) for key, val in flower_list.items())
    # write dict into json file
    json_str = json.dumps(cla_dict,indent=4)
    with open('class_indices.json','w') as json_file:
        json_file.write(json_str)
    
    batch_size = 32
    nw = min([os.cpu_count(),batch_size if batch_size>1 else 0,8])# number of workers
    print("Using {} dataloader workers every process".format(nw))
    train_loader = torch.utils.data.DataLoader(
        train_dataset,
        batch_size=batch_size,
        shuffle=True,
        num_workers=nw
    )

    validate_dataset = datasets.ImageFolder(
        root=os.path.join(image_path,"val"),
        transform=data_transform["val"]
    )
    val_num=len(validate_dataset)
    validate_loader = torch.utils.data.DataLoader(
        validate_dataset,
        batch_size=4,
        shuffle=False,
        num_workers=nw
    )
    print("using {} images for training,{} images for validation.".format(train_num,val_num))

    model_name = "vgg16"
    net = vgg(model_name=model_name,num_classes=5,init_weights=True)
    net.to(device)
    loss_function = nn.CrossEntropyLoss()
    optimizer = optim.Adam(net.parameters(),lr=0.0001)

    epochs = 30
    best_acc = 0.0
    save_path = './{}Net.pth'.format(model_name)
    train_steps = len(train_loader)
    for epoch in range(epochs):
        # train
        net.train()
        running_loss = 0.0
        train_bar = tqdm(train_loader,file=sys.stdout)
        for step,data in enumerate(train_bar):
            images,labels = data
            optimizer.zero_grad()
            outputs = net(images.to(device))
            loss = loss_function(outputs,labels.to(device))
            loss.backward()
            optimizer.step()

            # print statistics
            running_loss += loss.item()
            train_bar.desc = "train epoch[{}/{}] loss:{:.3f}".format(epoch+1,epochs,loss)

        # validate
        net.eval()
        acc = 0.0  #accumulate accurate number / epoch
        with torch.no_grad():
            val_bar = tqdm(validate_loader,file=sys.stdout)
            for val_data in val_bar:
                val_images,val_labels = val_data
                outputs = net(val_images.to(device))
                predict_y = torch.max(outputs,dim=1)[1]
                acc+=torch.eq(predict_y,val_labels.to(device)).sum().item()

        val_accurate = acc/val_num
        print("[epoch %d] train_loss:%.3f val_accuracy:%.3f"%(epoch+1,running_loss/train_steps,val_accurate))

        if val_accurate > best_acc:
            best_acc = val_accurate
            torch.save(net.state_dict(),save_path)
    print("Finished Training!!!")


if __name__ == '__main__':
    main()

4.模型的检验

import os
import json
from pyexpat import model
import torch
from PIL import Image
from torchvision import transforms
import matplotlib.pyplot as plt
from model import vgg

def main():
    device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    data_transform = transforms.Compose([
        transforms.Resize((224,224)),
        transforms.ToTensor(),
        transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))
    ])

    # load image
    img_path = "./tulip.jpg"
    assert os.path.exists(img_path),"file:'{}' does not exist.".format(img_path)
    img = Image.open(img_path)

    plt.imshow(img)
    # [N,C,H,W]
    img = data_transform(img)
    # expand batch dimension
    img = torch.unsqueeze(img,dim=0)

    # read class_indict
    json_path = './class_indices.json'
    assert os.path.exists(json_path),"file:'{}' does not exist.".format(json_path)

    with open(json_path,"r") as f:
        class_indict = json.load(f)
    
    # create model
    model = vgg(model_name="vgg16",num_classes=5).to(device)
    # load model weights
    weights_path = "./vgg16Net.pth"
    assert os.path.exists(weights_path), "file: '{}' dose not exist.".format(weights_path)
    model.load_state_dict(torch.load(weights_path, map_location=device))

    model.eval()
    with torch.no_grad():
        # predict class
        output = torch.squeeze(model(img.to(device))).cpu()
        predict = torch.softmax(output, dim=0)
        predict_cla = torch.argmax(predict).numpy()

    print_res = "class: {}   prob: {:.3}".format(class_indict[str(predict_cla)],
                                                 predict[predict_cla].numpy())
    plt.title(print_res)
    for i in range(len(predict)):
        print("class: {:10}   prob: {:.3}".format(class_indict[str(i)],
                                                  predict[i].numpy()))
    plt.show()

if __name__ == '__main__':
    main()

 

 

VGG16系列III: 网络模型结构 目录 Part I: CNN的基础构件 一张图片如何作为输入? 什么是卷积 什么是Padding 什么是池化(pooling) 什么是Flatten 什么是全连接层 什么是Dropout 什么是激活函数 VGG16的整体架构图 Part II: VGG 网络架构 典型VGG网络结构 VGG 网络参数数量计算: Part III: 如何训练VGG 前馈 后馈 训练技... 阅读详情

相关推荐

VGG-16网络模型pytorch实现

VGG-16网络模型pytorch实现 今天把VGG-16的网络模型过了一遍,来记录一下,我是根据别人的博客改的代码,并没有完全的自己敲一遍。 下面是吴恩达老师第四课——第二周——2.2经典网络里的VGG-16网络结构图 这张图里很清晰的讲解了各个层图像的尺度和深度,以及卷积层和池化层的位置。 AlexNet只有八层网络,使用1111的卷积核(滤波器),而VGG-16有16层网络,使用的是33的卷积核(滤波器)。VGG的优势在于使用3*3的卷积核代替AlexNet中大的卷积核,在具有相同的感受野的同

Hawley的博客 856

AlexNet网络搭建(pytorch版)

1.网络结构 2.网络搭建 import torch.nn as nn import torch class AlexNet(nn.Module): def __init__(self, num_classes=1000, init_weights=False): super(AlexNet, self).__init__() self.features = nn.Sequential( nn.Conv2d(3, 48, kern.

YYSTINTERNET的博客 471

使用VGG块来构建一个网络模型,并加入残差结构,使用pytorch实现

您可以通过以下步骤实现使用 VGG 块构建的带有残差结构的网络模型: 导入 PyTorch 库,以便使用其中的模块。 定义 VGG 块的结构。VGG 块通常由多个卷积层和池化层组成,因此您可以创建一个卷积层和池化层的函数,并将其封装到 VGG 块的函数中。 定义残差块的结构。残差块包括两个卷积层,并通过加上输入的残差结构来提高网络的性能。 将 VGG 块和残差块组合在一起,构建一个包含多个块的网...

weixin_42601702的博客 650

经典网络架构学习-VGG

本篇博文将介绍一下在ImageNet 2014 年斩获目标定位竞赛的第一名,图像分类竞赛的第二名的网络结构VGG。VGG 是 Visual Geometry Group 的缩写,是这个网络创建者的队名,作者来自牛津大学.VGG论文《Very Deep Convolutional Networks for Large-Scale Image Recognition》作为一篇会议论文在2015年的ICLR大会上发表Visual Geometry Group实验室链接:https://www.robots.ox.

一璐有你的专栏 4779

Halcon深度学习自定义网络模型-VGG16

Halcon自定义深度学习网络模型-VGG16

Deep-Bool 1029

掌握深度学习:VGG网络模型深入解析与应用

在当今数字化时代,深度学习已经成为推动人工智能领域进步的重要力量。作为深度学习的一种重要模型,卷积神经网络(CNN)特别擅长处理图像数据。通过模拟人类视觉系统的结构,CNN能够自动且有效地从图片中提取特征,进行分类和识别等任务。

weixin_36123300的博客 1021

VGG19结构图

自己整理的VGG19层结构图

susansmile1014的博客 4万+

LangChain4j-针对性操作Function-call+系统预设角色

如果我们想要对一些敏感信息进行针对化的操作,不仅仅是接口大模型去进行回复。比如我们现在数据库里面有一些菜品,那么用户提问,店里有多少套餐,那么云端大模型肯定是不知道的,我们希望捕获这些关键字然后进行自己的业务查询或者处理,这个时候就可以使用function-call。

DDDDDouble的博客 454

AlexNet网络结构详解(含各层维度大小计算过程)与PyTorch实现

AlexNet网络结构详解(含各层维度大小计算过程)1、AlexNet之前的思考2、AlexNet网络结构3、AlexNet网络结构的主要贡献     在上文中详细介绍了第一个神经网络LeNet,但是在其提出20年的时间里并没有引起学者和各研究机构的重视,随机机器学习的兴起,LeNet网络基本被遗忘了。而真正打破机器学习和传统特征提取方法限制的深度神经网络就是本文要讲述的AlexNet。 1、AlexNet之前的思考     在AlexNet网络问世之前,大量的学者在进行图像分类、分割、识别等工作时,主要是

gz7seven 12万+

11.15 分析finrl 的框架

11.15 分析finrl 的框架

yueguoqing88的博客 1086

从IR Drop到EM分析:数字IC电源规划中那些没人明说的细节(以MTCMOS配置为例)

本文深入探讨数字IC后端设计中电源规划的关键细节,特别关注MTCMOS配置、电源网络电阻最小化和level shifter供电等实战技巧。通过分析IR Drop和EM问题,提供优化floorplan和powerplan的具体策略,帮助工程师避免常见陷阱,提升芯片设计的稳定性和可靠性。

q9w8e7r6t5的博客 511

VGG网络模型及代码分析

VGG网络模型解读及代码分析 目录1.VGG网络介绍 1.VGG网络介绍

weixin_45225975的博客 8867

浙大数值分析lab2

最可怕的一道题,题目是这样的 Root of a Polynomial A polynomial of degree nnn has the common form as p(x)=cnxn+cn−1xn−1+⋯+c1x+c0p(x)=c_n x^n + c_{n-1} x^{n-1} + \cdots + c_1 x + c_0p(x)=c​n​​x​n​​+c​n−1​​x​

yao_zou的博客 4797

Tensorflow之VGG网络模型

Tensorflow之VGG网络模型Tensorflow之VGG网络模型AttributeError: module 'scipy.misc' has no attribute 'imread'方案1方案2方案3Depth of input (32) is not a multiple of input depth of filter (3) for 'conv1_1/Conv2D' (op: '...

清风冷吟 2419

SAP 系统升级不再惧怕 SPAU 与 SPDD:把修改调整做成可控的工程

SAP系统升级中的SPAU/SPDD处理要点:首先明确SPDD处理数据字典对象,SPAU处理程序对象,核心是解决标准对象变更与历史修改的继承问题。关键原则是优先回归标准版本,减少后续升级负担。操作时应利用版本管理对比差异,批量处理可回退对象,并通过F9多选提高效率。对于提示"当前版本与建议一致"的对象直接回归标准。注意区分新旧SPAU界面功能差异,将Note下载移至SNOTE处理,并确保在SPDD/SPAU之后处理SPAU_ENH。最后,所有调整需记录日志并纳入传输请求,确保可追溯性。遵

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 391

时间序列预测 | Python实现LSTM时间序列数据预测

目录LSTM神经网络LSTM原理LSTM数据下载LSTM程序设计导入Python包时序数据处理LSTM模块定义模型训练模型评估参数设定运行结果参考资料致谢 LSTM神经网络 长短期记忆网络——通常简称为“LSTM”——是一种特殊的 RNN,能够学习长期依赖关系。它们由Hochreiter & Schmidhuber (1997)引入,并在后续工作中被许多人提炼和推广。1它们在处理各种各样的问题时效果非常好,现在被广泛使用。LSTM 被明确设计为避免长期依赖问题。长时间记住信息实际上是他们的默认行为

前程算法屋的博客 3912

【使用Pytorch实现VGG16网络模型】

VGG-Network是K.Simonyan和A.Zisserman在论文“VeryDeepConvolutionalNetworksforLarge-ScaleImageRecognition”中提出的卷积神经网络模型。该架构在ImageNet中实现了92.7%的top-5测试准确率,该网络拥有超过1400万张属于1000个类别的图像。•模型的输入是固定大小的224×224224×224RGB图像•预处理是从每个像素中减去训练集RGB值的平均值。......

vcsir的专栏 8002

使用STM32制作智能窗帘控制

以上就是一个简单的基于STM32的智能窗帘控制代码案例。通过感知光线强度和控制步进电机的旋转,我们可以实现智能窗帘的自动开启和关闭。通过定时器的中断来控制步进电机的旋转,从而实现窗帘的开启和关闭动作。最后,我们需要实现主函数和中断函数。在主函数中,我们需要初始化硬件资源,然后进入一个无限循环来不断检测光敏电阻的值,并根据其值来控制窗帘的开启和关闭。接下来,我们需要编写功能函数,用于控制窗帘的开启和关闭。然后,我们需要配置STM32开发环境,并创建一个新的工程。接下来,我们初始化相关的硬件资源。

2401_85258012的博客 277

pytorch Vgg网络模型

Vgg网络结构图 网络亮点 通过堆叠多个3x3的卷积核来代替大尺寸卷积核(减少参数) 堆叠两个3x3的卷积核代替一个5x5的卷积核,堆叠三个3x3的卷积核代替7X7卷积核 import torch.nn as nn import torch # official pretrain weights model_urls = { 'vgg11': 'https://download.pytorch.org/models/vgg11-bbd30ac9.pth', 'vgg13': 'h

2257

若依框架二次开发——RuoYi-AI 本地部署流程

若依框架二次开发——RuoYi-AI 本地部署流程

bjzhang75的博客 1787

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

keras使用VGG19网络模型实现风格迁移

风格迁移算法经历多次定义和更新,现在应用在许多智能手机APP上。 风格迁移在保留目标图片内容的基础上,将图片风格引用在目标图片上。风格本质上是指在各种空间尺度上图像中的纹理,颜色和视觉图案;内容是图像的高级宏观结构。实现风格迁移背后的关键概念与所有深度学习算法的核心相同:定义了一个损失函数来指定想要实现的目标,并最大限度地减少这种损失。 知道自己想要实现的目标:在采用参考图像的样式的同时保留原始图像的内容。如果我们能够在数学上定义内容和样式,那么最小化的适当损失函数将是以下内容: loss = distan

爱CV 2743

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

vgg16网络模型的学习理解

Vgg16网络模型一些注意和理解(可能学习的不是非常的扎实,如果有什么问题向往指出)   为什么使用3个3*3的卷积核代替一个7*7的卷积核? 保证在有相同感知野的条件下,提升了网络的深度,在一定程度上提升了网络的效果,减少了权重参数的数量。   为什么使用1*1的卷积核? 1.为了使我们的网络更深。 2.降低维度 3.为了增加更多的非线性变换 1*1的卷积核可以结合max pool...

6先生的博客 1万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

手写 VGG 网络模型实现 CIFAR10 数据集分类

手写 VGG 网络模型实现 CIFAR10 数据集分类

世界那么大,我想去看看~【随心更新,看世界去了😄】 1366
上一篇: AlexNet网络搭建(pytorch版)
下一篇: GoogleNet网络模型
Caoyy686868
博客等级 码龄8年 5742粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Caoyy686868

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值