Keras中Sequential模型及⽅法详细总结
Sequential 序贯模型
序贯模型是函数式模型的简略版,为最简单的线性、从头到尾的结构顺序,不分叉,是多个⽹络层的线性堆叠。
Keras实现了很多层,包括core核⼼层,Convolution卷积层、Pooling池化层等⾮常丰富有趣的⽹络结构。
我们可以通过将层的列表传递给Sequential的构造函数,来创建⼀个Sequential模型。
dels import Sequential
from keras.layers import Den, Activation
model = Sequential([
Den(32, input_shape=(784,)),
Activation('relu'),
Den(10),
Activation('softmax'),
])
也可以使⽤.add()⽅法将各层添加到模型中:
model = Sequential()
model.add(Den(32, input_dim=784))
model.add(Activation('relu'))
指定输⼊数据的尺⼨
模型需要知道它所期待的输⼊的尺⼨(shape)。出于这个原因,序贯模型中的第⼀层(只有第⼀层,因为下⾯的层可以⾃动的推断尺⼨)需要接收关于其输⼊尺⼨的信息,后⾯的各个层则可以⾃动的推导出中间数据的shape,因此不需要为每个层都指定这个参数。有以下⼏种⽅法来做到这⼀点:
传递⼀个input_shape参数给第⼀层。它是⼀个表⽰尺⼨的元组(⼀个整数或None的元组,其中None
表⽰可能为任何正整数)。在
input_shape中不包含数据的batch⼤⼩。
某些 2D 层,例如 Den,⽀持通过参数 input_dim 指定输⼊尺⼨,某些 3D 时序层⽀持 input_dim 和 input_length 参数。
如果你需要为你的输⼊指定⼀个固定的 batch ⼤⼩(这对 stateful RNNs 很有⽤),你可以传递⼀个 batch_size 参数给⼀个层。如果你同时将 batch_size=32 和 input_shape=(6, 8) 传递给⼀个层,那么每⼀批输⼊的尺⼨就为 (32,6,8)。
因此下⾯的代码是等价的。
model = Sequential()
model.add(Den(32, input_shape=(784,)))
model = Sequential()
初中 英语
model.add(Den(32, input_dim=784))
下⾯三种⽅法也是严格等价的
model = Sequential()
model.add(LSTM(32, input_shape=(10,64)))
model = Sequential()
model.add(LSTM(32, batch_input_shape=(None,10,64)))
model = Sequential()
model.add(LSTM(32, input_length=10, input_dim=64))
编译sharply
英语俚语在训练模型之前,我们需要配置学习过程,这是通过compile⽅法完成的,他接收三个参数:
优化器 optimizer:它可以是现有优化器的字符串标识符,如 rmsprop 或 adagrad,也可以是 Optimizer 类的实例。详见:optimizers。铯与水反应
损失函数 loss:模型试图最⼩化的⽬标函数。它可以是现有损失函数的字符串标识符,如 categorical_crosntropy 或 m,也可以是⼀个⽬标函数。详见:loss。
评估标准 metrics:对于任何分类问题,你都希望将其设置为 metrics = [‘accuracy’]。评估标准可以是现有的标准的字符串标识符,也可以是⾃定义的评估标准函数。
# 多分类问题
loss='categorical_crosntropy',
metrics=['accuracy'])
# ⼆分类问题
loss='binary_crosntropy',
metrics=['accuracy'])
繁星 巴金
# 均⽅误差回归问题
loss='m')
# ⾃定义评估标准函数
import keras.backend as K
jellydef mean_pred(y_true, y_pred):
an(y_pred)
loss='binary_crosntropy',
metrics=['accuracy', mean_pred])
训练
Keras 模型在输⼊数据和标签的 Numpy 矩阵上进⾏训练。为了训练⼀个模型,你通常会使⽤ fit 函数。。
# 对于具有2个类的单输⼊模型(⼆进制分类):
model = Sequential()
model.add(Den(32, activation='relu', input_dim=100))
model.add(Den(1, activation='sigmoid'))
loss='binary_crosntropy',
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)
# 对于具有10个类的单输⼊模型(多分类分类):
model = Sequential()
model.add(Den(32, activation='relu', input_dim=100))
model.add(Den(10, activation='softmax'))
loss='categorical_crosntropy',
metrics=['accuracy'])
# ⽣成虚拟数据
import numpy as np
data = np.random.random((1000,100))
labels = np.random.randint(10, size=(1000,1))
# 将标签转换为分类的 one-hot 编码
one_hot_labels = _categorical(labels, num_class=10)
# 训练模型,以 32 个样本为⼀个 batch 进⾏迭代
model.fit(data, one_hot_labels, epochs=10, batch_size=32)
例⼦
视听说3答案
这⾥有⼏个可以帮助你开始的例⼦!
在 ⽬录 中,你可以找到真实数据集的⽰例模型:
CIFAR10 ⼩图⽚分类:具有实时数据增强的卷积神经⽹络 (CNN) IMDB 电影评论情感分类:基于词序列的 LSTM
Reuters 新闻主题分类:多层感知器 (MLP)
MNIST ⼿写数字分类:MLP 和 CNN
基于 LSTM 的字符级⽂本⽣成
基于多层感知器 (MLP) 的 softmax 多分类:
import keras
dels import Sequential
from keras.layers import Den, Dropout, Activation
from keras.optimizers import SGD
# ⽣成虚拟数据
import numpy as np
x_train = np.random.random((1000,20))
y_train = _categorical(np.random.randint(10, size=(1000,1)), num_class=10)
x_test = np.random.random((100,20))
y_test = _categorical(np.random.randint(10, size=(100,1)), num_class=10)
model = Sequential()
# Den(64) 是⼀个具有 64 个隐藏神经元的全连接层。
# 在第⼀层必须指定所期望的输⼊数据尺⼨:
# 在这⾥,是⼀个 20 维的向量。
model.add(Den(64, activation='relu', input_dim=20))
model.add(Dropout(0.5))
model.add(Den(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Den(10, activation='softmax'))
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
optimizer=sgd,
metrics=['accuracy'])
model.fit(x_train, y_train,
epochs=20,
batch_size=128)
score = model.evaluate(x_test, y_test, batch_size=128)
基于多层感知器的⼆分类:
思路:
输⼊数据:定义输⼊⼀个⼆维数组(x1,x2),数据通过numpy来随机产⽣,将输出定义为0或者1,如果x1+x2<1,则y为1,否则y为0.
隐藏层:定义两层隐藏层,隐藏层的参数为(2,3),两⾏三列的矩阵,输⼊数据通过隐藏层之后,输出的数据为(1,3),t通过矩阵之间的乘法运算可以获得输出数据。
损失函数:使⽤交叉熵作为神经⽹络的损失函数,常⽤的损失函数还有平⽅差。
优化函数:通过油画函数来使得损失函数最⼩化,这⾥采⽤的是Adadelta算法进⾏优化,常⽤的有梯度下降算法。
输出数据:将隐藏层的输出数据通过(3,1)的参数,输出⼀个⼀维向量,值的⼤⼩为0或者1.
import numpy as np
dels import Sequential
disappearfrom keras.layers import Den,Dropout
# ⽣成数据,训练数据和测试数据
# x_train/x_test ⽣成随机的浮点数,x_train为1000⾏20列 x_test为100⾏20列
# 列数⼀定要⼀⼀对应,相当于特征个数要对应
# 此处的⼆元分类,可以不需要one_hot编译,np.random.randint可以直接⽣成0 1 编码x_train = np.random.random((1000,20))
y_train = np.random.randint(2,size=(1000,1))
# print(x_train)
# print(y_train)
x_test = np.random.random((100,20))
y_test = np.random.randint(2,size=(100,1))
# 设计模型,通过add的⽅式叠起来
# 注意输⼊时,初始⽹络⼀定要给定输⼊的特征维度input_dim 或者input_shape数据类型# activition激活函数既可以在Den⽹络设置⾥,也可以单独添加
model = Sequential()
model.add(Den(64,input_dim=20,activation='relu'))
# Drop防⽌过拟合的数据处理⽅式
ideas
model.add(Dropout(0.5))
model.add(Den(64,activation='relu'))
model.add(Dropout(0.5))
model.add(Den(1,activation='sigmoid'))
# 编译模型,定义损失函数,优化函数,绩效评估函数
optimizer='rmsprop',
metrics=['accuracy'])
# 导⼊数据进⾏训练
model.fit(x_train,y_train,epochs=20,batch_size=128)
# 模型评估
score = model.evaluate(x_test,y_test,batch_size=128)
print(score)
类似VGG的卷积神经⽹络