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

来源:互联网 发布:罗素名言 知乎 编辑:程序博客网 时间:2024/06/08 18:45


注释已经很详细了


# -*- 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 tfimport numpy as npif __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
原创粉丝点击