4

TensorFlow2简单入门- Keras 模型: Sequential 顺序模型和 Model 模型

 3 years ago
source link: https://blog.csdn.net/qq_38251616/article/details/115690530
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Keras 模型

Keras提供的模型,其中分为两类:

  • Sequential 顺序模型
  • Model 类模型(使用函数式 API 的 Model 类模型)

我们可以通过from tensorflow.keras import Sequential或者 from tensorflow.keras import Sequential来导入对应的模型。

Sequential 顺序模型


官方原文档:https://tensorflow.google.cn/api_docs/python/tf/keras/Sequential?hl=zh-cn


Sequential 模型结构: 层(layers)的线性堆栈。简单来说,它是一个简单的线性结构,没有多余分支,是多个网络层的堆叠。

函数原型:

tf.keras.Sequential(
    layers=None, name=None
)

Sequential 使用方法

一个简单示例

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')
])
  • 其中,Dense是一个全连接层,它的激活函数默认为是linear线性函数
  • 激活函数可以通过 单独的激活层 实现,也可以通过 构建层时传递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()
model.add(Dense(32, input_shape=(784,), activation='relu'))
model.add(Dense(10, activation='softmax'))

input_shape 输入的形状

构建一个模型时,第一层需要给出期待的Input shape ,剩余的层次会自动判断。

  • input_shape是一个tuple格式的数据,可以是整数的tuple,也可以是None
  • input_shape中并没有batch dimension 批量维度
  • 2D层,例如Dense, 可以通过指定参数 input_dim (一个数字)来描述输入形状。
  • 3D层,通过参数 input_diminput_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接收三个参数:

  • 优化器optimizer: 该参数可指定为已预定义的优化器名,如rmsprop(默认)、adagrad,或一个Optimizer类的对象,详情见 待补充
  • 损失函数loss: 该参数为模型试图最小化的目标函数,它可为预定义的损失函数名,如categorical_crossentropymse,也可以为一个损失函数。详情见 待补充
  • 指标列表metrics: 对分类问题,我们一般将该列表设置为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)

其中常用的参数:

  • x: Numpy训练数据数组(如果模型有单个输入),或Numpy数组列表(如果模型有多个输入)。也可以是已经命名的输入图层的名称。 如果从框架原生张量(例如TensorFlow数据张量)进行馈送,则x可以是None(默认)。
  • y: 与x相似,只不过y代表的是目标标签(target label)。可以是:Numpy目标(标签)数据数组(如果模型具有单个输出)或Numpy数组列表(如果模型具有多个输出)或 输入图层的名称 或None.
  • batch_sizeIntegerNone,代表每个梯度更新的样本数,默认值为32。
  • epochsInteger,模型的训练的 时期数,每个epoch是对x,y的整个迭代。

Model 模型


官方原文档: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])
  • 通过inputs 和 outputs 构造多输入(a1,a2)和多输出(b1,b2,b3)的Model

Model 使用方法

与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
)
  • 优化器optimizer: 该参数可指定为已预定义的优化器名,如rmsprop(默认)、adagrad,或一个Optimizer类的对象,详情见 待补充
  • 损失函数oss: 与Sequential的compile的loss有所不同的是,Model的多个输出可以有多个loss,可以用过一个dict来声明:{'output_a':loss_func_1, 'output_b':loss_func_2}
  • 指标列表metrics: 对分类问题,我们一般将该列表设置为metrics=[‘accuracy’]。指标可以是一个预定义指标的名字,也可以是一个用户定制的函数.指标函数应该返回单个张量,或一个完成metric_name - > metric_value映射的字典.请参考 待补充

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
)

常用参数:

  • x:输入数据。如果模型只有一个输入,那么x的类型是numpy array,如果模型有多个输入,那么x的类型应当为list,list的元素是对应于各个输入的numpy array。如果模型的每个输入都有名字,则可以传入一个字典,将输入名与其输入数据对应起来。
  • y:标签,numpy array。如果模型有多个输出,可以传入一个numpy array的list。如果模型的输出拥有名字,则可以传入一个字典,将输出名与其标签对应起来。
  • batch_size:整数,指定进行梯度下降时每个batch包含的样本数。训练时一个batch的样本会被计算一次梯度下降,使目标函数优化一步。
  • epoch:整数,训练的轮数,训练数据将会被遍历epoch次。

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)

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK