keras基础

keras基础

官方文档:主页 - Keras 中文文档

mnist加载数据

1
2
from keras.datasets import mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data("/data/shixunfiles/8a61469f7ea1b51cbae51d4f78837e45_1637892731181.npz")
  1. 根据指定路径下载数据

reshape

1
2
3
4
5
6
7
8
9
10
import numpy as np
# 将图像摊平为向量
X_train = X_train.reshape(60000, 784)
X_test = X_test.reshape(10000, 784)

# 归一化
X_train = X_train / 255
X_test = X_test / 255
y_train = np_utils.to_categorical(y_train, 10)
y_test_h = np_utils.to_categorical(y_test, 10)
  1. a.reshape(shape) : 不改变numpy数组a的元素,返回一个shape形状的数组,原数组a不变

  2. 区别于keras.layers的Reshape层,两者作用相同,但不是同一个东西

Sequential 顺序模型

官方参考:Sequential 顺序模型指引 - Keras 中文文档

1
2
3
4
from keras import models
from keras.models import Sequential
# 序列模型
model = models.Sequential()
  1. 可以通过将网络层实例的列表传递给 Sequential 的构造器,来创建一个 Sequential 模型;

  2. 也可以简单地使用 .add() 方法将各层添加到模型中。

  3. 对于顺序模型中的第一层(且只有第一层,因为下面的层可以自动地推断尺寸)需要接收关于其输入尺寸的信息。

1
2
3
4
5
6
# 下面的代码片段是等价的
model = Sequential()
model.add(Dense(32, input_shape=(784,)))

model = Sequential()
model.add(Dense(32, input_dim=784))

InputLayer输入层

1
2
3
from keras.layers import InputLayer
# 输入层
model.add(InputLayer(input_shape=(img_size_flat,)))
  1. 输入层采用 InputLayer 进行定义, InputLayer 只用于接收数据,不对数据做任何处理。

  2. 可以包装现有张量 (传递 input_tensor 参数)或创建占位符张量 (传递参数 input_shape 和可选的 dtype )

Conv2D卷积层

官方参考:后端 Backend - Keras 中文文档

1
2
3
4
5
6
7
8
9
10
from keras.layers import Conv2D, MaxPooling2D
# 具有ReLu激活和最大池化的卷积层1
model.add(Conv2D(kernel_size=5, strides=1, filters=16,
padding='same', activation='relu', name='layer_conv1'))
model.add(MaxPooling2D(pool_size=2, strides=2))

# 具有ReLu激活和最大池化的卷积层2
model.add(Conv2D(kernel_size=5, strides=1, filters=36,
padding='same', activation='relu', name='layer_conv2'))
model.add(MaxPooling2D(pool_size=2, strides=2))

参数:

1
keras.backend.conv2d(x, kernel, strides=(1, 1), padding='valid', data_format=None, dilation_rate=(1, 1))
  • x: 张量或变量。

  • kernel: 核张量。

  • strides: 步长元组。

  • padding: 字符串,"same""valid"

  • data_format: 字符串,"channels_last""channels_first"。 对于输入/卷积核/输出,是否使用 Theano 或 TensorFlow/CNTK数据格式。

  • dilation_rate: 2 个整数的元组。

MaxPooling2D最大池化

官方参考:池化层 Pooling - Keras 中文文档

1
2
from keras.layers import MaxPooling2D
model.add(MaxPooling2D(pool_size=2, strides=2))

参数:

1
keras.layers.MaxPooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format=None)
  • pool_size: 整数,或者 2 个整数表示的元组, 沿(垂直,水平)方向缩小比例的因数。 (2,2)会把输入张量的两个维度都缩小一半。 如果只使用一个整数,那么两个维度都会使用同样的窗口长度。

  • strides: 整数,2 个整数表示的元组,或者是 None。 表示步长值。 如果是 None,那么默认值是 pool_size

  • padding: "valid" 或者 "same" (区分大小写)。

  • data_format: 字符串,channels_last (默认)或 channels_first 之一。 表示输入各维度的顺序。 channels_last 代表尺寸是 (batch, height, width, channels) 的输入张量, 而 channels_first 代表尺寸是 (batch, channels, height, width) 的输入张量。 默认值根据 Keras 配置文件 ~/.keras/keras.json 中的 image_data_format 值来设置。 如果还没有设置过,那么默认值就是 “channels_last”。

Flatten

官方参考:核心网络层 - Keras 中文文档

1
2
3
from keras.layers import Flatten
# 将卷积层的输出拉直
model.add(Flatten())

参数:

1
keras.layers.Flatten(data_format=None)
  • data_format:一个字符串,其值为 channels_last(默认值)或者 channels_first。它表明输入的维度的顺序。此参数的目的是当模型从一种数据格式切换到另一种数据格式时保留权重顺序。channels_last 对应着尺寸为 (batch, ..., channels) 的输入,而 channels_first 对应着尺寸为 (batch, channels, ...) 的输入。默认为 image_data_format 的值,你可以在 Keras 的配置文件 ~/.keras/keras.json 中找到它。如果你从未设置过它,那么它将是 channels_last

实例:

1
2
3
4
5
6
7
model = Sequential()
model.add(Conv2D(64, (3, 3),
input_shape=(3, 32, 32), padding='same',))
# 现在:model.output_shape == (None, 64, 32, 32)

model.add(Flatten())
# 现在:model.output_shape == (None, 65536)

Dense完全连接层

官方参考:核心网络层 - Keras 中文文档

1
2
3
4
5
6
from keras.layers import Dense
# 具有ReLu激活的完全连接层
model.add(Dense(128, activation='relu'))

# 最后一个全连接层,具有softmax激活,用于分类
model.add(Dense(num_classes, activation='softmax'))

参数:

1
keras.layers.Dense(units, activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)
  • units: 正整数,输出空间维度。

  • activation: 激活函数 。 若不指定,则不使用激活函数 (即,「线性」激活: a(x) = x)。

  • use_bias: 布尔值,该层是否使用偏置向量。

  • kernel_initializer: kernel 权值矩阵的初始化器 。

  • bias_initializer: 偏置向量的初始化器 。

  • kernel_regularizer: 运用到 kernel 权值矩阵的正则化函数。

  • bias_regularizer: 运用到偏置向的的正则化函数。

  • activity_regularizer: 运用到层的输出的正则化函数 (它的 “activation”)。

  • kernel_constraint: 运用到 kernel 权值矩阵的约束函数。

  • bias_constraint: 运用到偏置向量的约束函数。

实例:

1
2
3
4
5
6
7
8
# 作为 Sequential 模型的第一层
model = Sequential()
model.add(Dense(32, input_shape=(16,)))
# 现在模型就会以尺寸为 (*, 16) 的数组作为输入,
# 其输出数组的尺寸为 (*, 32)

# 在第一层之后,你就不再需要指定输入的尺寸了:
model.add(Dense(32))

compile模型编译

1
2
3
# 编译模型
model.compile(optimizer=Adam(lr=1e-3),
loss='categorical_crossentropy', metrics=['accuracy'])

参数:

  1. 优化器 optimizer

  • rmsprop

  • adagrad

  • Optimizer 类的实例

  1. 损失函数 loss

    • categorical_crossentropy:多分类交叉熵
    • binary_crossentropy:二分类交叉熵
    • mse
  2. 评估标准 metrics

    • 一般设为accuracy

fit模型训练

官方参考:函数式 API - Keras 中文文档

1
2
3
4
# epochs设置为1,batch_size设置为128
# 训练模型
model.fit(X_train, y_train, epochs=1, batch_size=128,
validation_split=1/12, verbose=2)

参数:

1
fit(self, x=None, y=None, batch_size=None, epochs=1, verbose=1, callbacks=None, validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, sample_weight=None, initial_epoch=0, steps_per_epoch=None, validation_steps=None)
  • x:输入数据。如果模型只有一个输入,那么x的类型是numpy数组,如果模型有多个输入,那么x的类型应当为list,list的元素是对应于各个输入的numpy array。

  • y:标签,numpy 数组。如果模型有多个输出,可以传入一个numpy 数组的list。

  • batch_size:整数,指定进行梯度下降时每个batch包含的样本数。训练时一个

  • batch的样本会被计算一次梯度下降,使目标函数优化一步。

  • epochs:整数,训练终止时的epoch值,训练将在达到该epoch值时停止

  • verbose:日志显示,0:为不在标准输出流输出日志信息,1:为输出进度条记录,2:为每个epoch输出一行记录

  • validation_split:0~1之间的浮点数,用来指定训练集的一定比例数据作为验证集。验证集将不参与训练,并在每个epoch结束后测试的模型的指标,如损失函数、精确度等。

evaluate模型评估

官方参考:函数式 API - Keras 中文文档

1
2
3
4
# 评估与预测性能指标
result = model.evaluate(X_test, y_test_h, verbose=1)
print("loss ", result[0])
print("acc ", result[1])

参数:

1
evaluate(x=None, y=None, batch_size=None, verbose=1, sample_weight=None, steps=None)
  • x: 测试数据的 Numpy 数组(如果模型只有一个输入), 或者是 Numpy 数组的列表(如果模型有多个输入)。 如果模型中的输入层被命名,你也可以传递一个字典,将输入层名称映射到 Numpy 数组。 如果从本地框架张量馈送(例如 TensorFlow 数据张量)数据,x 可以是 None(默认)。

  • y: 目标(标签)数据的 Numpy 数组,或 Numpy 数组的列表(如果模型具有多个输出)。 如果模型中的输出层被命名,你也可以传递一个字典,将输出层名称映射到 Numpy 数组。 如果从本地框架张量馈送(例如 TensorFlow 数据张量)数据,y 可以是 None(默认)。

  • batch_size: 整数或 None。每次评估的样本数。如果未指定,默认为 32。

  • verbose: 0 或 1。日志显示模式。 0 = 安静模式,1 = 进度条。

  • sample_weight: 测试样本的可选 Numpy 权重数组,用于对损失函数进行加权。 您可以传递与输入样本长度相同的扁平(1D)Numpy 数组(权重和样本之间的 1:1 映射), 或者在时序数据的情况下,传递尺寸为 (samples, sequence_length) 的 2D 数组,以对每个样本的每个时间步施加不同的权重。 在这种情况下,你应该确保在 compile() 中指定 sample_weight_mode="temporal"

  • steps: 整数或 None。 声明评估结束之前的总步数(批次样本)。默认值 None

predict预测

官方参考:函数式 API - Keras 中文文档

1
2
3
# 预测
predict = model.predict(X_test)
print("1 predict: ", predict)

参数:

1
predict(x, batch_size=None, verbose=0, steps=None)
  • x: 输入数据,Numpy 数组 (或者 Numpy 数组的列表,如果模型有多个输出)。

  • batch_size: 整数。如未指定,默认为 32。

  • verbose: 日志显示模式,0 或 1。

  • steps: 声明预测结束之前的总步数(批次样本)。默认值 None

argmax

官方参考:后端 Backend - Keras 中文文档

返回指定轴的最小值的索引。

1
2
3
import numpy as np
predict = np.argmax(predict, axis=1)
print("2 predict: ", predict)

参数:

1
keras.backend.argmin(x, axis=-1)
  • x: 张量或变量。

  • axis: 执行归约操作的轴。

保存、删除、加载模型

1
2
3
4
5
6
# 保存模型
model2.save(path_model)
# 删除模型
del model2
# 加载模型3
model3 = models.load_model(path_model)

summary输出各层信息

summary()方法查看模型架构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 得到层
model3.summary()

# 输出样例:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
embedding_1 (Embedding) (None, 20, 8) 80000
_________________________________________________________________
flatten_1 (Flatten) (None, 160) 0
_________________________________________________________________
dense_1 (Dense) (None, 1) 161
=================================================================
Total params: 80,161
Trainable params: 80,161
Non-trainable params: 0
_________________________________________________________________

layers模型各层

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from keras import layers
# layers下标索引根据add()添加的先后顺序决定
layer_input = model3.layers[0]
# layers[1]:model.add(Reshape(img_shape_full))
layer_conv1 = model3.layers[2]
# layers[3]:model.add(MaxPooling2D(pool_size=2, strides=2))
layer_conv2 = model3.layers[4]
# layers[5]:model.add(MaxPooling2D(pool_size=2, strides=2))

# layers[6]:model.add(Flatten())

# layers[7]:model.add(Dense(128, activation='relu'))

# layers[8]:model.add(Dense(num_classes, activation='softmax'))

get_weights获得权重

官方参考:关于 Keras 网络层 - Keras 中文文档

layer.get_weights(): 以含有Numpy矩阵的列表形式返回层的权重。

1
2
3
# 卷积权重
weights_conv1 = layer_conv1.get_weights()[0]
weights_conv2 = layer_conv2.get_weights()[0]

backend

参考:TensorFlow函数教程:tf.keras.backend.function_w3cschool

backend.function输出值为 Numpy 数组。

1
2
3
4
5
6
from keras import backend
# 卷积层输出一
output_conv1 = backend.function(
inputs=[layer_input.input], outputs=[layer_conv1.output])
layer_output1 = output_conv1([np.array([image1])])[0]
print(layer_output1.shape)

参数:

1
2
3
4
5
6
7
tf.keras.backend.function(
inputs,
outputs,
updates=None,
name=None,
**kwargs
)
  • inputs:占位符张量列表。

  • outputs:输出张量列表。

  • updates:更新操作列表。

  • name:String,函数名称。

  • **kwargs:需要传递给 tf.Session.run 的参数。

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2023-2024 Guijie Wang
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信