今天CNN的理解写了一半,感觉理解的不够深刻,就打算先实现几个例子再接着看理论。之后就了解了一下TensorFlow。
python版的tensorflow就是一个工具包,使用pip安装就行了。有CPU和GPU两个版本,刚开始用,安装CPU版本的试一试。谷歌给了几个tensorflow的安装方式,无非就是使用虚拟环境或者装在Docker中,也可以使用Anaconda安装,安装过程不再赘述,具体可以参考Install TensorFlow。
值得一提的是Windows版本的TensorFlow不支持python2,只支持python3.5。以前一直用python2,而且我用的环境比较gaoxiao,我是用的win10的linux子系统+windows上的VScode。代码编写使用的是windows上的环境,运行用的是linux子系统上的环境。所以如果让VScode可以对TensorFlow库中的代码进行提示的话,需要在windows的python环境中也安装tensorflow。没办法就全换了Python3,更换linux子系统中默认的python版本时不知道为啥pip和pip3都歇菜了,可能是因为版本不对吧,捣鼓了半天。
安装完找了几个样例跑了一下。第一个就是Hello world。
第二个是基本操作,就是熟悉一下TensorFlow工具使用的套路,然后就是搜一搜代码里面出现的一些函数的用法。
第三个就是一个经典的使用MNIST数据的例子。模型搭建用的是线性回归。
中间参考了一篇博客,以及TensorFlow文档中使用MNIST数据训练回归模型的讲解。
模型的大概形状如下图:
MNIST数据集的具体参数就看官方文档中的MNIST数据训练回归模型的讲解吧。
MNIST数据集如果不能自动下载,就从http://yann.lecun.com/exdb/mnist/下载,一共四个文件,下载完不用解压,改改代码中的数据路径,或者放到代码中的路径中就行了。
下面是我做的练习,每段代码的意思都加到注释里了,里面如果有不懂的函数就搜一下,不再一个一个说了。
# coding:utf-8
# 参考 "https://blog.csdn.net/u013569304/article/details/81175006"
# "http://wiki.jikexueyuan.com/project/tensorflow-zh/tutorials/mnist_beginners.html"
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
import numpy as np
# 数据集位置,如果该位置没有数据会自动下载,不过可能因为网络问题无法下载。
# 可以从http://yann.lecun.com/exdb/mnist/下载,一共四个文件,下载完不用解压。
__file = 'MNIST_data/'
__mnist = input_data.read_data_sets(__file, one_hot=True)
# 训练数据的格式,行数为None,表示不固定;
# 列数为784,是MNIST数据集输入数维度,输入集是28*28的点阵,展开后就是一个784维的向量
# 输出集是十个不同的类别(0-9),使用one_hot类型的输出集
__input_x = tf.placeholder(tf.float32, [None, 784])
__train_y_true = tf.placeholder(tf.float32, [None, 10])
# 模型的权重和偏移量
# 变量__W和__b是线性模型的参数
# __W是一个784∗10的矩阵,因为输入有784个特征,同时有10个输出值。
# __b是一个10维的向量,是因为输出有10个分类。
__W = tf.Variable(tf.zeros([784, 10]))
__b = tf.Variable(tf.zeros([10]))
# 创建Session
__session = tf.InteractiveSession()
# 初始化权重变量
__session.run(tf.global_variables_initializer())
# 构建回归模型(0-9的概率)
__output_y = tf.nn.softmax(tf.matmul(__input_x, __W) + __b)
# 使用交叉熵作为损失函数
__cross_entropy = tf.reduce_mean(
-tf.reduce_sum(__train_y_true*tf.log(__output_y)))
# region 训练
# 使用梯度下降法优化模型,学习率为0.01。
# 训练周期为1000,每个训练周期使用60个样本
__train_op = tf.train.GradientDescentOptimizer(
0.01).minimize(__cross_entropy)
for i in range(10):
__batch = __mnist.train.next_batch(60)
__session.run(
__train_op, feed_dict={__input_x: __batch[0], __train_y_true: __batch[1]})
tmp=__session.run(
__output_y, feed_dict={__input_x: __batch[0], __train_y_true: __batch[1]})
for tt in tmp:
for pp in tt:
print("%.2f, " % pp,end="")
print()
# endregion
# region 测试
# 从测试集取200个样本测试
__test_x, __test_y_true = __mnist.test.next_batch(200)
# 使用训练好的模型预测测试集结果(得到一个list)
__perdict_num_list = __session.run(
tf.argmax(__output_y, 1), feed_dict={__input_x: __test_x})
__accuracy = 0
for i in range(len(__test_x)):
__test_y_true_i = np.argmax(__test_y_true[i])
# session.run(tf.argmax(__test_y[i],1)) ????
print("Test", i, ",[ Perdiction Value:", __perdict_num_list[i],
" True Value:", __test_y_true_i, "]", end="")
if __perdict_num_list[i] == __test_y_true_i:
print(', Answer: pass')
__accuracy += 1./len(__test_x)
else:
print(', Answer: fail')
print("Accuracy:", __accuracy)
# endregion
__session.close()