tf.keras
是 TensorFlow 对 Keras API 规范的实现。这是一个用于构建和训练模型的高阶 API,包含对 TensorFlow 特定功能(例如 Eager Execution、tf.data
管道和 Estimator)的顶级支持。tf.keras
使 TensorFlow 更易于使用,并且不会牺牲灵活性和性能。
使用 tf.keras
构建模型
序列模型
我们来创建一个具有输入层
, 单层全连接层(隐藏层)
及输出层
的模型结构, 使用 tf.keras
构建模型大致分为以下步骤:
定义模型结构
首先通过 tf.keras.Sequential
方法初始化模型
import tensorflow as tf
model = tf.keras.Sequential() # 初始化模型
通过 tf.keras.layers
方法定义各层并使用 add
添加至模型
# 添加输入层
model.add(tf.keras.layers.Flatten(input_shape=(28, 28))) # input_shape 为输入数据shape, 该层仅仅对数据进行格式化
# 添加全连接层
model.add(tf.keras.layers.Dense(64, activation='relu'))) # 64为全连接层神经元个数, activation选择激活函数类型
# 添加输出层
model.add(tf.keras.layesr.Dense(10, activation='softmax')) # 10为分类数, activation选择激活函数类型
预定义激活函数
-
softmax:用于多分类问题的最后一层, 当分类数为2时等同于
sigmoid
-
elu: 类似于relu, 不会有Dead ReLU问题, 它的一个小问题在于计算量稍大, 实际中也没有充分证据证明
elu
优于relu
-
selu: 可伸缩的指数线性单元(Scaled Exponential Linear Unit),参考Self-Normalizing Neural Networks
-
softplus: 作为
relu
的一个不错的替代选择,学习效率相比略低, 也可能出现梯度消失的问题 -
softsign:
softsign
是tanh
激活函数的另一个替代选择 -
relu: 收敛速度远快于
sigmoid
和tanh
-
tanh: 效果不如
relu
和Maxout
-
sigmoid: 最好不要用
sigmoid
,你可以试试tanh
,不过可以预期它的效果会比不上relu
和Maxout
-
hard_sigmoid: 相比于
sigmoid
更易计算,这使得学习计算的速度更快 -
linear
各层可在初始化模型时直接添加, 以上效果等同于
import tensorflow as tf
model = tf.keras.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)), # 输入层
tf.keras.layers.Dense(64, activation='relu')), # 全连接层
tf.keras.layesr.Dense(10, activation='softmax') # 输出层
])
通过 compile
选择优化模型方式
model.compile(optimizer=tf.train.AdamOptimizer(0.001),
loss='categorical_crossentropy',
metrics=['accuracy'])
-
optimizer
:此对象会指定训练过程。从tf.train
模块向其传递优化器实例,例如tf.train.AdamOptimizer
、tf.train.RMSPropOptimizer
或tf.train.GradientDescentOptimizer
。 -
loss
:要在优化期间最小化的函数。常见选择包括均方误差 (mse
)、categorical_crossentropy
和binary_crossentropy
。损失函数由名称或通过从tf.keras.losses
模块传递可调用对象来指定。 -
metrics
:用于监控训练。它们是tf.keras.metrics
模块中的字符串名称或可调用对象。
预定义优化器种类
使用tensorflow的APItf.train.
AdamOptimizer
AdadeltaOptimizer
AdagradDAOptimizer
AdagradOptimizer
FtrlOptimizer
GradientDescentOptimizer
MomentumOptimizer
ProximalAdagradOptimizer
ProximalGradientDescentOptimizer
RMSPropOptimizer
SyncReplicasOptimizer
使用keras的APIkeras.optimizers.
Adam
Adadelta
SGD
RMSprop
Adagrad
Adamax
Nadam
直接传入名称
损失函数
-
mean_squared_error
或mse
-
mean_absolute_error
或mae
-
mean_absolute_percentage_error
或mape
-
mean_squared_logarithmic_error
或msle
squared_hinge
hinge
-
binary_crossentropy
(亦称作对数损失,logloss) -
categorical_crossentropy
:亦称作多类的对数损失,注意使用该目标函数时,需要将标签转化为形如(nb_samples, nb_classes)的二值序列 -
sparse_categorical_crossentrop
:如上,但接受稀疏标签。注意,使用该函数时仍然需要你的标签与输出值的维度相同,你可能需要在标签数据上增加一个维度:np.expand_dims(y,-1) -
kullback_leibler_divergence
: 从预测值概率分布Q到真值概率分布P的信息增益,用以度量两个分布的差异. -
poisson
:即(predictions - targets * log(predictions))的均值 -
cosine_proximity
:即预测值与真实标签的余弦距离平均值的相反数
训练
调用模型的 fit
方法进行训练
model.fit(train_data, label_data, epochs=10, batch_size=32)
-
epochs
:以周期为单位进行训练。一个周期是对整个输入数据的一次迭代(以较小的批次完成迭代)。 -
batch_size
:当传递 NumPy 数据时,模型将数据分成较小的批次,并在训练期间迭代这些批次。此整数指定每个批次的大小。请注意,如果样本总数不能被批次大小整除,则最后一个批次可能更小。 -
validation_data
:在对模型进行原型设计时,您需要轻松监控该模型在某些验证数据上达到的效果。传递此参数(输入和标签元组)可以让该模型在每个周期结束时以推理模式显示所传递数据的损失和指标。
评估
调用模型 evaluate
方法进行评估
model.evaluate(test_data, test_label, batch_size=32)
预测
调用模型 predict
方法进行预测
model.predict(one_data)
模型保存
调用模型 save
方法进行保存
model.save_weights('./weights/my_model')
模型加载
调用模型 load_weights
方法进行重载模型
model = tf.keras.Sequential()
model.load_weights('./weights/my_model')
网友评论