DL之DNN:基于神经网络(从1层~50层)DNN算法实现对非线性数据集点进行绘制决策边界

DL之DNN:基于神经网络(从1层~50层)DNN算法实现对非线性数据集点进行绘制决策边界

 

 

目录

输出结果

设计代码


 

 

输出结果

 

 

设计代码

 

首先查看数据集

import numpy as np
from sklearn.datasets import make_moons  #make_moons数据集可以生成一些非线性数据点
import matplotlib.pyplot as plt

# 手动生成一个随机的平面点分布,并画出来
np.random.seed(0)
X, y = make_moons(200, noise=0.20)
plt.scatter(X[:,0], X[:,1], s=40, c=y, cmap=plt.cm.Spectral)
plt.title('make_moons generating nonlinear data points')
plt.show()

#设计一个简单的人工神经网络:输入两个值,输出0或1,即第一类还是第二类,但DNN其实获得是概率,如属于0的概率是42% 。只包含一层隐藏层,即只对样本点做交集而不做并集
#激活函数选择tanh函数,采用softmax分类器(LR的多分类),并且用互熵损失作为损失函数。BP计算梯度采用SGD算法

num_examples = len(X) # 样本数
nn_input_dim = 2      # 输入的维度
nn_output_dim = 2     # 输出的类别个数
 
# 梯度下降参数
epsilon = 0.01     # 学习率
reg_lambda = 0.01  # 正则化参数

# 定义损失函数,以便使用梯度下降算法
def calculate_loss(model):
    W1, b1, W2, b2 = model['W1'], model['b1'], model['W2'], model['b2'] #因为隐藏层有500个神经元,故b1是500维
    # 向前推进,前向运算
    z1 = X.dot(W1) + b1
    a1 = np.tanh(z1)
    z2 = a1.dot(W2) + b2
    exp_scores = np.exp(z2)
    probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True) #计算的属于哪一类的是概率
    # 计算损失
    corect_logprobs = -np.log(probs[range(num_examples), y])
    data_loss = np.sum(corect_logprobs)
    # 也得加一下L2正则化项
    data_loss += reg_lambda/2 * (np.sum(np.square(W1)) + np.sum(np.square(W2)))
    return 1./num_examples * data_loss


# 建立3个隐层的神经网络
model = build_model(3, print_loss=True)
 
# 然后再把决策/判定边界画出来
plot_decision_boundary(lambda x: predict(model, x))
plt.title("Decision Boundary for hidden layer size 3")  #即是由500个神经元(段直线),去交集得出的曲线
plt.show()


 

# 然后观察不同的隐藏层个数(1, 2, 3, 4, 5, 20, 50)对结果的影响
plt.figure(figsize=(16, 32))
hidden_layer_dimensions = [1, 2, 3, 4, 5, 20, 50]
for i, nn_hdim in enumerate(hidden_layer_dimensions):
    plt.subplot(5, 2, i+1)
    plt.title('Hidden Layer size %d' % nn_hdim)
    model = build_model(nn_hdim)
    plot_decision_boundary(lambda x: predict(model, x))
plt.show()

 

 

相关文章推荐

DL之LoR&DNN:Neural_network_example绘制非线性数据集点的决策边界

本论文从深度神经网络的模型结构出发,展开了较为系统和深入的研究,一方面对现有的模型进行优化,另一方面结合语音及语言信号的特性探究新的网络结构模型,从而提高基于深度神经网络的语音识别系统的性能和训练效率。首先,本文研究了基于前馈全连接深度神经网络(Deep Neural Networks,DNN)的语音声学建模。我们分别探索了基于sigmoid非线性激活函数的DNN(sigmoid-DNN)和基于整流线性单元(Rectified Linear Units,ReLU)的 DNN(RL-DNN)的大词汇量连续语音识别。首先针对传统的sigmoid-DNN,我们通过研究发现其隐权重越往高稀疏性越强的特性,提出了一种隐递减的DNN结构,命名为sDNN。实验结果表明sDNN可以在保持性能基本不变的情况下将模型参数量减少到45%,从而获得2倍的训练加速。进一步地我们提出将dropout预训练作为一种神经网络的初始化方法,可以获得相比于传统的无监督Pre-training更好的性能。然后我们针对RL-DNN的研究发现,通过合理的参数配置,可以采用基于大批量的随机梯度下降算法来训练RL-DNN,从而能够利用多个图形处理单元(Graphic Processing Unit,GPU)进行并行化训练,可以获得超过10倍的训练加速。进一步地我们提出了一种绑定标量规整的方法用于优化RL-DNN的训练,不仅使得训练更加稳定,而且能够获得显著的性能提升。其次,本文提出一种固定长度依次遗忘编码(Fixed-size Ordinally Forgetting Encoding,FOFE)方法用于语言模型建模。FOFE通过简单的顺序遗忘机制来对序列中的单词位置进行建模,可以将任何可变长度的单词序列唯一地编码成固定大小的表达。本研究中,我们提出基于FOFE的前馈神经网络语言模型(FOFE-FNNLM)。实验结果表明,在不使用任何反馈连接的情况下,基于FOFE的FNNLM显著的优于标准的基于1-of-k编码作为输入的FNNLM,同时也优于基于循环神经网络(Recurrent Neural Networks,RNN)的语言模型。再次,本文提出了一种新颖的神经网络结构,命名为前馈序列记忆神经网络(Feedforward Sequential Memory Networks,FSMN)。FSMN 可以对时序信号中的长时相关性(long-term dependency)进行建模而不需要使用反馈连接。本研究所提出来的FSMN可以认为是在标准的前馈全连接神经网络的隐藏中配备了一些可学习的记忆模块。这些记忆模块使用抽头延迟线结构将长时上下文信息编码成固定大小的表达作为一种短时记忆机制。我们在语音识别声学建模以及语言模型建模任务上验证了所提出的FSMN模型。实验结果表明,FSMN不仅可以取得相比于当前最流行的循环神经网络更好的性能,而且训练更加高效。在此基础上,我们探索了 FSMN模型的改进,通过结合低秩矩阵分解的思路以及修改记忆模块的编码方式提出了一种结构简化的FSMN,命名为cFSMN。同时通过在cFSMN的记忆模块之间添加跳转连接,避免深网络训练过程梯度消失的问题,实现了非常深的cFSMN的训练。我们在Switchboard数据库以及Fisher数据库进行的声学建模实验验证了所提出的模型的性能。Fisher数据库的实验结果表明基于深的cFSMN的识别系统相比于主流的基于BLSTM的识别系统可以获得13.8%的相对词错误率下降。最后,本文提出一种用于高维数据建模的新模型,称之为联合优化正交投影和估计(Hybrid Orthogonal Projection and Estimation,HOPE)模型。HOPE 将线性正交投影和混合模型融合为一个生成模型。HOpe模型本身可以从无标注的数据中通过无监督最大似然估计方法进行无监督学习,同时也可以采用带标注的数据进行有监督学习。更为有趣的是,我们的研究阐述了 HOPE模型和神经网络之间的密切关系。HOPE可以作为一个新的工具用于探究深度学习的黑盒子,以及用于有监督和无监督深度神经网络的训练。我们在语音识别TIM1T数据库以及图像分类MNIST数据库验证了基于HOPE模型的无监督、半监督以及有监督学习。实验结果表明,基于HOPE框架训练的神经网络相比于现有的神经网络在无监督、半监督以及有监督学习任务上都获得显著的性能提升。 知网论文,学习使用
Pima数据集是一个二分类问题,共有8个输入特征和1个二元输出标签。在使用DNN对Pima数据集进行训练时,可以根据经验法则和实验结果来选择神经网络数和神经元数量。 一般来说,对于这种中等大小的数据集,可以使用2~3神经网络结构,其中每的神经元数量可以在50~200之间进行选择。具体的选择可以根据实验结果来进行调整,以达到最优的性能。 以下是一个简单的代码示例,使用Keras来实现DNN对Pima数据集进行训练: ```python import numpy as np from keras.models import Sequential from keras.layers import Dense from sklearn.datasets import load_digits from sklearn.preprocessing import LabelBinarizer from sklearn.model_selection import train_test_split # 加载数据集 digits = load_digits() X = digits.data y = LabelBinarizer().fit_transform(digits.target) # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) # 构建模型 model = Sequential() model.add(Dense(100, input_dim=64, activation='relu')) model.add(Dense(50, activation='relu')) model.add(Dense(10, activation='softmax')) # 编译模型 model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) # 训练模型 model.fit(X_train, y_train, epochs=100, batch_size=32, validation_data=(X_test, y_test)) ``` 在上面的代码中,我们使用了两个隐藏,分别包含100和50个神经元。可以通过调整这两个隐藏的神经元数量来进行实验,以找到最优的超参数组合。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个处女座的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值