【数据科学】Keras

简介: 【数据科学】Keras

一、Keras

  Keras是强大、易用的深度学习库基于Theano和TensorFlow提供了高阶神经网络API,用于 开发评估深度学习模型

  这里给出一个示例:

# 使用 Keras 建立一个简单的神经网络模型,并对数据进行训练和预测
# 导入所需的库,包括 numpy(用于生成随机数据),以及 Keras 中的相关模块
>>> import numpy as np
>>> from keras.models import Sequential
>>> from keras.layers import Dense
# 生成了一个 data 数组,形状为 (1000, 100),其中包含随机生成的数据
>>> data = np.random.random((1000,100))
# 生成一个 labels 数组,形状为 (1000, 1),其中包含随机生成的二分类标签
>>> labels = np.random.randint(2,size=(1000,1))
# 创建一个序贯模型 model,它是 Keras 中的一种常见模型类型
>>> model = Sequential()
# 使用 add 方法向模型添加两个全连接层
>>> model.add(Dense(32,activation='relu',input_dim=100))
# 第一层具有 32 个神经元,激活函数为 ReLU,并且输入维度为 100
>>> model.add(Dense(1, activation='sigmoid'))
# 第二层是输出层,具有一个神经元和 sigmoid 激活函数,用于二分类问题
>>> model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['accuracy'])
# 通过调用 compile 方法,配置模型的优化器为 'rmsprop',损失函数为 'binary_crossentropy',并指定了评估指标为准确率
>>> model.fit(data,labels,epochs=10,batch_size=32)
# 使用 fit 方法将数据和标签作为输入,对模型进行训练
>>> predictions = model.predict(data)
# 使用 predict 方法对训练数据进行预测,并将预测结果保存在 predictions 变量中

二、数据

  数据要存为 NumPy 数组或数组列表,使用 sklearn.cross_validation 的 train_test_split 模块进行 分割 将数据分割为训练集测试集

2.1 Keras 数据集

  使用 Keras 导入一些常见的数据集,并将它们分为训练集测试集

>>> from keras.datasets import boston_housing, 
mnist, cifar10, imdb >>> (x_train,y_train),(x_test,y_test) = mnist.load_data()
>>> (x_train2,y_train2),(x_test2,y_test2) = boston_housing.load_data()
>>> (x_train3,y_train3),(x_test3,y_test3) = cifar10.load_data()
>>> (x_train4,y_train4),(x_test4,y_test4) = imdb.load_data(num_words=20000)
>>> num_classes = 10

2.2 其它

  使用 NumPyurllib 库从一个 URL 加载数据,并将其分为特征向量 X 和标签向量 y

>>> from urllib.request import urlopen
>>> data = np.loadtxt(urlopen("http://archive.ics.uci.edu/ ml/machine-learning-databases/pima-indians-diabetes/
pima-indians-diabetes.data"),delimiter=",")
>>> X = data[:,0:8]
>>> y = data [:,8]

三、模型架构

3.1 序贯模型

  使用 Keras 库导入 Sequential 模型。然后,创建了三个模型对象,分别命名为 modelmodel2model3

  Sequential 模型是 Keras 中的一种简单堆叠模型,可以按照顺序将各层添加到模型中

  通过创建这三个 Sequential 模型对象,我们就可以 在每个模型中逐步添加层,并构建不同类型的神经网络模型

>>> from keras.models import Sequential
>>> model = Sequential()
>>> model2 = Sequential()
>>> model3 = Sequential()

3.2 多层感知器(MLP)

3.2.1 二进制分类

  使用 Keras 库导入 Dense 层,并通过 model.add() 方法逐一向 Sequential 模型中添加这些层。这三个 Dense 层构成了一个三层神经网络模型

  第一层是一个具有 12 个神经元的全连接层,接受输入维度为 8 的特征向量。该层的权重参数是均匀分布的,激活函数为 ReLU 函数(activation=‘relu’)。

  第二层是一个具有 8 个神经元的全连接层。该层不需要设置输入维度,因为它会 自动将上一层的输出作为输入。该层的权重参数也是均匀分布的,激活函数同样为 ReLU 函数

  最后一层是一个具有 1 个神经元的全连接层,代表输出层。该层的权重参数仍然是均匀分布的,激活函数为 Sigmoid 函数(activation=‘sigmoid’),用于将输出映射到 0 到 1 的范围内,表示二分类问题中每个输出值代表的概率。

>>> from keras.layers import Dense 
>>> model.add(Dense(12, input_dim = 8, kernel_initializer='uniform', activation='relu'))
>>> model.add(Dense(8,kernel_initializer='uniform',activation='relu'))
>>> model.add(Dense(1,kernel_initializer='uniform',activation='sigmoid'))

  添加层时可以设置不同的初始化方法(如 kernel_initializer)、激活函数(如 activation)、偏置参数(如 bias_initializer),以及其他需要的参数这些参数的选择和设置需要根据具体的问题和模型需求进行


3.2.2 多级分类

>>> from keras.layers import Dropout 
>>> model.add(Dense(512,activation='relu',input_shape=(784,)))
>>> model.add(Dropout(0.2))
>>> model.add(Dense(512,activation='relu'))
>>> model.add(Dropout(0.2))
>>> model.add(Dense(10,activation='softmax'))

3.2.3 回归

  这里我们导入了 Keras 库中的 Dropout 层,并在现有的 Sequential 模型 model 中添加了额外的层

>>> model.add(Dense(64,activation='relu',input_dim=train_data.shape[1]))
>>> model.add(Dense(1))

  通过 在模型中添加 Dropout 层,可以进一步改善模型的泛化能力减少过拟合的风险。丢弃率的选择通常需要我们进行实验和调整,这样才能达到 最佳的性能和泛化能力


3.3 卷积神经网络(CNN)

  导入 Keras 库中的一些新层,并在另一个 Sequential 模型 model2 中添加了这些层。这个模型主要用于处理图像数据

>>> from keras.layers import Activation,Conv2D,MaxPooling2D,Flatten 
>>> model2.add(Conv2D(32,(3,3),padding='same',input_shape=x_train.shape[1:]))
>>> model2.add(Activation('relu'))
>>> model2.add(Conv2D(32,(3,3)))
>>> model2.add(Activation('relu'))
>>> model2.add(MaxPooling2D(pool_size=(2,2)))
>>> model2.add(Dropout(0.25))
>>> model2.add(Conv2D(64,(3,3), padding='same'))
>>> model2.add(Activation('relu'))
>>> model2.add(Conv2D(64,(3, 3)))
>>> model2.add(Activation('relu'))
>>> model2.add(MaxPooling2D(pool_size=(2,2)))
>>> model2.add(Dropout(0.25))
>>> model2.add(Flatten())
>>> model2.add(Dense(512))
>>> model2.add(Activation('relu'))
>>> model2.add(Dropout(0.5))
>>> model2.add(Dense(num_classes))
>>> model2.add(Activation('softmax'))

  通过这些层的组合,可以构建一个卷积神经网络(CNN)模型来处理图像数据,并进行相应的分类任务


3.4 递归神经网络(RNN)

  导入 Keras 库中的一些新层,并在另一个 Sequential 模型 model3 中添加了这些层。这个模型主要用于处理文本数据

>>> from keras.klayers import Embedding,LSTM
>>> model3.add(Embedding(20000,128))
>>> model3.add(LSTM(128,dropout=0.2,recurrent_dropout=0.2))
>>> model3.add(Dense(1,activation='sigmoid'))

  通过这些层的组合,可以构建一个用于处理文本数据的模型。这里 模型使用了嵌入层来将整数序列映射为密集向量表示,并使用 LSTM 层对文本序列进行建模,最后 通过输出层进行二分类预测


四、预处理

4.1 序列填充

  我们导入 Keras 库中的 preprocessing 模块,并使用其中的 sequence 子模块来处理序列数据

>>> from keras.preprocessing import sequence
>>> x_train4 = sequence.pad_sequences(x_train4,maxlen=80)
>>> x_test4 = sequence.pad_sequences(x_test4,maxlen=80) 

  这里我们将 x_train4 中的训练样本序列以及 x_test4 中的测试样本序列进行了填充操作,将它们的长度都设置为 80。这样做是为了 确保序列长度一致,以便于后续在模型中处理和计算。而填充的方式可以是在序列的开头或结尾添加特定的符号或者补零


4.2 独热编码

  这里 导入了 Keras 库中的 utils 模块,并使用其中的 to_categorical 函数进行独热编码(one-hot encoding)的转换

>>> from keras.utils import to_categorical
>>> Y_train = to_categorical(y_train, num_classes)
>>> Y_test = to_categorical(y_test, num_classes) 
>>> Y_train3 = to_categorical(y_train3, num_classes) 
>>> Y_test3 = to_categorical(y_test3, num_classes)

  通过执行这些代码,我们将原始的类别标签经过独热编码转换成了适合在分类模型中使用的格式独热编码将每个类别的标签表示为一个向量,向量的长度等于类别的数量,其中只有一个元素为 1(表示该样本属于该类别),其他元素都为 0。这种编码方式可以更好地在训练分类模型时处理类别信息。


4.3 训练与测试集

  导入 scikit-learn 库中的 model_selection 模块,并使用其中的 train_test_split 函数将数据集进行划分

>>> from sklearn.model_selection import train_test_split 
>>> X_train5,X_test5,y_train5,y_test5 = train_test_split(X, y,test_size=0.33, random_state=42)

  通过执行这些代码,我们将数据集 X 和 y 进行了训练集和测试集的划分,其中 训练集的比例为总数据集的 67%,测试集的比例为总数据集的 33%。划分后的数据可以用于 模型的训练和评估,以验证模型在未见过的数据上的表现。同时,还使用了随机种子来确保划分结果的可重复性


4.4 标准化/归一化

  导入 scikit-learn 库中的 preprocessing 模块,并使用其中的 StandardScaler 类进行特征标准化

>>> from sklearn.preprocessing import StandardScaler
>>> scaler = StandardScaler().fit(x_train2)
>>> standardized_X = scaler.transform(x_train2)
>>> standardized_X_test = scaler.transform(x_test2)

  通过执行这些代码,对训练集数据 x_train2 进行了标准化处理,并将结果赋值给 standardized_X。同时,对测试集数据 x_test2 也进行了相同的标准化处理,并将结果赋值给 standardized_X_test标准化后的数据可以帮助提升机器学习模型的性能,特别是对于那些受到不同特征尺度影响较大的模型,例如使用欧氏距离的算法。


五、审视模型

>>> model.output_shape # 模型输出形状
>>> model.summary() # 模型摘要展示
>>> model.get_config() # 模型配置
>>> model.get_weights() # 列出模型的所有权重张量

  通过执行这些代码,我们可以方便地查看模型的输出形状、摘要信息、配置以及所有权重张量


六、编译模型

6.1 多层感知器:二进制分类

  这里 使用了 model.compile 方法来配置模型的训练参数

  此外,使用了 Adam 优化器,这是一种常用的优化器算法,用于自适应地调整学习率以提高模型的性能

  我们还使用了二分类交叉熵损失函数,适用于二分类任务,例如判断输出为两个类别的问题。

>>> model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

  我们这里配置了模型的优化器、损失函数和评估指标,为模型的训练做好了准备。


6.2 多层感知器:多级分类

  这里同样使用 model.compile 方法来配置模型的训练参数,只不过使用了 RMSprop 优化器

  同时,还使用了分类交叉熵损失函数,适用于 多分类任务,例如需要将输入分为多个类别的问题。

>>> model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])

6.3 多层感知器:回归

  使用了 model.compile 方法来配置模型的训练参数

>>> model.compile(optimizer='rmsprop', loss='mse', metrics=['mae'])

  在这里,使用了均方误差Mean Squared Error,MSE作为损失函数适用于回归问题,其中目标值是连续的数值。

  使用了平均绝对误差(Mean Absolute Error,MAE)作为模型的评估指标用于衡量模型在训练过程中预测与真实值之间的平均绝对差距


6.4 递归神经网络

  使用了 model3.compile 方法来配置模型的训练参数

>>> model3.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

七、模型训练

>>> model3.fit(x_train4, y_train4, batch_size=32, epochs=15, verbose=1, validation_data = (x_test4,y_test4))

  这里我们开始 模型的训练过程模型会使用训练集进行多轮的训练并在每个周期结束后使用验证集进行评估训练过程中的损失值和准确率等信息将被输出。训练完毕后,将得到训练好的模型,可以用于进行预测和其他任务。


八、评估模型性能

  使用了 model3.evaluate 方法来对模型在测试集上进行评估

>>> score = model3.evaluate(x_test, y_test, batch_size=32)

  计算了模型在测试集上的损失值和准确率或其他指定的评估指标)。返回的 score 变量包含了评估结果,这里 可以根据需要使用该结果进行后续分析、比较不同模型的性能或其他操作


九、预测

  使用了 model3.predict 和 model3.predict_classes 方法来对模型进行预测。它们分别返回输入数据的预测结果和预测类别

>>> model3.predict(x_test4, batch_size=32)
>>> model3.predict_classes(x_test4,batch_size=32)

十、保存/加载模型

  保存和加载 Keras 模型

>>> from keras.models import load_model
>>> model3.save('model_file.h5')
>>> my_model = load_model('my_model.h5')

  可以将已经训练好的模型保存到文件,并在以后需要时加载它们,而不必重新训练模型。这样就能 避免重复训练和共享模型 了。


十一、模型微调

11.1 参数优化

  使用 RMSprop 优化器对模型进行编译

>>> from keras.optimizers import RMSprop
>>> opt = RMSprop(lr=0.0001, decay=1e-6)
>>> model2.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])

  通过这样的编译过程,模型就配置好了损失函数、优化器和评价指标,可以进行训练、评估和预测等任务


11.2 早停法

  使用 EarlyStopping 回调函数来 在训练过程中实现早停

>>> from keras.callbacks import EarlyStopping
>>> early_stopping_monitor = EarlyStopping(patience=2)
>>> model3.fit(x_train4, y_train4, batch_size=32, epochs=15, validation_data=(x_test4,y_test4), callbacks=[early_stopping_monitor])

  通过使用 EarlyStopping 回调函数,训练过程将在验证集上的性能不再改善时提前停止,以避免过拟合,并节省训练时间。


相关文章
|
4月前
|
机器学习/深度学习 算法 TensorFlow
TensorFlow 机器学习秘籍第二版:6~8(1)
TensorFlow 机器学习秘籍第二版:6~8(1)
68 0
|
4月前
|
机器学习/深度学习 测试技术 TensorFlow
TensorFlow 机器学习秘籍第二版:9~11(4)
TensorFlow 机器学习秘籍第二版:9~11(4)
51 0
|
4月前
|
机器学习/深度学习 自然语言处理 TensorFlow
TensorFlow 机器学习秘籍第二版:6~8(3)
TensorFlow 机器学习秘籍第二版:6~8(3)
57 0
|
4月前
|
机器学习/深度学习 算法 TensorFlow
TensorFlow 机器学习秘籍第二版:1~5(5)
TensorFlow 机器学习秘籍第二版:1~5(5)
44 0
|
4月前
|
机器学习/深度学习 存储 TensorFlow
TensorFlow 机器学习秘籍第二版:6~8(4)
TensorFlow 机器学习秘籍第二版:6~8(4)
40 0
|
4月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
TensorFlow 机器学习秘籍第二版:9~11(2)
TensorFlow 机器学习秘籍第二版:9~11(2)
42 0
|
4月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
TensorFlow 机器学习秘籍第二版:9~11(3)
TensorFlow 机器学习秘籍第二版:9~11(3)
20 0
|
4月前
|
机器学习/深度学习 算法 TensorFlow
TensorFlow 机器学习秘籍第二版:6~8(2)
TensorFlow 机器学习秘籍第二版:6~8(2)
49 0
|
4月前
|
机器学习/深度学习 算法 TensorFlow
TensorFlow 机器学习秘籍第二版:1~5(2)
TensorFlow 机器学习秘籍第二版:1~5(2)
105 0
|
4月前
|
机器学习/深度学习 自然语言处理 算法
TensorFlow 机器学习秘籍第二版:9~11(1)
TensorFlow 机器学习秘籍第二版:9~11(1)
43 0