全连接神经网络的二分类问题

引言

全连接神经网络在分类、回归预测问题上表现出极强的生命力。相比于传统的机器学习算法,神经网路的学习能力大大推动了人工智能往更智能更高效方向发展。人工神经网络(Artificial Neural Networks,简写为ANNs)也简称为神经网络(NNs)或称作连接模型(Connection Model),它是一种模仿动物神经网络行为特征,进行分布式并行信息处理的算法数学模型。这种网络依靠系统的复杂程度,通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的。全连接层神经网络作为深度学习的重要组成部分,是卷积神经网路,循环神经网络等等更高级的网络的基本结构之一,是深度学习入门的必备基础。下面我将用全连接神经网络来实现月牙形状的 2 分类数据集的分类问题及其可视化。

生成数据集

借助于 scikit-learn 库中提供的 make_moons 工具我们可以生成任意多数据的训练集。下面生成1000个点集。并划分为训练集和测试集。

from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import Sequential, layers
import matplotlib.pyplot as plt
X, y = make_moons(n_samples = 1000, noise=0.25, random_state=100)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)

plt.scatter(X[:,0], X[:, 1], c=y)
plt.show()

全连接神经网络的二分类问题_第1张图片

全连接神经网路

全连接神经网络的二分类问题_第2张图片

from tensorflow.keras import Sequential, layers
# 创建容器
model = Sequential()
创建各层网络以及神经元个数
model.add(layers.Dense(4, input_dim=2, activation='relu'))
model.add(layers.Dense(4, activation='relu'))
model.add(layers.Dense(4, activation='sigmoid')) # 创建最末层
model.summary()

#运行的结果
Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_19 (Dense)             (None, 4)                 12        
_________________________________________________________________
dense_20 (Dense)             (None, 4)                 20        
_________________________________________________________________
dense_21 (Dense)             (None, 4)                 20        
=================================================================
Total params: 52
Trainable params: 52
Non-trainable params: 0
_________________________________________________________________

网络的训练及其可视化

以这种方式创建神经网络来进行月牙形数据的二分类

import numpy as np
from matplotlib.colors import ListedColormap
for n in range(5):         # 构建 5 种不同层数的网络,网络层数分别为4,5,6,7,8
    model = Sequential()   # 创建容器
    model.add(layers.Dense(8, input_dim=2,activation='relu'))
    for _ in range(n+2): # 添加 n+2 层,每个网络共 n+4 层
        model.add(layers.Dense(32, activation='relu'))
    model.add(layers.Dense(1, activation='sigmoid')) # 输出为0,1之间的一个数,所以用sigmoid为激活函数。创建最末层
    
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # 模型装配与训练
    history = model.fit(X_train, y_train, epochs=50, verbose=1)                       #网络模型的训练,迭代1000的数据50遍
    # 绘制网络分类后的效果图
    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02), np.arange(y_min, y_max, 0.02))   #生成网格型二维数据对
    Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
    # 创建颜色图
    cmap_light = ListedColormap([(0,1,1), (1, 1,0)])
    cmap_bold = ListedColormap(['g', 'r'])
    #将预测的结果在平面坐标中画出其类别区域
    Z = Z.reshape(xx.shape)
    plt.figure(figsize=(16, 7))
    plt.subplot(1,2,1)
    plt.pcolormesh(xx, yy, Z, cmap=cmap_bold)
    # 也画出所有的训练集数据
    plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cmap_light)
    plt.subplot(1,2,2)
    plt.pcolormesh(xx, yy, Z, cmap=cmap_bold)
    plt.xlim(xx.min(), xx.max())
    plt.ylim(yy.min(), yy.max())
    title = "The number of network layers is {}".format(n+4)
    plt.title(title)
    plt.show()

训练的准确率大都在94%左右,可视化结果
全连接神经网络的二分类问题_第3张图片
全连接神经网络的二分类问题_第4张图片
全连接神经网络的二分类问题_第5张图片
全连接神经网络的二分类问题_第6张图片
全连接神经网络的二分类问题_第7张图片
一般网络层数越多,权重参数的数量越多,神经网络的表达能力越强,越容易出现过拟合现象(训练准确率高,而测试的准确率偏低)。从上面训练的结果来看,神经网路没有出现很明显的过拟合现象。如果出现过拟合现象,可以用Dropout层进行防止过拟合。

防止过拟合

以上面8层神经网络为例,网络结构为:其中将中间的三层Dense层变成Dropout层。一般这样可以减少神经网路过拟合的概率。

Model: "sequential_2"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_340 (Dense)            (None, 8)                 24        
_________________________________________________________________
dense_341 (Dense)            (None, 32)                288       
_________________________________________________________________
dropout_15 (Dropout)         (None, 32)                0         
_________________________________________________________________
dense_342 (Dense)            (None, 32)                1056      
_________________________________________________________________
dropout_16 (Dropout)         (None, 32)                0         
_________________________________________________________________
dense_343 (Dense)            (None, 32)                1056      
_________________________________________________________________
dropout_17 (Dropout)         (None, 32)                0         
_________________________________________________________________
dense_344 (Dense)            (None, 1)                 33        
=================================================================
Total params: 2,457
Trainable params: 2,457
Non-trainable params: 0
_________________________________________________________________

训练结果可视化
全连接神经网络的二分类问题_第8张图片
如果说过拟合现象为回归分类的曲线过于曲折回旋,则通过dropout层后回归曲线会变得比较平滑。当使用神经网络训练模型出现过拟合现象时,可以用Dropout层减少网络的参数,缓解过拟合问题。

你可能感兴趣的:(深度学习)