from __future__ import division
import six
from keras.models import Model
from keras.layers import (
Input,
Activation,
Dense,
Flatten
)
from keras.layers.convolutional import (
Conv2D,
MaxPooling2D,
AveragePooling2D
)
from keras.layers.merge import add
from keras.layers import concatenate
from keras.layers.normalization import BatchNormalization
from keras.regularizers import l2
from keras import backend as K
from layers.SpatialPyramidPooling import SpatialPyramidPooling
regularizer_rate = 0.01
def _bn_relu(input):
"""Helper to build a BN -> relu block
"""
norm = BatchNormalization(axis = CHANNEL_AXIS)(input)
return Activation("relu")(norm)
def _conv_bn_relu(**conv_params):
"""Helper to build a conv -> BN -> relu block
"""
filters = conv_params["filters"]
kernel_size = conv_params["kernel_size"]
strides = conv_params.setdefault("strides", (1, 1))
kernel_initializer = conv_params.setdefault("kernel_initializer", "he_normal")
padding = conv_params.setdefault("padding", "same")
kernel_regularizer = conv_params.setdefault("kernel_regularizer", l2(regularizer_rate))
def f(input):
conv = Conv2D(filters = filters, kernel_size = kernel_size,
strides = strides, padding = padding,
kernel_initializer = kernel_initializer,
kernel_regularizer = kernel_regularizer)(input)
return _bn_relu(conv)
return f
def _bn_relu_conv(**conv_params):
"""Helper to build a BN -> relu -> conv block.
This is an improved scheme proposed in http://arxiv.org/pdf/1603.05027v2.pdf
"""
filters = conv_params["filters"]
kernel_size = conv_params["kernel_size"]
strides = conv_params.setdefault("strides", (1, 1))
kernel_initializer = conv_params.setdefault("kernel_initializer", "he_normal")
padding = conv_params.setdefault("padding", "same")
kernel_regularizer = conv_params.setdefault("kernel_regularizer", l2(regularizer_rate))
def f(input):
activation = _bn_relu(input)
return Conv2D(filters = filters, kernel_size = kernel_size,
strides = strides, padding = padding,
kernel_initializer = kernel_initializer,
kernel_regularizer = kernel_regularizer)(activation)
return f
def _shortcut(input, residual):
"""Adds a shortcut between input and residual block and merges them with "sum"
"""
# Expand channels of shortcut to match residual.
# Stride appropriately to match residual (width, height)
# Should be int if network architecture is correctly configured.
input_shape = K.int_shape(input)
residual_shape = K.int_shape(residual)
stride_width = int(round(input_shape[ROW_AXIS] / residual_shape[ROW_AXIS]))
stride_height = int(round(input_shape[COL_AXIS] / residual_shape[COL_AXIS]))
equal_channels = input_shape[CHANNEL_AXIS] == residual_shape[CHANNEL_AXIS]
shortcut = input
# 1 X 1 conv if shape is different. Else identity.
if stride_width > 1 or stride_height > 1 or not equal_channels:
shortcut = Conv2D(filters = residual_shape[CHANNEL_AXIS],
kernel_size = (1, 1),
strides = (stride_width, stride_height),
padding = "valid",
kernel_initializer = "he_normal",
kernel_regularizer = l2(regularizer_rate))(input)
return add([shortcut, residual])
def _residual_block(block_function, filters, repetitions, is_first_layer = False):
"""Builds a residual block with repeating bottleneck blocks.
"""
def f(input):
for i in range(repetitions):
init_strides = (1, 1)
if i == 0 and not is_first_layer:
init_strides = (2, 2)
input = block_function(filters = filters, init_strides = init_strides,
is_first_block_of_first_layer = (is_first_layer and i == 0))(input)
return input
return f
def basic_block(filters, init_strides = (1, 1), is_first_block_of_first_layer = False):
"""Basic 3 X 3 convolution blocks for use on resnets with layers <= 34.
Follows improved proposed scheme in http://arxiv.org/pdf/1603.05027v2.pdf
"""
def f(input):
if is_first_block_of_first_layer:
# don't repeat bn->relu since we just did bn->relu->maxpool
conv1 = Conv2D(filters = filters, kernel_size = (3, 3),
strides = init_strides,
padding = "same",
kernel_initializer = "he_normal",
kernel_regularizer = l2(0.01))(input)
else:
conv1 = _bn_relu_conv(filters = filters, kernel_size = (3, 3),
strides = init_strides)(input)
residual = _bn_relu_conv(filters = filters, kernel_size = (3, 3))(conv1)
return _shortcut(input, residual)
return f
def bottleneck(filters, init_strides = (1, 1), is_first_block_of_first_layer = False):
"""Bottleneck architecture for > 34 layer resnet.
Follows improved proposed scheme in http://arxiv.org/pdf/1603.05027v2.pdf
Returns:
A final conv layer of filters * 4
"""
def f(input):
if is_first_block_of_first_layer:
# don't repeat bn->relu since we just did bn->relu->maxpool
conv_1_1 = Conv2D(filters = filters, kernel_size = (1, 1),
strides = init_strides,
padding = "same",
kernel_initializer = "he_normal",
kernel_regularizer = l2(regularizer_rate))(input)
else:
conv_1_1 = _bn_relu_conv(filters = filters, kernel_size = (3, 3),
strides = init_strides)(input)
conv_3_3 = _bn_relu_conv(filters = filters, kernel_size = (3, 3))(conv_1_1)
residual = _bn_relu_conv(filters = filters * 4, kernel_size = (1, 1))(conv_3_3)
return _shortcut(input, residual)
return f
def _handle_dim_ordering():
global ROW_AXIS
global COL_AXIS
global CHANNEL_AXIS
if K.image_dim_ordering() == 'tf':
ROW_AXIS = 1
COL_AXIS = 2
CHANNEL_AXIS = 3
else:
CHANNEL_AXIS = 1
ROW_AXIS = 2
COL_AXIS = 3
def _get_block(identifier):
if isinstance(identifier, six.string_types):
res = globals().get(identifier)
if not res:
raise ValueError('Invalid {}'.format(identifier))
return res
return identifier
class ResnetBuilder(object):
@staticmethod
def build(input_shape, num_outputs, block_fn, repetitions, enhanced = False, withSift = False):
"""Builds a custom ResNet like architecture.
Args:
input_shape: The input shape in the form (nb_channels, nb_rows, nb_cols)
num_outputs: The number of outputs at final softmax layer
block_fn: The block function to use. This is either `basic_block` or `bottleneck`.
The original paper used basic_block for layers < 50
repetitions: Number of repetitions of various block units.
At each block unit, the number of filters are doubled and the input size is halved
Returns:
The keras `Model`.
"""
_handle_dim_ordering()
if len(input_shape) != 3:
raise Exception("Input shape should be a tuple (nb_channels, nb_rows, nb_cols)")
# Permute dimension order if necessary
if K.image_dim_ordering() == 'tf':
input_shape = (input_shape[1], input_shape[2], input_shape[0])
# Load function from str if needed.
block_fn = _get_block(block_fn)
input = Input(shape = input_shape)
conv1 = _conv_bn_relu(filters = 64, kernel_size = (7, 7), strides = (2
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
机器学习课程大作业 - 基于深度神经网络的图像分类任务.zip个人98分期末大作业项目,代码完整下载可用。包含全部项目源码、该项目可以直接使用、项目都经过严格调试,下载即用确保可以运行! 机器学习课程大作业 - 基于深度神经网络的图像分类任务.zip个人98分期末大作业项目,代码完整下载可用。包含全部项目源码、该项目可以直接使用、项目都经过严格调试,下载即用确保可以运行!机器学习课程大作业 - 基于深度神经网络的图像分类任务.zip个人98分期末大作业项目,代码完整下载可用。包含全部项目源码、该项目可以直接使用、项目都经过严格调试,下载即用确保可以运行!机器学习课程大作业 - 基于深度神经网络的图像分类任务.zip个人98分期末大作业项目,代码完整下载可用。包含全部项目源码、该项目可以直接使用、项目都经过严格调试,下载即用确保可以运行! 机器学习课程大作业 - 基于深度神经网络的图像分类任务.zip个人98分期末大作业项目,代码完整下载可用。包含全部项目源码、该项目可以直接使用、项目都经过严格调试,下载即用确保可以运行!机器学习课程大作业 - 基于深度神经网络的图像分类任务.zip
资源推荐
资源详情
资源评论
收起资源包目录
机器学习课程大作业 - 基于深度神经网络的图像分类任务.zip (17个子文件)
机器学习课程大作业 - 基于深度神经网络的图像分类任务
.DS_Store 6KB
layers
__init__.py 0B
InceptionBlock.py 524B
SpatialPyramidPooling.py 5KB
predict.py 899B
utils
__init__.py 0B
loader.py 1KB
preprocessor.py 4KB
writer.py 196B
run.py 6KB
models
__init__.py 0B
ResSppNet.py 11KB
NaiveLeNet.py 2KB
NaiveSPPNet.py 2KB
HybridResSPPNet.py 2KB
.gitignore 1KB
test.py 596B
共 17 条
- 1
资源评论
程序员张小妍
- 粉丝: 1w+
- 资源: 3026
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功