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
# -*- 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
相关文章推荐
- android 检查网络连接状态实现步骤<一>
- android 检查网络连接状态实现步骤<三>
- tensorflow Examples:<4>实现RNN
- android 检查网络连接状态实现步骤<二>
- tensorflow Examples:<1>实现Nearest Neighbor
- tensorflow Examples:<2>实现卷积神经网络
- tensorflow Examples:<3>实现自编码
- iOS开发之网络编程--4、NSURLSessionDataTask实现文件下载(离线断点续传下载) <进度值显示优化>
- java学生管理系统界面简单实现<一>
- Android实战简易教程<四十九>(两种方式实现网络图片异步加载)
- <下拉框实现、一> - SAP ABAP 报表选择屏幕下拉框的实现
- Unity3D SpuerSocket 网络聊天室实现 <一>
- 模拟实现通讯录 <一><静态方法>
- 在cocos2d-x 3.2下利用UI下面的控件模仿实现GridView部分效果<一>实现构思
- XMPP协议实现原理介绍<一>
- 算法(第四版)笔记<一>-------动态队列的数组实现(Java语言)
- 循环队列及C语言实现<一>
- 使用GridView显示网络图片<一>
- 伸展树C++类实现<一>自低向上设计
- 神经网络之VGGNet模型的实现(Python+TensorFlow)