文档章节

使用多层神经网络进行分类实验

孟飞阳
 孟飞阳
发布于 2017/07/09 10:25
字数 869
阅读 6
收藏 0

已经学到这篇教程的第十章啦!教程的数学背景清晰、讲述深浅适宜,实在是居家必备: 
http://mooc.guokr.com/note/16274/

神经网络的非线性能力

在线性回归模型中,可以引入特征量的非线性映射来得到非线性的拟合效果。比如,使用线性模型可以拟合y=Ax2+Bx+C 中的参数 A,B,C,只要人为引入第二特征x2即可。 然而,当特征很多时,产生额外的高次项的个数为O(n2),往往超过计算能力。 此外,很多非线性的场景用多项式很难稳定拟合。为此,神经网络被提出来了。 
神经网络使用一个非线性的核函数来获得非线性能力。通过突触的权,使得特征在各层传递。

设计一个三类分类器

在下面的例子里,我们来设计2个圆形边界,把2维平面分为3个区域,0区域在两个圆外;1区域属于圆1,2区域属于圆2. 通过圆心与半径,控制两圆不重叠。

from __future__ import print_function
import tensorflow as tf
import numpy as np
n = 2      # 2 features
m = 20000  #  data  sets
K = 3      #3 output classes
#generate a circle region at center and size is R
center1 = np.random.rand(2).astype(np.float32)/4 + 0.5
center2 = -1 * np.random.rand(2).astype(np.float32)/4 - 0.5
r1 = np.random.rand(1).astype(np.float32) * 0.1 + 0.4
r2 = np.random.rand(1).astype(np.float32) * 0.1 + 0.4

print ("center1 = ",center1,",r1 = ", r1)            
print ("center2 = ",center2,",r2 = ", r2,"\n")            
print ("training...")
#--------------------------------------------------------------
#create graph
s1 = n
a1 = tf.placeholder(tf.float32,[None,s1]) 

s2 = 17
W1 = tf.Variable(tf.random_uniform([s1,s2],-1,1))
b1 = tf.Variable(tf.random_uniform([1],-1,1)) 
z1 = tf.matmul(a1,W1) + b1*tf.ones([1,s2])
a2 = tf.nn.sigmoid(z1)

s3 = 17
W2 = tf.Variable(tf.random_uniform([s2,s3],-1,1))
b2 = tf.Variable(tf.random_uniform([1],-1,1)) 
z2 = tf.matmul(a2,W2) + b2*tf.ones([1,s3])
a3 = tf.nn.sigmoid(z2)

s4 = 17
W3 = tf.Variable(tf.random_uniform([s3,s4],-1,1))
b3 = tf.Variable(tf.random_uniform([1],-1,1)) 
z3 = tf.matmul(a3,W3) + b3*tf.ones([1,s4])
a4 = tf.nn.sigmoid(z3)

s5 = 17
W4 = tf.Variable(tf.random_uniform([s4,s5],-1,1))
b4 = tf.Variable(tf.random_uniform([1],-1,1)) 
z4 = tf.matmul(a4,W4) + b4*tf.ones([1,s5])
a5 = tf.nn.sigmoid(z4)


##output
s6 = 3
W5 = tf.Variable(tf.random_uniform([s5,s6],-1,1))
b5 = tf.Variable(tf.random_uniform([1],-1,1)) 
z5 = tf.matmul(a5,W5) + b5*tf.ones([1,s6])
a6 = tf.nn.sigmoid(z5)
#--------------------------------------------------------------
y_ = tf.placeholder(tf.float32,[None,K])
loss = tf.reduce_mean(tf.square(a6-y_))
optimizer = tf.train.AdamOptimizer()
train = optimizer.minimize(loss)
init = tf.global_variables_initializer()
#--------------------------------------------------------------
### create tensorflow structure end ###
sess = tf.Session()
sess.run(init)          # Very important

#generate trainning data between (-1,1)
x_data = np.random.rand(m,n).astype(np.float32) * 2 - 1
#calc the y for each training sets
y_data = np.zeros([m,K]).astype(np.float32)
for idx in range(m):
    if (x_data[idx,0] - center1[0])**2 + (x_data[idx,1] - center1[1])**2 <= r1**2:
        y_data[idx,1] = 1
    elif (x_data[idx,0] - center2[0])**2 + (x_data[idx,1] - center2[1])**2 <= r2**2:
        y_data[idx,2] = 1
    else:
        y_data[idx,0] = 1


for step in range(10000):
    sess.run(train,feed_dict={a1:x_data,y_:y_data})
    if step % 1000 == 0:
        print(step, sess.run(loss,feed_dict={a1:x_data,y_:y_data}))
        #generate trainning data between (-1,1)
        x_data = np.random.rand(m,n).astype(np.float32) * 2 - 1
        #calc the y for each training sets
        y_data = np.zeros([m,K]).astype(np.float32)
        for idx in range(m):
            if (x_data[idx,0] - center1[0])**2 + (x_data[idx,1] - center1[1])**2 <= r1**2:
                y_data[idx,1] = 1
            elif (x_data[idx,0] - center2[0])**2 + (x_data[idx,1] - center2[1])**2 <= r2**2:
                y_data[idx,2] = 1
            else:
                y_data[idx,0] = 1

#--------------------------------------------------------------
print ("Testing...")
#testing
t = 10000
x_test = np.random.rand(t,n).astype(np.float32) * 2 - 1
#calc the y for each training sets
y_test = np.zeros([t,K]).astype(np.float32)
for idx in range(t):
    if (x_test[idx,0] - center1[0])**2 + (x_test[idx,1] - center1[1])**2 <= r1**2:
        y_test[idx,1] = 1
    elif (x_test[idx,0] - center2[0])**2 + (x_test[idx,1] - center2[1])**2 <= r2**2:
        y_test[idx,2] = 1
    else:
        y_test[idx,0] = 1
#classification
result = sess.run(a6,feed_dict={a1:x_test,y_:y_test})

good = 0
#check
for idx in range(t):
    col_u = np.where(result[idx,:]==np.amax(result[idx,:]))[0][0]
    if (y_test[idx,col_u]==1):
        good = good + 1

rates = good * 100.0 /t
print ("OK rates = ",rates,"%\n")

运行结果如下:

center1 =  [ 0.5108884   0.50474548] ,r1 =  [ 0.46310282]
center2 =  [-0.55810225 -0.70666814] ,r2 =  [ 0.48871851] 

training...
0 0.545082
1000 0.114368
2000 0.040274
3000 0.0257151
4000 0.0227888
5000 0.0210803
6000 0.0192277
7000 0.0148897
8000 0.00719382
9000 0.00347398
Testing...
OK rates =  99.74 %

 

本文转载自:http://blog.csdn.net/goldenhawking/article/details/74418479

共有 人打赏支持
孟飞阳
粉丝 204
博文 954
码字总数 540957
作品 5
朝阳
个人站长
深度森林第三弹:周志华组提出可做表征学习的多层梯度提升决策树

  选自arXiv   作者:冯霁、俞扬、周志华   机器之心编译      自去年周志华等研究者提出了「深度森林」以后,这种新型的层级表征方式吸引了很多研究者的关注。今日,南京大学的冯...

机器之心
06/04
0
0
机器学习之神经网络

背景: 1.1 以人脑中的神经网络为启发,历史上出现过很多不同版本 1.2 最著名的算法是1980年的 backpropagation 多层向前神经网络(Multilayer Feed-Forward Neural Network) 2.1 Backpropagat...

qq_37634812
2017/12/05
0
0
自然语言处理的6大法宝

人工神经网络是一种基于大脑神经结构的非线性运算模型。它仅通过参考样本便可学习完成诸如分类、预测、决定和可视化等任务。 人工神经网络由许多神经元处理单元广泛连接而成。这些处理单元分...

【方向】
2017/11/07
0
0
[译] 利用 Keras 深度学习库进行词性标注教程

原文地址:Part-of-Speech tagging tutorial with the Keras Deep Learning library 原文作者:Cdiscount Data Science 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m… 译者...

LeviDing
04/26
0
0
深度学习(三):Keras初探:多层感知机

之前使用Keras构建了简单的前馈神经网络,并通过SGD方式进行训练,很好地已完成红酒分类任务。现在我们通过复杂一些的任务来看看BP神经网络的性能。我们选择mnist手写数字库来进行测试,Ker...

monte3card
2017/06/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring Cloud Gateway真的有那么差吗?

前言 Spring Cloud从一开始最受大家质疑的就是网关性能,那是由于Spring Cloud最初选择了使用Netflix几年前开源的Zuul作为基础,而高性能版的Zuul 2在经过了多次跳票之后,对于Spring这样的整...

Java小铺
40分钟前
1
0
SpringBoot远程调试,远程debug你的线上项目

开发环境中代码出错了,可以利用IDE的debug功能来进行调试。那线上环境出错呢? 一、假设我们的项目是部署在tomcat中,那我们就需要对tomcat进行一定对配置,配置如下。 1. windows系统中,找...

nonnetta
45分钟前
0
0
JAVA秒杀优化方向

秒杀优化方向 将请求尽量拦截在系统上游:传统秒杀系统之所以挂,请求都压倒了后端数据层,数据读写锁冲突严重,几乎所有请求都超时,流量虽大,下单成功的有效流量甚小,我们可以通过限流、...

小贱是个程序员
53分钟前
0
0
C# 统计字符串中大写字母和小写字母的个数

static void Main() { int count1 = 0; int count2 = 0; Console.WriteLine("请输入字符串"); string str = Convert.ToString(Consol......

熊二的爸爸是谁
55分钟前
0
0
分布式服务框架之远程通讯技术及原理分析

在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等,这些名词之间到底是...

老道士
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部