tensorflow学习笔记(1)

import tensorflow as tf

TensorFlow使用图来表示计算任务。

  • 图中的节点叫op, 一个op获得0个或者多个tensor, 执行计算, 产生0个或者多个tensor.
  • 图只是描述了计算过程, 为了执行这些计算, 图必须在session中被启动。
  • python中, 计算返回的tensor是numpy ndarray对象
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
Extracting MNIST_data/train-images-idx3-ubyte.gz
Extracting MNIST_data/train-labels-idx1-ubyte.gz
Extracting MNIST_data/t10k-images-idx3-ubyte.gz
Extracting MNIST_data/t10k-labels-idx1-ubyte.gz

用softmax实现回归模型

# X是一个占位符,因为在tensorflow 的网络里, 是先建好图,再进行运算
# 相当于先搭建好工地再建设。 所以, 我们不知道有多少幅图输入,但知道每个图片的大小
# [None, 784] 意味着我们可以输入任意数量的784维大小的图片向量
# 导入数据
X=tf.placeholder(tf.float32, [None, 784])

# 设置权重和偏置
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
# 用softmax模型来实现算法
# softmax有点类似于统计物理中的配分函数, 图片像素值经Wx+b网络后得到一个值(evidence)
# softmax是evidence求指数后的归一化值,相当与对各个可能值的概率分布

a = tf.nn.softmax(tf.matmul(X,W)+b)

用交叉熵训练模型

$H = -\Sigma_{i}(y_i\log a_i+(1-y_i)\log(1-a_i))$

  • 其中为正确值,a为我们预测到的值
  • 交叉熵的预测值与真实信息的偏差的度量
# 十个数字,即有十种可能类别
y = tf.placeholder(tf.float32, [None, 10])

# 计算交叉熵 (cross entropy)
cross_entropy = -tf.reduce_sum(y*tf.log(a))
# 运用梯度下降算法来最小化交叉熵
# 学习速率: 0.01
# 相当于往图中添加一个新操作,包括计算梯度,用反向传播算法计算每一个参数的变化,并计算出新的参数值
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

# 在一个Session中启动我们的模型
s = tf.InteractiveSession()

# 初始化我们创建的变量
init = tf.initialize_all_variables().run()
    
# 训练1000次
for _ in range(1000):
    # 通过梯度下降算法更新W和b时,由于样本的巨大,每次计算整个样本是很费时费力的
    # 替代办法是,每次随机选取一个batch的数据子集,将训练它们得到的反向传播梯度更新值作为代表
    # 对整个数据的权重和偏置矩阵进行更新
    # 每次迭代, 会加载并训练100个样本
    batch_Xs, batch_ys = mnist.train.next_batch(100)
    result = s.run(train_step, feed_dict={X: batch_Xs, y: batch_ys})

评估模型

通过softmax模型,我们最后的输出代表了输入数据对10个不同取值结果的概率分布, 我们返回最大的一个作为我们的预测结果。
tf.argmax函数可用来返回tensor对象在某一维数据的最大值索引。 最大值所在索引位置即为其类别标签。

# 返回一个布尔型tensor
correct_prediction = tf.equal(tf.argmax(a, 1), tf.argmax(y, 1))

# 将布尔型转化为float32型,并统计平均
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

print accuracy.eval(feed_dict={X: mnist.test.images, y: mnist.test.labels})
0.8852

优化模型

1. 权重初始化

在我们之前的模型中, 权重被初始化为全0。 为了打破对称性(why?)以及避免0梯度,在权重初始化时加入少量噪音项。因为在计算XW+b时,如果W全为0,会使得节点输出为0, 并在一级一级的传递的过程中恒为0, 成为dead neurons.在这里,我们加入一个高斯白噪声。

def weight_variable(shape):
    initial = tf.truncated_normal(shape, stddev = 0.1)
    return tf.Variable(initial)

def bias_variable(shape):
    initial = tf.constant(0.1, shape=shape)
    return tf.Variable(initial)

2. 卷积与池化


这点暂时还不是很懂, 等后面弄懂了再来补充~~

参考资料

[tensorflow 官方资料]https://www.tensorflow.org/versions/r0.11/tutorials/mnist/beginners/index.html#mnist-for-ml-beginners


你可能感兴趣的:(tensorflow学习笔记(1))