layer.get_weights()
: 以含有Numpy矩阵的列表形式返回层的权重。
layer.set_weights(weights)
: 从含有Numpy矩阵的列表中设置层的权重(与get_weights
的输出形状相同)。
layer.get_config()
: 返回包含层配置的字典。此图层可以通过以下方式重置:
layer = Dense(32)
config = layer.get_config()
reconstructed_layer = Dense.from_config(config)
# 或者
from keras import layers
config = layer.get_config()
layer = layers.deserialize({'class_name': layer.__class__.__name__,
'config': config})
layer.input
layer.output
layer.input_shape
layer.output_shape
layer.get_input_at(node_index)
layer.get_output_at(node_index)
layer.get_input_shape_at(node_index)
layer.get_output_shape_at(node_index)
Dense
Activation
Dropout
Flatten
Input
Reshape
Permute
根据给定的模式置换输入的维度。在某些场景下很有用,例如将 RNN 和 CNN 连接在一起。
model = Sequential()
model.add(Permute((2, 1), input_shape=(10, 64)))
# 现在: model.output_shape == (None, 64, 10) # 等价于执行了矩阵转置
# 注意: None 是批表示的维度
RepeatVector
Lambda
ActivityRegularization
Masking
SpatialDropout1D
SpatialDropout2D
SpatialDropout3D
Conv1D (比如时序卷积)
Conv2D (比如图像中的二维卷积)
SeparableConv1D (depth方向的可分离1D卷积)
depth_multiplier
参数控 制深度步骤中每个输入通道生成多少个输出通道。可分离的卷积可以理解为一种将卷积核分解成 两个较小的卷积核的方法,或者作为 Inception 块的 一个极端版本。SeparableConv2D
Conv2DTranspose (同理会有3D)
Conv3D
Cropping1D
Croppong2D
2D 输入的裁剪层(例如图像),它沿着空间维度裁剪,即宽度和高度。
# 裁剪输入的 2D 图像或特征图
model = Sequential()
model.add(Cropping2D(cropping=((2, 2), (4, 4)),
input_shape=(28, 28, 3)))
# 现在 model.output_shape == (None, 24, 20, 3)
model.add(Conv2D(64, (3, 3), padding='same')) # padding='same'保持原有的W,H
model.add(Cropping2D(cropping=((2, 2), (2, 2))))
# 现在 model.output_shape == (None, 20, 16. 64)
Cropping3D
Upsampling1D
size
次。Upsampling2D
size[0]
和 size[1]
次。Upsampling3D
ZeroPadding1D
ZeroPadding2D:
ZeroPadding3D
LocallyConnected1D (还有2D,但3D还不知道是否有?)
LocallyConnected1D
层与 Conv1D
层的工作方式相同,除了权值不共享外, 也就是说,在输入的每个不同部分应用不同的一组过滤器。
# 将长度为 3 的非共享权重 1D 卷积应用于
# 具有 10 个时间步长的序列,并使用 64个 输出滤波器
model = Sequential()
model.add(LocallyConnected1D(64, 3, input_shape=(10, 32))) # 32应该是指channel?
# 现在 model.output_shape == (None, 8, 64) # W_2 = (W_1-F)/S + 1, so 10->8
# 在上面再添加一个新的 conv1d
model.add(LocallyConnected1D(32, 3)) # (8-3)/1 + 1 = 6
# 现在 model.output_shape == (None, 6, 32) # so 8->6
# 2D的例子
# 在 32x32 图像上应用 3x3 非共享权值和64个输出过滤器的卷积
# 数据格式 `data_format="channels_last"`:
model = Sequential()
model.add(LocallyConnected2D(64, (3, 3), input_shape=(32, 32, 3)))
# 现在 model.output_shape == (None, 30, 30, 64) # (32-3)/1 + 1 = 30
# 注意这一层的参数数量为 (30*30)*(3*3*3*64) + (30*30)*64
# 每次做卷积都是一组新的参数
# 30x30次卷积,才会得到30x30的feature map,每次卷积的参数量为:3x3x3x64,是因为64个3x3x3的filter;第二项(30x30)x64是bias的数量,因为一共64个filter,每个filter做一次卷积配一个bias
# 在上面再加一个 3x3 非共享权值和 32 个输出滤波器的卷积:
model.add(LocallyConnected2D(32, (3, 3)))
# 现在 model.output_shape == (None, 28, 28, 32)
Embedding
model = Sequential()
model.add(Embedding(1000, 64, input_length=10)) # 1000 -> 64 ?
# 模型将输入一个大小为 (batch, input_length) 的整数矩阵。
# 输入中最大的整数(即词索引)不应该大于 999 (词汇表大小)
# 现在 model.output_shape == (None, 10, 64),其中 None 是 batch 的维度。
input_array = np.random.randint(1000, size=(32, 10)) # 原本是
model.compile('rmsprop', 'mse')
output_array = model.predict(input_array)
assert output_array.shape == (32, 10, 64)
Add
计算一个列表的输入张量的和。相加层接受一个列表的张量, 所有的张量必须有相同的输入尺寸, 然后返回一个张量(和输入张量尺寸相同)
import keras
input1 = keras.layers.Input(shape=(16,))
x1 = keras.layers.Dense(8, activation='relu')(input1) # 8-dim的tensor
input2 = keras.layers.Input(shape=(32,))
x2 = keras.layers.Dense(8, activation='relu')(input2) # 8-dim的tensor
added = keras.layers.Add()([x1, x2]) # 相当于 added = keras.layers.add([x1, x2]) # 16-dim的tensor ??
out = keras.layers.Dense(4)(added)
model = keras.models.Model(inputs=[input1, input2], outputs=out)
Subtract:
计算两个输入张量的差。相减层接受一个长度为 2 的张量列表, 两个张量必须有相同的尺寸,然后返回一个值为 (inputs[0] - inputs[1]) 的张量, 输出张量和输入张量尺寸相同。
import keras
input1 = keras.layers.Input(shape=(16,))
x1 = keras.layers.Dense(8, activation='relu')(input1) # 8-dim
input2 = keras.layers.Input(shape=(32,))
x2 = keras.layers.Dense(8, activation='relu')(input2) # 8-dim
# 相当于 subtracted = keras.layers.subtract([x1, x2])
subtracted = keras.layers.Subtract()([x1, x2]) # 8-dim
out = keras.layers.Dense(4)(subtracted) # out: 4-dim
model = keras.models.Model(inputs=[input1, input2], outputs=out)
Multiply
Average
Maximum
Concatenate
Dot
(batch_size, n)
的两个张量 a
和 b
, 那么输出结果就会是尺寸为 (batch_size, 1)
的一个张量。 在这个张量中,每一个条目 i
是 a[i]
和 b[i]
之间的点积。add
Add
层的函数式接口。keras.layers.add(inputs)
subtract
Subtract
层的函数式接口。keras.layers.subtract(inputs)
import keras
input1 = keras.layers.Input(shape=(16,))
x1 = keras.layers.Dense(8, activation='relu')(input1) # out: 8-dim
input2 = keras.layers.Input(shape=(32,))
x2 = keras.layers.Dense(8, activation='relu')(input2) # 8-dim
subtracted = keras.layers.subtract([x1, x2]) # out: 8-dim
out = keras.layers.Dense(4)(subtracted) # out: 4-dim
model = keras.models.Model(inputs=[input1, input2], outputs=out)
multiply
Multiply
层的函数式接口。keras.layers.multiply(inputs)
average
Average
层的函数式接口。keras.layers.average(inputs)
maximum
Maximum
层的函数式接口。keras.layers.maximum(inputs)
concatenate
Concatenate
层的函数式接口。keras.layers.concatenate(inputs, axis=-1)
dot
Dot
层的函数式接口。keras.layers.dot(inputs, axes, normalize=False)
keras.layers.Softmax(axis=-1)
keras.layers.ReLU(max_value=None)
Dropout
,它保持输入的平均值和方差与原来的值不变, 即在 dropout 之后仍然保证数据的自规范性。 通过随机将激活设置为负饱和值,Alpha Dropout 非常适合按比例缩放的指数线性单元(SELU)。TimeDistributed
这个封装器将一个层应用于输入的每个时间片。输入至少为 3D,且第一个维度应该是时间所表示的维度。
考虑 32 个样本的一个 batch, 其中每个样本是 10 个 16 维向量的序列。 那么这个 batch 的输入尺寸为 (32, 10, 16)
, 而 input_shape
不包含样本数量的维度,为 (10, 16)
。你可以使用 TimeDistributed
来将 Dense
层独立地应用到 这 10 个时间步的每一个:
# 作为模型第一层
model = Sequential()
model.add(TimeDistributed(Dense(8), input_shape=(10, 16))) # 有点像map函数
# 现在 model.output_shape == (None, 10, 8) # 因为上一层是FC,output为8-dim,而
# 每个时间步都被dense(8)处理了,所以有10个时间步的执行结果
# 输出的尺寸为 (32, 10, 8)。
# 在后续的层中,再使用TimeDistributed,将不再需要 input_shape:
model.add(TimeDistributed(Dense(32)))
# 现在 model.output_shape == (None, 10, 32) # 10个时间步,32来自FC的output-dim
# TimeDistributed 可以应用于任意层,不仅仅是 Dense, 例如运用于 Conv2D 层:
model = Sequential()
model.add(TimeDistributed(Conv2D(64, (3, 3)),
input_shape=(10, 299, 299, 3)))
Bidirectional
RNN 的双向封装器,对序列进行前向和后向计算。
model = Sequential()
model.add(Bidirectional(LSTM(10, return_sequences=True), #实现双向LSTM
input_shape=(5, 10))) # 第一层要指明input_shape
model.add(Bidirectional(LSTM(10)))
model.add(Dense(5))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='rmsprop')
对于简单、无状态的自定义操作,你也许可以通过layers.core.Lambda
层来实现。但是对于那些包含了可训练权重的自定义层,你应该自己实现这种层。这是一个Keras2.0中,Keras层的骨架。你只需要实现三个方法即可:
build(input_shape)
: 这是你定义权重的地方。这个方法必须设self.built = True
,可以通过调用super([Layer], self).build()
完成。call(x)
: 这里是编写层的功能逻辑的地方。你只需要关注传入call
的第一个参数:输入张量,除非你希望你的层支持masking。compute_output_shape(input_shape)
: 如果你的层更改了输入张量的形状,你应该在这里定义形状变化的逻辑,这让Keras能够自动推断各层的形状。
from keras import backend as K
from keras.engine.topology import Layer
import numpy as np
下面好像是在定义了一个一层的FC,即Dense
class MyLayer(Layer):
def __init__(self, output_dim, **kwargs):
self.output_dim = output_dim
super(MyLayer, self).__init__(**kwargs) # 这属于模板语句了,可以认为必写
def build(self, input_shape):
# Create a trainable weight variable for this layer.
self.kernel = self.add_weight(name='kernel',
shape=(input_shape[1], self.output_dim),
initializer='uniform',
trainable=True)
super(MyLayer, self).build(input_shape) # Be sure to call this somewhere!
def call(self, x):
return K.dot(x, self.kernel)
def compute_output_shape(self, input_shape):
return (input_shape[0], self.output_dim)
# 已有的Keras层 就是实现层的最好的例子。不要犹豫**阅读源码**!
原文:https://www.cnblogs.com/LS1314/p/10380612.html