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


注释已经很详细了


# -*- 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




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值