使用带隐含层的神经网络拟合异或操作*
实例描述:
通过构建符合异或规律的数据集作为模拟样本,构建一个简单的多层神经网络来拟合其样本特征完成分类任务。
1.数据集介绍
所谓的“异或数据”是来源于异或操作。
从a)可以看出,当两个数相同时,输出为0,不相同时输出为1,这就是异或的规则。表示为两类数据就是(0, 0)和(1, 1)为一类,(0, 1)和(1, 0)为一类。
2.网络模型介绍
3.完整代码
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])
#定义学习参数
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]))
}
#定义网络模型
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']))
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')
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for i in range(100000):
sess.run(train_step,feed_dict={x:X,y:Y})
print(sess.run(y_pred,feed_dict={x:X}))
print('隐藏层输出:')
print(sess.run(layer_1,feed_dict={x:X}))
结果:
第一个是4行1列的数组,用四舍五入法来取值,与我们定义的输出Y完全吻合。第二个为4行2列的数组,为隐藏层的输出。第二个输出是4行2列数组,其中第一列为隐藏层第一个节点的输出,第二列为隐藏层第二各节点的输出,四舍五入取整显示结果:
[[0. 0.]
[0. 1.]
[0. 1.]
[0. 1.]]