简介
keras是一个基于tensorflow的高层级API,用户友好。今天大致看了官网的keras guide记录一下学习中觉得需要注意事项以及还未来得及深究的内容。会涉及到的有使用keras实现模型的大家、编译compile和学习fit;除了简单的模型实现之外,还有创建模型的其余方式,以及动态图机制eager execution的一些内容。
导入keras:
keras已经是tensorflow的一个模块了。
import tensorflow as tf
from tensorflow import keras
输入数据
keras既可以使用numpy格式的数据,也可以使用tensorflow DataSet APi 格式的数据。前者适合小规模数据量的训练,后者适合大规模的。
#小数据量的numpy类型
import numpy as np
data = np.random.random((1000, 32))
labels = np.random.random((1000, 10))
val_data = np.random.random((100, 32))
val_labels = np.random.random((100, 10))
#大数据量的Dataset类型
dataset = tf.data.Dataset.from_tensor_slices((data, labels))
dataset = dataset.batch(32)
dataset = dataset.repeat()
构建模型
1.简单的叠加方式
使用线性叠加的方式,构建模型。tf.keras.Sequential,神经网络的layer可以作为参数直接输入Sequential中,也可以使用add方法添加。
model = keras.Sequential()
# Adds a densely-connected layer with 64 units to the model:
model.add(keras.layers.Dense(64, activation='relu'))
# Add another:
model.add(keras.layers.Dense(64, activation='relu'))
# Add a softmax layer with 10 output units:
model.add(keras.layers.Dense(10, activation='softmax'))
其中layer层有很多不同的类型,可以通过这个网址查看layer层的类型.layer层的可选参数有激活函数activation(默认为没有,可选sigmoid/softmax等)、kernel_initializer和 bias_initializer(默认Glorot uniform)、kernel_regularizer和 bias_regularizer(L1或者L2正则,默认没有)
2.功能性API
这种方式可以构建复杂拓扑结构的网络。多输入。多输出、共享层等。这种网络构建的理解如下:
- layer实例的输入和输出都是tensor
- 使用tf.keras.Model 构建一个网络实例,并给定输入和输出的tensor即可,其中输出tensor可以是多个layer层构建的结果。
inputs = keras.Input(shape=(32,)) # Returns a placeholder tensor
# A layer instance is callable on a tensor, and returns a tensor.
x = keras.layers.Dense(64, activation='relu')(inputs)
x = keras.layers.Dense(64, activation='relu')(x)
predictions = keras.layers.Dense(10, activation='softmax')(x)
# Instantiate the model given inputs and outputs.
model = keras.Model(inputs=inputs, outputs=predictions)
3.构建Model子类
不怎么建议使用构建model子类的方式,这种方式虽然便捷,但是也会带来更高的复杂度以及内部出错的可能性。推荐使用功能性API。在eager execution(动态图机制)中,构建子类的方式很有用
在init方法中定义网络的层次,也就是给出每一层并将这些层设置为实例属性。必须定义call方法给明网络的构建方式。
class MyModel(keras.Model):
def __init__(self, num_classes=10):
super(MyModel, self).__init__(name='my_model')
self.num_classes = num_classes
# Define your layers here.
self.dense_1 = keras.layers.Dense(32, activation='relu')
self.dense_2 = keras.layers.Dense(num_classes, activation='sigmoid')
def call(self, inputs):
# Define your forward pass here,
# using layers you previously defined (in `__init__`).
x = self.dense_1(inputs)
return self.dense_2(x)
def compute_output_shape(self, input_shape):
# You need to override this function if you want to use the subclassed model
# as part of a functional-style model.
# Otherwise, this method is optional.
shape = tf.TensorShape(input_shape).as_list()
shape[-1] = self.num_classes
return tf.TensorShape(shape)
# Instantiates the subclassed model.
model = MyModel(num_classes=10)
训练和评估模型
构建模型参数
在模型构建之后,需要配置训练过程,配置使用compile方法。
model.compile(optimizer=tf.train.AdamOptimizer(0.001),
loss='categorical_crossentropy',
metrics=['accuracy'])
# Configure a model for categorical classification.
model.compile(optimizer=tf.train.RMSPropOptimizer(0.01),
loss=keras.losses.categorical_crossentropy,
metrics=[keras.metrics.categorical_accuracy])
主要的参数如下:
- optimizer:用于指定训练的方式,比如梯度下降方式GradientDescentOptimizer等。
- loss:损失函数,常用的有mean square error (mse), categorical_crossentropy, 和 binary_crossentropy
- metrics:用于检测训练时的质量,可以判断过拟合等情况,在模型训练的时候会显示loss以及这里出现的metrics.
上面的这些参数既可以是特定的字符串,也可以是特定的callable类对象。
训练模型
#训练数据是numpy类型
model.fit(data, labels, epochs=10, batch_size=32,
validation_data=(val_data, val_labels))
#训练数据是DataSet类型
model.fit(dataset, epochs=10, steps_per_epoch=30)
model.fit(dataset, epochs=10, steps_per_epoch=30,
validation_data=val_dataset,
validation_steps=3)
对于Numpy数据,fit方法的主要参数有:
- epoch 全面数据跑几次
- batch_size: 模型每次运行一小部分数据,这一小部分的数量。
- validation_data:作为验证集的数据,注意这部分数据不可以是测试集数据
对于DataSet类型的数据,fit方法的主要参数有:
- steps_per_epoch:每轮epoch训练中的训练步数。这是一个重要的参数。因为Dataset会产出批量的数据(batch of data),所以不需要batch_size参数
当然,同时可以设置验证集数据和验证集步数。
评估和模型
使用tf.keras.Model.evaluate可以对模型进行评估,同样的输入数据可以是numpy类型,也可以是DataSet类型。但是不可以是单一的数据哦,注意格式。
model.evaluate(x, y, batch_size=32)
model.evaluate(dataset, steps=30)
使用tf.keras.Model.predict 进行预测,同样的输入数据可以是numpy类型,也可以是DataSet类型。
model.predict(x, batch_size=32)
model.predict(dataset, steps=30)
学习疑问
- guide中有一个定义用户层的内容,没有仔细看,等涉及到使用的时候在研究。
- 对complie中的optimizer几种类型的优化器不是很懂,对于网络训练中的实际使用也只有很模糊的概念,后续需要仔细研究。
网友评论