Keras深度学习模型Sequential和Model详解
作者:小锋学长生活大爆炸
这篇文章主要介绍了Keras深度学习模型Sequential和Model详解,在Keras中有两种深度学习的模型:序列模型(Sequential)和通用模型(Model),差异在于不同的拓扑结构,,需要的朋友可以参考下
Keras模型
在Keras中有两种深度学习的模型:序列模型(Sequential)和通用模型(Model)。
差异在于不同的拓扑结构。
Sequential序列模型
序列模型各层之间是依次顺序的线性关系(多个网络层的线性堆叠),模型结构通过一个列表来制定,或者逐层添加网络结构。
通过将网络层实例的列表传递给 Sequential
的构造器,来创建一个 Sequential
模型。
# 导入类 from keras.models import Sequential from keras.layers import Dense, Activation
# 构建Sequential模型 # Model是keras最核心的数据结构 model = Sequential([ Dense(32, input_shape=(784,)), Activation('relu'), Dense(10), Activation('softmax'), ])
也可以简单地使用 .add()
方法将各层添加到模型中
model = Sequential() model.add(Dense(32, input_dim=784)) model.add(Activation('relu')) model.add(Dense(10)) model.add(Activation('softmax'))
指定输入数据的尺寸 在第一层,模型需要知道它所期望的输入尺寸。
而在后面的层中,模型可以自动地推断尺寸。
- 方式1:传递一个input_shape参数给第一层。它是一个表示尺寸的元组(一个由整数或None组成的元组,其中None表示可能为任何正整数)。在input_shape中不包含数据的batch大小。
- 方式2:某些2D层,如Dense,支持通过参数input_dim指定输入尺寸;某些3D时序层支持input_dim和input_length参数。
- 方式3:如果你需要为你的输入制定一个固定大小的batch(对stateful RNNs很有用),可以传递一个batch_size参数给一个层。如果你同时将batch_size=32和input_shape=(6,8)传递给一个层,那么每一批输入的尺寸就为(32,6,8)。
因此,如下代码是等价的:
model.add(Dense(32, input_shape=(784,))
model.add(Dense(32, input_dim=784))
模型编译
在训练模型之前,通过 compile
方法配置学习过程,接收的参数:
- 优化器optimizer:可以是现有优化器的字符串标识符(如
rmsprop
或adagrad
),也可以是Optimizer
类的示例,见optimizers; - 损失函数loss:模型试图最小化的目标函数。他可以使现有损失函数的字符串标识符(如
categorical_crossentropy
或mse
),也可以是一个目标函数,见losses; - 评估标准metrics:对于任何分类问题,都希望将其设置为
metrics = ['accuracy']
。他可以使现有的字符串标识符,也可以是自定义的评估标准函数。
# 分类问题 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] )
模型训练
在输入数据和标签的Numpy矩阵上进行训练。为了训练这一个模型,通常会使用 fit
函数,见文档
# 对于具有2个类的单输入模型(二进制分类) 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)) # 训练模型,以32个样本为一个batch进行迭代 model.fit(data, labels, epochs=10, batch_size=32)
Epoch 1/10 1000/1000 [==============================] - 0s 105us/step - loss: 0.7028 - accuracy: 0.4980 Epoch 2/10 1000/1000 [==============================] - 0s 32us/step - loss: 0.6932 - accuracy: 0.5380 Epoch 3/10 1000/1000 [==============================] - 0s 34us/step - loss: 0.6862 - accuracy: 0.5510 Epoch 4/10 1000/1000 [==============================] - 0s 34us/step - loss: 0.6842 - accuracy: 0.5580 Epoch 5/10 1000/1000 [==============================] - 0s 31us/step - loss: 0.6834 - accuracy: 0.5570 Epoch 6/10 1000/1000 [==============================] - 0s 34us/step - loss: 0.6799 - accuracy: 0.5720 Epoch 7/10 1000/1000 [==============================] - 0s 34us/step - loss: 0.6760 - accuracy: 0.5860 Epoch 8/10 1000/1000 [==============================] - 0s 37us/step - loss: 0.6742 - accuracy: 0.5920 Epoch 9/10 1000/1000 [==============================] - 0s 35us/step - loss: 0.6702 - accuracy: 0.5810 Epoch 10/10 1000/1000 [==============================] - 0s 36us/step - loss: 0.6686 - accuracy: 0.6050 <keras.callbacks.callbacks.History at 0x1e1c574b888>
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)
到此这篇关于Keras深度学习模型Sequential和Model详解的文章就介绍到这了,更多相关Keras深度学习模型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!