使用带隐藏层的神经网络拟合异或操作

一 介绍
多层神经网络非常好理解,就是在输入和输出中间多加些神经元,每一层可以加多个,也可加很多层。下面通过一个例子将异或数据进行分类。

二 实例描述
通过构建异或规律的数据集作为模拟样本,构建一个简单的多层神经网络来拟合其样本特征完成分类任务。
1 异或规则
当两个数相同时,输出为0,不相同时输出为1,这就是异或规则。表示为两类数据:
(0,0)和(1,1)为一类
(0,1)和(1,0)为一类
2 网络模型介绍
本例使用一个隐藏层来解决这个问题,下图是网络结构。
三 代码
import tensorflow as tf
import numpy as np
# 网络结构:2维输入 --> 2维隐藏层 --> 1维输出
learning_rate = 1e-4
n_input  = 2
n_label  = 1
n_hidden = 2
x = tf.placeholder(tf.float32, [None,n_input])
y = tf.placeholder(tf.float32, [None, n_label])
'''
定义学习参数
这里以字典方式定义权重w和b,里面h1代表隐藏层,h2代表输出层。
'''
weights = {
    'h1': tf.Variable(tf.truncated_normal([n_input, n_hidden], stddev=0.1)),
    'h2': tf.Variable(tf.random_normal([n_hidden, n_label], stddev=0.1))
    }
biases = {
    'h1': tf.Variable(tf.zeros([n_hidden])),
    'h2': tf.Variable(tf.zeros([n_label]))
    }    
'''
定义网络模型
该例模型正向结构入口为x,经过与第一层的w相乘再加上b,通过Relu函数进行激活转化,最终生成layer_1,再将layer_1代入第二层,使用Tanh激活函数生成最终的输出y_pred
'''
layer_1 = tf.nn.relu(tf.add(tf.matmul(x, weights['h1']), biases['h1']))
y_pred = tf.nn.tanh(tf.add(tf.matmul(layer_1, weights['h2']),biases['h2']))
#y_pred = tf.nn.relu(tf.add(tf.matmul(layer_1, weights['h2']),biases['h2']))#局部最优解
#y_pred = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, weights['h2']),biases['h2']))
#Leaky relus  40000次 ok
#layer2 =tf.add(tf.matmul(layer_1, weights['h2']),biases['h2'])
#y_pred = tf.maximum(layer2,0.01*layer2)
'''
模型的反向使用均值平方差(即对预测值与真实值的差取平均值)计算loss,最终使用AdamOptimizer进行优化
'''
loss=tf.reduce_mean((y_pred-y)**2)
train_step = tf.train.AdamOptimizer(learning_rate).minimize(loss)
#构建模拟数据,手动建立X和Y数据集,形成对应的异或关系。
#生成数据
X=[[0,0],[0,1],[1,0],[1,1]]
Y=[[0],[1],[1],[0]]
X=np.array(X).astype('float32')
Y=np.array(Y).astype('int16')
#加载
sess = tf.InteractiveSession()
sess.run(tf.global_variables_initializer())
#训练
for i in range(10000):
    sess.run(train_step,feed_dict={x:X,y:Y} )
     
#计算预测值
print(sess.run(y_pred,feed_dict={x:X}))
#输出:已训练100000次
       
#查看隐藏层的输出
print(sess.run(layer_1,feed_dict={x:X}))
四 运行结果
[[ 0.11088282]
[ 0.59579927]
[ 0.76093489]
[ 0.28163004]]
[[ 0.          0.        ]
[ 0.73359621  0.        ]
[ 0.          0.85488993]
[ 0.22713149  0.        ]]

五 说明
第一个是4行1列的数组,用四舍五入法来取值,与我们定义的输出Y完全吻合。
第二个是4行2列的数组,为隐藏层的输出。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值