Keras提供的模型,其中分为两类:
我们可以通过from tensorflow.keras import Sequential
或者 from tensorflow.keras import Sequential
来导入对应的模型。
官方原文档:https://tensorflow.google.cn/api_docs/python/tf/keras/Sequential?hl=zh-cn
Sequential 模型结构: 层(layers)的线性堆栈。简单来说,它是一个简单的线性结构,没有多余分支,是多个网络层的堆叠。
函数原型:
tf.keras.Sequential(
layers=None, name=None
)
一个简单示例
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense, Activation
model = Sequential([
Dense(32, input_shape=(784,)),
Activation('relu'),
Dense(10),
Activation('softmax')
])
上面的代码等价于
model = Sequential([
Dense(32, input_shape=(784,), activation='relu'),
Dense(10, activation='softmax')
])
构建方法
除了上面写到的:
model = Sequential([
Dense(32, input_shape=(784,), activation='relu'),
Dense(10, activation='softmax')
])
还可以写成:
model = Sequential()
model.add(Dense(32, input_shape=(784,), activation='relu'))
model.add(Dense(10, activation='softmax'))
input_shape 输入的形状
构建一个模型时,第一层需要给出期待的Input shape ,剩余的层次会自动判断。
input_shape
是一个tuple
格式的数据,可以是整数的tuple,也可以是Noneinput_shape
中并没有batch dimension
批量维度input_dim
(一个数字)来描述输入形状。input_dim
和 input_length
来描述输入型状。input_shape
通过tuple
的形式,指定输入形状。batch_size
可以指定固定批量大小。model = Sequential()
model.add(Dense(32, input_dim=784))
等价于:
model = Sequential()
model.add(Dense(32, input_shape=(784,)))
compile编译
在训练模型之前,我们需要通过compile来对学习过程进行配置。compile接收三个参数:
rmsprop
(默认)、adagrad
,或一个Optimizer
类的对象,详情见 待补充categorical_crossentropy
、mse
,也可以为一个损失函数。详情见 待补充metrics=['accuracy']
。指标可以是一个预定义指标的名字,也可以是一个用户定制的函数.指标函数应该返回单个张量,或一个完成metric_name - > metric_value
映射的字典.请参考 待补充# 对于多分类问题
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
# 对于二元分类问题
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
# 对于均方误差回归问题
model.compile(optimizer='rmsprop',
loss='mse')
# 自定义指标
import keras.backend as K
def mean_pred(y_true, y_pred):
return K.mean(y_pred)
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy', mean_pred])
训练
model = Sequential()
model.add(Dense(32, activation='relu', input_dim=100))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
# 生成数据
import numpy as np
data = np.random.random((1000, 100))
labels = np.random.randint(2, size=(1000, 1))
# Train the model, iterating on the data in batches of 32 samples
model.fit(data, labels, epochs=10, batch_size=32)
函数原型:
fit(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, validation_batch_size=None, validation_freq=1,max_queue_size=10, workers=1, use_multiprocessing=False)
其中常用的参数:
Integer
或 None
,代表每个梯度更新的样本数,默认值为32。Integer
,模型的训练的 时期数,每个epoch是对x,y的整个迭代。官方原文档:https://tensorflow.google.cn/api_docs/python/tf/keras/Model?hl=zh-cn
Model 模型是带有函数API的,不是线性的,它是一个可以多输入、多输出的模型。
model = Model(inputs=a, outputs=b)
model = Model(inputs=[a1, a2], outputs=[b1, b2, b3])
与Sequential类似,有compile fit等方法。大致和上述的compile和fit一致。
compile 编译
函数原型:
compile(
optimizer='rmsprop', loss=None, metrics=None, loss_weights=None,
weighted_metrics=None, run_eagerly=None, steps_per_execution=None, **kwargs
)
loss
,可以用过一个dict
来声明:{'output_a':loss_func_1, 'output_b':loss_func_2}
fit 训练
函数原型:
fit(
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, validation_batch_size=None, validation_freq=1,
max_queue_size=10, workers=1, use_multiprocessing=False
)
常用参数:
Model实例
from keras.layers import Input, Dense
from keras.models import Model
# 定义输入层,确定输入维度
input = input(shape = (784, ))
# 2个隐含层,每个都有64个神经元,使用relu激活函数,且由上一层作为参数
x = Dense(64, activation='relu')(input)
x = Dense(64, activation='relu')(x)
# 输出层
y = Dense(10, activation='softmax')(x)
# 定义模型,指定输入输出
model = Model(input=input, output=y)
# 编译模型,指定优化器,损失函数,度量
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
# 模型拟合,即训练
model.fit(data, labels)