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目录的剩余部分就是各网络结构了: