tf.Keras

作者: elephantnose | 来源:发表于2019-07-12 14:57 被阅读0次

tf.keras 是 TensorFlow 对 Keras API 规范的实现。这是一个用于构建和训练模型的高阶 API,包含对 TensorFlow 特定功能(例如 Eager Executiontf.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: softsigntanh 激活函数的另一个替代选择

  • relu: 收敛速度远快于sigmoidtanh

  • tanh: 效果不如 reluMaxout

  • sigmoid: 最好不要用 sigmoid,你可以试试 tanh,不过可以预期它的效果会比不上 reluMaxout

  • 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'])

预定义优化器种类

使用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_errormse
  • mean_absolute_errormae
  • mean_absolute_percentage_errormape
  • mean_squared_logarithmic_errormsle
  • 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')

未完待续

官方文档

相关文章

网友评论

      本文标题:tf.Keras

      本文链接:https://www.haomeiwen.com/subject/dlmekctx.html