- 用的就是官方文档中文版入门,试验到mnist文件做softmax regression,坑有点多,记录下。
用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
(一般是这附近的一个数字,差不离)
它还列了一些资料网站,后续研究:
图像识别中各模型性能对比列表
交叉熵
反向传播算法