您的位置:首页 > 理论基础 > 计算机网络

Tensorflow <一> 一层全连接网络实现XOR

2017-05-14 23:10 239 查看
注释已经很详细了

# -*- coding: utf-8 -*-
# @author: Zafedom
# @date: 17/5/14 下午9:17

'''
练习tf
使用一层的网络实现xor
这个代码很拼运气,不见得结果好

文档参考:https://yjango.gitbooks.io/superorganism/content/dai_ma_yan_shi.html
代码参考:https://github.com/YJango/tensorflow/blob/master/core_code.ipynb
'''

import tensorflow as tf
import numpy as np

if __name__ == '__main__':

#create net
# 网络结构:2维输入 --> 2维隐藏层 --> 1维输出
# 学习速率(learning rate):0.0001
D_input = 2 #输入维度
D_label = 1
D_hidden = 2
lr = 1e-4

#容器:用tf.placeholder创建输入值和真实值的容器,编程过程中始终是个空的,只有加载到sess中才会放入具体值。这种容器便是存放tensor的数据类型。
#容器的三个参数:
# 精度: 如果是用GPU训练,浮点精度要低于32bit,由第一个参数tf.float32定义。
# 矩阵形状: 输入输出的容器都是矩阵。为的是可以进行mini - batch一次算多个样本的平均梯度来训练。None意味着样本数可随意改变。
# 命名:控制tensorboard生成图中的名字,也会方便debug。
x = tf.placeholder(tf.float32, [None, D_input], name="x")
t = tf.placeholder(tf.float32, [None, D_label], name="t")

#隐藏层
# 变量:tensorflow中的变量tf.Variable是用于定义在训练过程中可以更新的值。权重W和偏移b正符合该特点。
# 初始化:合理的初始化会给网络一个比较好的训练起点,帮助逃脱局部极小值( or 鞍点)。详细请回顾梯度下降训练法。tf.truncated_normal([D_input, D_hidden], stddev=0.1)
# 是初始化的一种方法(还有很多种),其中[imcoing_dim, outputing_dim]
# 是矩阵的形状,前后参数的意义是进入该层的维度(节点个数)和输出该层的维度。stddev = 是用于初始化的标准差。
# 矩阵乘法:tf.matmul(x, W_h1)
# 用于计算矩阵乘法
# 激活函数:除了tf.nn.relu()
# 还有tf.nn.tanh(),tf.nn.sigmoid()
#这里的tf.truncated_normal( [D_input, D_hidden], stddev = 0.1 )在run的时候,返回形状为[D_input, D_hidden]的array, 因为是x*w+b ,所以形状是[D_input, D_hidden], 每一列表示第一个hidden的unit
W_h1 = tf.Variable(tf.truncated_normal([D_input, D_hidden], stddev=0.1), name="W_h")
b_h1 = tf.Variable(tf.constant(0.1, shape=[D_hidden]), name="b_h")
pre_act_h1 = tf.matmul(x, W_h1) + b_h1
# 计算a(Wx+b),激活用relu
act_h1 = tf.nn.relu(pre_act_h1, name='act_h')

W_o = tf.Variable(tf.truncated_normal([D_hidden, D_label], stddev=0.1), name="W_o")
b_o = tf.Variable(tf.constant(0.1, shape=[D_label]), name="b_o")
pre_act_o = tf.matmul(act_h1, W_o) + b_o
y = tf.nn.relu(pre_act_o, name='act_y')

#反向传播
# 损失函数:定义想要不断缩小的损失函数。

# loss = tf.reduce_mean( (y-t)**2 )
loss = tf.reduce_mean((y - t) ** 2)
# 更新方法:选择想要用于更新权重的训练方法和每次更新步伐(lr),除tf.train.AdamOptimizer外还有tf.train.RMSPropOptimizer等。默认推荐AdamOptimizer。
train_step = tf.train.AdamOptimizer(lr).minimize(loss)

#加载

X = [[0, 0], [0, 1], [1, 0], [1, 1]]
Y = [[0], [1], [1], [0]]
X = np.array(X).astype('int16')
Y = np.array(Y).astype('int16')

sess = tf.InteractiveSession()
tf.initialize_all_variables().run()

# 训练
for i in range(20000):
sess.run(train_step, feed_dict={
x: X,
t: Y
})

#计算预测值
print sess.run(y, feed_dict={
x: X
})

# 查看隐藏层的输出
print sess.run(act_h1, feed_dict={
x: X
})

__END__ = True
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: