简单线性模型进行手写数字识别

这里包含了机器学习的基本过程,代码作为示例:通俗易懂的注释

# 首先加载数据
# 这里使用了来自Google的一个脚本, 百度能搜到
import input_data
import tensorflow as tf

mnist = input_data.read_data_sets('MNIST_data', one_hot=True)

# 使用交互式的 会话 启动一个图, 这样就可以在运行过程中加入一些计算图了
sess = tf.InteractiveSession()
print(sess)

# 输入占位符
x = tf.placeholder("float", shape=[None, 784])  # 第一维表示样本数量,也就是一次有多少个图片
y_ = tf.placeholder("float", shape=[None, 10])  # 这里加上shape 主要是防止在输入数据的时候出现维度不一致的情况,如果出现,就能及时发觉

# 变量,表示的是计算图中的值,通常是用来表示参数,在训练过程中可以被改变

# 定义变量
W = tf.Variable(tf.zeros([784, 10])) 
b = tf.Variable(tf.zeros([10]))
# 这里设置为第一维为784个维度,第二位为10,主要是为了给每个图片的一个像素点一个权重,
# 通过和像素点进行运算 优化,得到合适的权重,第二维是10 是对这10个分类的图片分别学习到合适权重,
# 推理的时候通过计算,得到10个不同的结果,表示的是根据权重计算的值,得到概率最大的就是表示当前数据和当前类别吻合
# 总的来说为每个分类的图片学习一个权重集合,因为有784 个点,所以第一维是784 ,10个分类表示的第二维的维数

# 变量初始化
sess.run(tf.initialize_all_variables())

# 定义模型,很简单
y = tf.nn.softmax(tf.matmul(x, W) + b)

# 定义损失,用来衡量模型的好坏
loss = -tf.reduce_sum(y_ * tf.log(y))  # 计算一个batch 的交叉熵, 所以用reduce sum ,也就是n个图片的

# 定义优化器
optim = tf.train.GradientDescentOptimizer(learning_rate=0.01)
# 使用梯度下降优化器,起始学习速率0.01 也就是下降速率,这优化器会自己进行调整

# 定义训练操作,这里的训练操作就是使得差值熵最小化,也就是损失最小化,这样一步一步就能训练出合适模型了。
train_step = optim.minimize(loss)

# 接下来就是通用的训练步骤了,这里添加了不断的获取数据,并喂入训练的操作
for i in range(1000):
    batch = mnist.train.next_batch(50)
    train_step.run(feed_dict={x: batch[0], y_: batch[1]})
    # 优化器也可以run 
# 注意,在计算图中,你可以用feed_dict来替代任何张量,并不仅限于替换占位符。

# 评估
# 精确度评估
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1)) # 这是对一个batch 中的正确与否进行计算,返回的是一个布尔数组

# 转换为数值
acc = tf.reduce_mean(tf.cast(correct_prediction, "float"))

# 下面把数据填充进去,并且进行精度评估
print(acc.eval(feed_dict={x: mnist.test.images, y_:mnist.test.labels}))
# 0.9104 还不错,接下来是卷积模型

猜你喜欢

转载自blog.csdn.net/hpulfc/article/details/81020830
今日推荐