TensorFlow的softmax regression做mnist例子

  • 用的就是官方文档中文版入门,试验到mnist文件做softmax regression,坑有点多,记录下。

mnist官网下载
mnist由theano处理过的包下载

用theano那个包测试下,第0张图片输出结果标签应该是5,图片是个5。

import pickle #教程中是cPickle包,python3中改名为pickle
import gzip

import numpy
from PIL import Image # 教程中是import Image,会报错找不到Image,装了Pillow需要from PIL import Image

f = gzip.open('.../mnist.pkl.gz', 'rb')
train_set, valid_set, test_set = pickle.load(f, encoding='bytes') #教程中是.load(f),会报错 'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128)",encoding修改下就好,latins也试过可行。
f.close()

print ("The 0'th label:", train_set[1][0])
lst = numpy.asarray(train_set[0][0], dtype=numpy.float32)
img = Image.frombytes(mode='F', size=(28, 28), data=lst*255)
img.show()

输出:

The 0’th label: 5


然后用TensorFlow来做,官方提供的是代码下载数据包,但是一是要翻墙,二是翻了墙也很容易下载中出问题断掉,所以建议是自己在mnist数据集官网下载好4个包,放在工作路径下的MNIST_data文件夹里,然后再用

import tensorflow.examples.tutorials.mnist.input_data
mnist=tensorflow.examples.tutorials.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

就是加载进去了。

import numpy as np
import tensorflow as tf
x = tf.placeholder(tf.float32, [None, 784])
#.placeholder是做一个占位符,数字格式float32,[None,784]表示输入二维数组,n行784列,n任意。这里是把单张图展平成了784维的向量。
#参数使用Variable,可在计算中修改;
W = tf.Variable(tf.zeros([784,10]))#权重weight,初始化0矩阵;形状为784行10列是因为我们希望x*w后对每个x,得到10列数值,以表征0~9数字的概率大小;
b = tf.Variable(tf.zeros([10]))#偏置量bias,初始化0矩阵;形状为10列是直接加到输出上的。
y = tf.nn.softmax(tf.matmul(x,W) + b)#w和x的点积+b,即主模型(softmax算法)
#定义指标来训练模型,用交叉熵;
y_ = tf.placeholder("float", [None,10])# "float"是64位,上面的tf.float32是32位的,数位不同。
cross_entropy = -tf.reduce_sum(y_*tf.log(y))#.reduce_sum()是求和,可以选维度求和。交叉熵公式 sigma(y_*log(y))
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)#梯度下降法;

init = tf.global_variables_initializer()#初始化变量;
sess = tf.Session()
sess.run(init)

for i in range(1000):#循环1000次;
    batch_xs, batch_ys = mnist.train.next_batch(100) #每次取100个数来训练,随机梯度下降训练;
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
print (sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

输出一个正确率:

0.9178
(一般是这附近的一个数字,差不离)

它还列了一些资料网站,后续研究:
图像识别中各模型性能对比列表
交叉熵
反向传播算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值