畅游人工智能之海--Keras教程之局部连接层

畅游人工智能之海--Keras教程之局部连接层

上周我们刚刚结束了Keras卷积层的学习,卷积层事实上就是一种特殊的局部连接层。那么这周我们就来趁热打铁,来学习一下Keras的局部连接层。

局部连接层区别于全连接层,局部连接层也称为局部感知或稀疏连接,可以用来提取局部特征并且起到减少参数的作用。

img

局部连接示意图

LocallyConnected1D层
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
keras.layers.LocallyConnected1D(
filters, #整数,输出空间的维度(即卷积中滤波器的输出数量)
kernel_size, #一个整数,或者单个整数表示的元组或列表, 指明 1D 卷积窗口的长度
strides=1, #一个整数,或者单个整数表示的元组或列表,指明卷积的步长。
padding='valid', #当前仅支持 "valid" (大小写敏感), "same" 可能会在未来支持
data_format=None, #在1D中默认即可
activation=None, #要使用的激活函数 (详见 activations)。 如果你不指定,则不使用激活函数 (即线性激活: a(x) = x)
use_bias=True, #布尔值,该层是否使用偏置向量
kernel_initializer='glorot_uniform', #kernel权值矩阵的初始化器,在之后的文章中会详细说明
bias_initializer='zeros', #偏置向量的初始化器
kernel_regularizer=None, #运用到kernel权值矩阵的正则化函数,在之后的文章中会详细说明
bias_regularizer=None, #运用到偏置向量的正则化函数
activity_regularizer=None, #运用到层输出(它的激活值)的正则化函数
kernel_constraint=None, #运用到kernel权值矩阵的约束函数,在之后的文章中会详细说明
bias_constraint=None #运用到偏置向量的约束函数
)

作用:

对于时序数据进行局部连接。LocallyConnected1D层与Conv1D层的工作方式相同,除了权值不共享外, 也就是说,在输入的每个不同部分应用不同的一组过滤器。

输入尺寸:

3D 张量,尺寸为: (batch_size, steps, input_dim)。

输出尺寸:

3D 张量 ,尺寸为:(batch_size, new_steps, filters),steps值可能因填充或步长而改变。

例子:

1
2
3
4
5
6
7
# 将长度为3的非共享权重1D卷积应用于
# 具有10个时间步长的序列,并使用64个输出滤波器
model.add(LocallyConnected1D(64, 3, input_shape=(10, 32)))
# 现在model.output_shape == (None, 8, 64)
# 在上面再添加一个新的LocallyConnected1D
model.add(LocallyConnected1D(32, 3))
# 现在model.output_shape == (None, 6, 32)
LocallyConnected2D层
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
keras.layers.LocallyConnected2D(
filters, #整数,输出空间的维度(即卷积中滤波器的输出数量)
kernel_size, #一个整数,或者2个整数表示的元组或列表,指明2D卷积窗口的宽度和高度。可以是一个整数,为所有空间维度指定相同的值
strides=(1, 1), #一个整数,或者2个整数表示的元组或列表,指明卷积沿宽度和高度方向的步长。可以是一个整数,为所有空间维度指定相同的值
padding='valid', #当前仅支持 "valid" (大小写敏感),"same" 可能会在未来支持
data_format=None, #字符串,channels_last(默认)或channels_first之一。输入中维度的顺序。channels_last对应输入尺寸为 (batch, height, width, channels),channels_first对应输入尺寸为 (batch, channels, height, width)
activation=None, #要使用的激活函数 (详见 activations)。 如果你不指定,则不使用激活函数 (即线性激活: a(x) = x)
use_bias=True, #布尔值,该层是否使用偏置向量
kernel_initializer='glorot_uniform', #kernel权值矩阵的初始化器,在之后的文章中会详细说明
bias_initializer='zeros', #偏置向量的初始化器
kernel_regularizer=None, #运用到kernel权值矩阵的正则化函数,在之后的文章中会详细说明
bias_regularizer=None, #运用到偏置向量的正则化函数
activity_regularizer=None, #运用到层输出(它的激活值)的正则化函数
kernel_constraint=None, #运用到kernel权值矩阵的约束函数,在之后的文章中会详细说明
bias_constraint=None #运用到偏置向量的约束函数
)

作用:

对于空间数据进行局部连接。LocallyConnected2D层与Conv2D层的工作方式相同,除了权值不共享外, 也就是说,在输入的每个不同部分应用不同的一组过滤器。

输入尺寸:

4D 张量,尺寸为: (samples, channels, rows, cols),如果 data_format='channels_first'; 或者 4D 张量,尺寸为: (samples, rows, cols, channels),如果 data_format='channels_last'。

输出尺寸:

4D 张量,尺寸为: (samples, filters, new_rows, new_cols),如果 data_format='channels_first'; 或者 4D 张量,尺寸为: (samples, new_rows, new_cols, filters),如果 data_format='channels_last'。 rows 和 cols 的值可能因填充而改变。

例子:

1
2
3
4
5
6
7
# 在 32x32 图像上应用 3x3 非共享权值和64个输出过滤器的卷积
# 数据格式`data_format="channels_last"`
model.add(LocallyConnected2D(64, (3, 3), input_shape=(32, 32, 3)))
# 现在model.output_shape == (None, 30, 30, 64)
# 在上面再加一个 3x3 非共享权值和 32 个输出滤波器的卷积:
model.add(LocallyConnected2D(32, (3, 3)))
# 现在 model.output_shape == (None, 28, 28, 32)

相信大家经过今天的学习,能够获得对局部连接层的作用以及使用方式的认识,局部连接层是减少网络参数的重要途径,希望大家在课下可以多多找实例进行再进一步的了解,让我们一起期待明天的RNN层教程吧!