keras源码之application目录

application目录

1. __pycache__目录

关于__pycache__目录请参考keras源码之__pycache__目录

2.__init__.py

import keras_applications

这里导入了keras_applications包,下面是这个包的结构,直接从文件目录打开:

里面包含了各种网络的实现模块(包括权重路径以及设置、网络结构等)。

接下来是一些已经弃用的函数模块:

if not hasattr(keras_applications, 'get_submodules_from_kwargs'):
    keras_applications.set_keras_submodules(
        backend=backend,
        layers=layers,
        models=models,
        utils=utils)

为什么这个函数已经被弃用了呢?因为set_keras_submodules函数已经被弃用了,我们进入keras_applications包中的__init__.py可以发现有两个函数定义:

def set_keras_submodules(backend=None,
                         layers=None,
                         models=None,
                         utils=None,
                         engine=None):
    # Deprecated, will be removed in the future.(已经弃用)
    global _KERAS_BACKEND
    global _KERAS_LAYERS
    global _KERAS_MODELS
    global _KERAS_UTILS
    _KERAS_BACKEND = backend
    _KERAS_LAYERS = layers
    _KERAS_MODELS = models
    _KERAS_UTILS = utils


def get_keras_submodule(name):
    # Deprecated, will be removed in the future.(已经弃用)
    if name not in {'backend', 'layers', 'models', 'utils'}:
        raise ImportError(
            'Can only retrieve one of "backend", '
            '"layers", "models", or "utils". '
            'Requested: %s' % name)
    if _KERAS_BACKEND is None:
        raise ImportError('You need to first `import keras` '
                          'in order to use `keras_applications`. '
                          'For instance, you can do:\n\n'
                          '```\n'
                          'import keras\n'
                          'from keras_applications import vgg16\n'
                          '```\n\n'
                          'Or, preferably, this equivalent formulation:\n\n'
                          '```\n'
                          'from keras import applications\n'
                          '```\n')
    if name == 'backend':
        return _KERAS_BACKEND
    elif name == 'layers':
        return _KERAS_LAYERS
    elif name == 'models':
        return _KERAS_MODELS
    elif name == 'utils':
        return _KERAS_UTILS

这两个函数的注释显示它们已经被弃用,在将来会被移除。

回到application目录下的__init__.py,看下面的代码:

def keras_modules_injection(base_fun):

    def wrapper(*args, **kwargs):
        # hasattr 用来判断类中是否有指定的函数
        if hasattr(keras_applications, 'get_submodules_from_kwargs'):
            kwargs['backend'] = backend
            kwargs['layers'] = layers
            kwargs['models'] = models
            kwargs['utils'] = utils
        return base_fun(*args, **kwargs)

    return wrapper

再看 keras_applications包中的__init__.py:

def get_submodules_from_kwargs(kwargs):
    backend = kwargs.get('backend', _KERAS_BACKEND)
    layers = kwargs.get('layers', _KERAS_LAYERS)
    models = kwargs.get('models', _KERAS_MODELS)
    utils = kwargs.get('utils', _KERAS_UTILS)
    for key in kwargs.keys():
        if key not in ['backend', 'layers', 'models', 'utils']:
            raise TypeError('Invalid keyword argument: %s', key)
    return backend, layers, models, utils

结合函数 get_submodules_from_kwargs来看,可以看出keras_modules_injection是用来声明训练时的backend、layers、 models以及utils(Python Utils是一个小型Python函数和类的集合,它使常见模式更简单,更容易)。

再往下看是一些网络结构的导入:

from .vgg16 import VGG16
from .vgg19 import VGG19
from .resnet50 import ResNet50
from .inception_v3 import InceptionV3
from .inception_resnet_v2 import InceptionResNetV2
from .xception import Xception
from .mobilenet import MobileNet
from .mobilenet_v2 import MobileNetV2
from .densenet import DenseNet121, DenseNet169, DenseNet201
from .nasnet import NASNetMobile, NASNetLarge

每个网络的实现分别从keras_applications包导入,以vgg16为例:

from keras_applications import vgg16
from . import keras_modules_injection

每个网络还实现了三个函数:

@keras_modules_injection
def VGG16(*args, **kwargs):
    return vgg16.VGG16(*args, **kwargs)# 网络实现


@keras_modules_injection
def decode_predictions(*args, **kwargs):
    return vgg16.decode_predictions(*args, **kwargs)# 预测


@keras_modules_injection
def preprocess_input(*args, **kwargs):
    return vgg16.preprocess_input(*args, **kwargs)# 查看定义直接转到keras_applications包中的__init__.py

application目录的剩余部分就是各网络结构了:

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值