目录
1. Keras 简介
Keras是一个高层神经网络API,Keras由纯Python编写而成并基Tensorflow、Theano以及CNTK后端。Keras 为支持快速实验而生,能够把你的idea迅速转换为结果,keras的基本特点:
- 简易和快速的原型设计(keras具有高度模块化,极简,和可扩充特性)
- 支持CNN和RNN,或二者的结合
- 无缝CPU和GPU切换
注意:Keras适用的Python版本是:Python 2.7-3.6
1.1 Keras的重要API
Keras的API主要可以分为以下几类:
layers
主要涉及神经网络的一些构件,如全连接,卷积,最大池化等。
## layers相关API
input_tensor = keras.layers.Input(shape=(784,)) # 实质上 shape = (None, 784)——默认 784 前面有一个batchsize 为 None
keras.layers.Dense(units=10,activation=keras.activations.relu,use_bias=True)
keras.layers.Softmax(axis=-1)(input_tensor)
keras.layers.Flatten()
a = keras.layers.Input(shape=(28,))
print(a)
b = keras.layers.Input(shape=(56,))
print(b)
c= keras.layers.concatenate([a,b],axis=-1) # 对应最后一个维度,即 28 和 56
print(c)
activations
主要涉及神经网络的常用激活函数。
## activations相关API
keras.activations.relu
keras.activations.sigmoid
keras.activations.tanh
losses
主要涉及一些常用的损失函数。
## losses相关API
keras.losses.categorical_crossentropy
keras.losses.sparse_categorical_crossentropy
keras.losses.mean_squared_error
keras.losses.mean_absolute_error
keras.losses.logcosh()
metrics
主要涉及常用的模型评估方法。
## metric相关API
keras.metrics.accuracy
keras.metrics.sparse_top_k_categorical_accuracy
keras.metrics.Precision()
keras.metrics.Recall()
optimizers
主要涉及常用的优化方法。
## optimizers相关API
keras.optimizers.SGD()
keras.optimizers.RMSprop()
keras.optimizers.Adam()
models
主要涉及模型的组装,模型的保存,模型的加载。
(1)模型类型
Keras 有两种模型:Sequential API 和 Function API
- Sequential API
# Sequential API
model = keras.models.Sequential([keras.layers.Dense(30, activation="relu",input_shape=[10]),keras.layers.Dense(1)])
print(model.input_shape)
model.compile(loss="mean_squared_error", optimizer="sgd")
- Function API
#Function API
#单输入单输出
input_tensor = keras.layers.Input(shape=(12,))
hidden1 = keras.layers.Dense(30, activation="relu")(input_tensor)
hidden2 = keras.layers.Dense(30, activation="relu")(hidden1)
concat = keras.layers.Concatenate(axis=-1)([input_tensor, hidden2])
output_tensor = keras.layers.Dense(1)(concat)
keras.models.Model(inputs=[input_tensor],outputs=[output_tensor])
#多输入单输出
input_A = keras.layers.Input(shape=[5])
input_B = keras.layers.Input(shape=[6])
hidden1 = keras.layers.Dense(30, activation="relu")(input_B)
hidden2 = keras.layers.Dense(30, activation="relu")(hidden1)
concat = keras.layers.Concatenate(axis=-1)([input_A, hidden2])
output = keras.layers.Dense(1)(concat)
model = keras.models.Model(inputs=[input_A, input_B], outputs=[output])
#多输入多输出
input_A = keras.layers.Input(shape=[5])
input_B = keras.layers.Input(shape=[6])
hidden1 = keras.layers.Dense(30, activation="relu")(input_B)
hidden2 = keras.layers.Dense(30, activation="relu")(hidden1)
concat = keras.layers.concatenate([input_A, hidden2])
output = keras.layers.Dense(1)(concat)
aux_output = keras.layers.Dense(1)(hidden2)
model = keras.models.Model(inputs=[input_A, input_B],outputs=[output, aux_output])
model.compile(loss=["mse", "mae"], loss_weights=[0.9, 0.1], optimizer="sgd")
(2) 模型训练
model.fit([X_train_A, X_train_B], [y_train, y_train], epochs=20,batch_size=64,validation_data=([X_valid_A,X_valid_B],[y_valid, y_valid]))
(3)模型保存
## model系列API
keras.models.save_model
keras.models.load_model
backend
主要涉及更底层的一些操作,如张量的操作。
## backend系列API
keras.backend.argmax
keras.backend.sum
callbacks
主要涉及一些回调函数的操作。如模型的保存,模型的可视化。
callback 用在 model.fit() 中
## callback系列API
keras.callbacks.ModelCheckpoint()
keras.callbacks.TensorBoard()
1.2 网络建立过程
使用Keras建立神经网络主要包含三个步骤:
- 准备数据。
- 搭建神经网络结构。
- 编译模型(确定损失函数、优化方法和回调函数)。
- 训练模型。
2. 代码实例
下面将使用一个简单的纯keras来实现一个神经网络,纯keras实现神经网络方便且简单。
要解决的问题fashion-mnist数据集问题:
这是一个十分类问题。
解决步骤:
- 数据准备
- 网络结构设计
- 损失函数设计
- 优化方法设计
import warnings
warnings.filterwarnings('ignore')
import numpy as np
from tensorflow.python import keras
fashion_mnist = keras.datasets.fashion_mnist
# 数据准备
(X_train_full, y_train_full), (X_test, y_test) = fashion_mnist.load_data()
X_train_scaler = X_train_full/255.
X_test_scaler = X_test/255.
X_train_scaler = X_train_scaler.reshape(-1,28*28)
X_test_scaler = X_test_scaler.reshape(-1,28*28)
class_names = ["T-shirt/top", "Trouser", "Pullover", "Dress", "Coat","Sandal", "Shirt", "Sneaker", "Bag", "Ankle boot"]
y_train = keras.utils.to_categorical(y_train_full,num_classes=10)
y_test = keras.utils.to_categorical(y_test,num_classes=10)
from matplotlib import pyplot as plt
%matplotlib inline
index = 666
plt.imshow(X_train_scaler[666].reshape(28,28),cmap='gray')
from tensorflow.python.keras.layers import Dense,Softmax,Activation,Input
from tensorflow.python.keras.models import Model
from tensorflow.python.keras.callbacks import ModelCheckpoint,TensorBoard
from tensorflow.python.keras import backend as K
import os
import tensorflow as tf
# 网络架构设计
input_tensor = Input(shape=(784,))
hidden1 = Activation(activation='relu')(Dense(units=32,use_bias=True)(input_tensor))
hidden2 = Activation(activation='relu')(Dense(units=16,use_bias=True)(hidden1))
logits = Dense(units=10,use_bias=True)(hidden2)
pred = Softmax()(logits)
# 损失函数设计: 注意loss和metric的区别
loss_op = keras.losses.categorical_crossentropy
# 模型评估
def accuracy(y_true,y_pred):
y_t = tf.argmax(y_true,axis=1)
y_p = tf.argmax(y_pred,axis=1)
return tf.reduce_mean(tf.cast(tf.equal(y_t,y_p),tf.float32))
# 优化方法设计
train_op = keras.optimizers.sgd()
# 保存模型
savemodel = ModelCheckpoint(filepath='keras_model/model_dnn.h5')
# 模型组装和编译
model = Model(inputs=[input_tensor],outputs=[pred])
model.compile(loss=[loss_op],optimizer=train_op,metrics=[accuracy])
# 可视化
root_logdir = os.path.join(os.curdir, "keras_logs")
def get_run_logdir():
import time
run_id = time.strftime("run_%Y_%m_%d-%H_%M_%S")
return os.path.join(root_logdir, run_id)
run_logdir = get_run_logdir()
print(run_logdir)
tensorboard_cb = TensorBoard(run_logdir)
# 模型的训练
model.fit(X_train_scaler,y_train,epochs=5,validation_data=(X_test_scaler,y_test),callbacks=[savemodel,tensorboard_cb])
- 查看参数数量和结构
# 查看参数数量和结构
model.summary()
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_3 (InputLayer) (None, 784) 0
_________________________________________________________________
dense_6 (Dense) (None, 32) 25120
_________________________________________________________________
activation_4 (Activation) (None, 32) 0
_________________________________________________________________
dense_7 (Dense) (None, 16) 528
_________________________________________________________________
activation_5 (Activation) (None, 16) 0
_________________________________________________________________
dense_8 (Dense) (None, 10) 170
_________________________________________________________________
softmax_2 (Softmax) (None, 10) 0
=================================================================
Total params: 25,818
Trainable params: 25,818
Non-trainable params: 0
- 获取 layers 的名字
# 获取layer的名字
model.layers
[<tensorflow.python.keras.engine.input_layer.InputLayer at 0xb39e3b668>,
<tensorflow.python.keras.layers.core.Dense at 0xb39e3b860>,
<tensorflow.python.keras.layers.core.Activation at 0xb39e3b780>,
<tensorflow.python.keras.layers.core.Dense at 0xb39e3ba58>,
<tensorflow.python.keras.layers.core.Activation at 0xb39e3b7b8>,
<tensorflow.python.keras.layers.core.Dense at 0xb39e6a470>,
<tensorflow.python.keras.layers.advanced_activations.Softmax at 0xb39e3ba90>]
- 查看参数
# 查看参数
model.layers[1].get_weights()
[array([[ 0.04673344, 0.01502634, -0.07474566, ..., 0.06890095,
-0.04112365, -0.00896782],
[-0.00518269, -0.00286345, 0.08053879, ..., 0.07182655,
-0.01299394, -0.06554333],
[ 0.08002955, -0.03641549, 0.02303342, ..., 0.0393118 ,
0.05300613, -0.03454221],
...,
[-0.0828051 , 0.04777583, -0.02087372, ..., 0.07305664,
0.06184046, 0.04000294],
[ 0.01623803, -0.03462012, -0.0404018 , ..., 0.07255101,
0.01709375, 0.01892226],
[-0.07676131, -0.00633865, 0.07296253, ..., -0.00274478,
0.08141113, -0.00275608]], dtype=float32),
array([-0.13452972, 0.02142563, -0.02201729, 0.1591276 , -0.11847489,
0.12031773, -0.01768341, -0.01737609, 0.00054321, -0.1729853 ,
0.04432423, -0.01464177, 0.32178038, 0.25212777, 0.19860578,
0.1715567 , -0.10305091, -0.16290314, 0.02499877, 0.12938379,
0.24135025, -0.05990688, 0.0913938 , 0.20561 , 0.07127212,
0.00596112, -0.04965558, -0.01646159, 0.07282738, 0.02870943,
0.11165093, 0.10920808], dtype=float32)]
- 加载模型,进行预测
from tensorflow.python.keras.models import load_model
model = load_model('keras_model/model_dnn.h5')
index = 666
img = X_test_scaler[index].reshape(1,-1)
pred = model.predict(img)
print(class_names[np.argmax(pred)])
- 打印预测
from matplotlib import pyplot as plt
import numpy as np
%matplotlib inline
index = 666
img = X_test_scaler[index]
plt.imshow(img.reshape(28,28),cmap='gray')