TensorFlow2.0(四)--Keras构建深度神经网络(DNN)

1. 深度神经网络简介

深度神经网络(Deep Neural Networks,DNN)可以理解为有很多隐藏层的神经网络,又被称为深度前馈网络(DFN),多层感知机(Multi-Layer perceptron,MLP),其具有多层的网络结构,如下图所示:
在这里插入图片描述
本篇博客的主要内容就是利用tf.keras来搭建一个具有20层隐藏层的网络结构,去实现一个简单的分类问题,分类的数据与TensorFlow2.0(二)–Keras构建神经网络分类模型中一样,代码也是绝大部分重合。

2. Kerase搭建DNN模型

2.1 导入相应的库
# matplotlib 用于绘图
import matplotlib as mpl
import matplotlib.pyplot as plt
%matplotlib inline
# 处理数据的库
import numpy as np
import sklearn
import pandas as pd
# 系统库
import os
import sys
import time
# TensorFlow的库
import tensorflow as tf
from tensorflow import keras
2.2 数据加载与归一化

数据集同样适用 fashion_mnist 数据集:

fashion_mnist = keras.datasets.fashion_mnist
(x_train_all, y_train_all),(x_test, y_test) = fashion_mnist.load_data()
x_valid, x_train = x_train_all[:10000], x_train_all[10000:]
y_valid, y_train = y_train_all[:10000], y_train_all[10000:]

利用sklearn.preprocessing 中的 StrandardScaler 进行数据集的归一化:

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
# x_train: [None, 28, 28] -> [None, 784]
x_train_scaled = scaler.fit_transform(
    x_train.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28)
x_valid_scaled = scaler.transform(
    x_valid.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28)
x_test_scaled = scaler.transform(
    x_test.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28)
2.3 网络模型的构建

我们使用keras.models.Sequential()方法来构建模型:

model = keras.models.Sequential()
# flatten层的作用是将28*28维度的输入数据展平成一层
model.add(keras.layers.Flatten(input_shape = [28, 28])) 
"""
对于多层神经网络结构,我们可以利用for循环来添加
"""
for _ in range(20):
    model.add(keras.layers.Dense(100, activation = "relu")) 
# 输出为 10的全连接层
model.add(keras.layers.Dense(10, activation = "softmax")) 
2.4 批归一化,dropout以及selu激活函数

在多层的神经网络中,我们通常使用批归一化和dropout来进行模型的加速与优化:

model = keras.models.Sequential()
model.add(keras.layers.Flatten(input_shape = [28, 28])) # flatten层的作用是将28*28维度的输入数据展平成一层
"""
我们在每一层的输出后面加上了归一化操作,这称为批归一化
批归一化可以使网络的效果变得更好,训练速度会更快
归一化有两种方式:
- Min-Max归一化: x *= (x-min)/(max-min)
- Z-score归一化: x *= (x-u)/σ
"""
for _ in range(20):
    model.add(keras.layers.Dense(100, activation = "relu")) # 输出为100的全连接层
    model.add(keras.layers.BatchNormalization())
"""
如果要先归一化 再激活可以这么写
model.add(keras.layers.Dense(100))
model.add(keras.layers.BatchNormalization())
model.add(keras.layers.Activation('relu'))
"""

"""
Dropout:
dropout的作用就是防止网络的过拟合
这里我们使用AlphaDropout, AlphaDropout和dropout的区别是:
1.均值和方差不变 
2.归一化性质不变
"""
model.add(keras.layers.AlphaDropout(rate=0.5)) 
model.add(keras.layers.Dense(10, activation = "softmax")) # 输出为 10的全连接层

对于批归一化,我们也可以使用“selu”激活函数来代替“relu”激活函数,因为"selu" 激活函数自带归一化, 所以使用"selu"的网络结构为:

model = keras.models.Sequential()
model.add(keras.layers.Flatten(input_shape = [28, 28])) # flatten层的作用是将28*28维度的输入数据展平成一层
for _ in range(20):
	# selu是自带归一化的激活函数
    model.add(keras.layers.Dense(100, activation = "selu")) 
model.add(keras.layers.Dense(10, activation = "softmax")) # 输出为 10的全连接层
2.5 模型编译与训练

这段代码与TensorFlow2.0(二)–Keras构建神经网络分类模型中的一样,不带赘述。

model.compile(loss = "sparse_categorical_crossentropy",  # 稀疏分类交叉熵损失函数
             optimizer = keras.optimizers.SGD(0.01),    # 优化函数为随机梯度下降 ,学习率为0.01
             metrics = ["accuracy"])                     # 优化指标为准确度
history = model.fit(x_train_scaled, y_train,             # 训练数据
                   epochs = 10,                           # 训练周期,数据分为10次进行训练
                   validation_data = (x_valid_scaled, y_valid),) # 验证集
2.6 模型验证

对于训练好的模型,我们可以使用model.evaluate()进行在验证集上的验证:

model.evaluate(x_test_scaled, y_test)

验证结果为:
在这里插入图片描述
loss为0.374, 准确度为87.67%

发布了175 篇原创文章 · 获赞 237 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_42580947/article/details/105301423