TensorFlow MNIST进阶

之前MNIST 入门教程的时候,将28*28的图片直接拉伸成784维的向量有些不妥

因为图片是个二维数据,因此我们上一个MNIST入门的算法准确度只有91%

这里我们采用对图像进行卷积和池化等操作,将图片特征提取成1024 维度的图片立体数据

注:这里784维度进行卷积池化2次,第一次特征值转为32组,第二次转为64组,所以这里才是1024维度的图片数据。

TensorFlow MNIST数据集的使用

教程地址:http://www.tensorfly.cn/tfdoc/tutorials/mnist_download.html

首先需要下载input_data.py文件(其实这个input_data文件在TensorFlow中也存在)

将文件放到你的python项目目录下

再使用 以下代码 完成数据集下载:

1
2
import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

关于MNIST数据集的介绍:

MNIST 是一组数据集,其中包括12W个手写数字的图片和正确答案(6W训练图片和答案,6W评估图片和答案)。

其图片格式和答案格式如下:

TensorFlow MNIST入门

经过整合的一段TensorFlow训练数据并测试的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import input_data
import tensorflow as tf
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
//-----------------------------以上代码主要是为了导入mnist数据-----
x = tf.placeholder("float", [None, 784])
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
y = tf.nn.softmax(tf.matmul(x,W) + b)
y_ = tf.placeholder("float", [None,10])
//---------------------------定义各个数据的关系,以及数据的张量模型-----
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
//----------------这里我们用交叉熵算法计算来预定于交叉熵变量的值--
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
//-------------梯度下降算法------最小化交叉熵----
init = tf.initialize_all_variables()
//----------初始化所有变量----------------
sess = tf.Session()
sess.run(init)
//----------创建图----启动图-----
for i in range(1000):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
//---------------训练数据----将 100条mnist的数据读取之后 放到 batch_xs, batch_ys
//--------------- 传递给参数 x 和 参数 y -----------
//我们在上面预定义了X 张量为一个 784 — ∞ 维度的张量,代表着输入,
我们可以输入无数张图片,每张图片784个像素点
// 我们定义了一个特征值 W 张量,是一个 78410 维度的张量

TensorBoard 用法简单解析

介绍

TensorBoard是谷歌开发的一个用于实时监控Tensorflow运行状态的一款工具,它能够实时监控Tensoflow 运行过程中的计算图、各种指标随时间变化的趋势以及我们想要让他显示的各项数据。

简单的例子

在学习卷积过程中,我虽然明白了卷积的过程是为了泛化图像信息,但总是想把卷积操作后的图像显示出来,看看卷积之后得到的数据和原始图像之间是否有一些这样那样的关系。

于是乎,当我接触到TensorBorad的时候就开始研究如何显示图像,以下是一段利用TensorFlow 生成图像日志信息,采用TensorBoard显示的一段代码:

scikit-learn-常用库函数解析

scikit-learn 介绍

由于TensorFlow当前还没有集成易于生成人工数据集的方法,因此,我们可以使用scikit-learn 库来帮助我们生成人工数据集。

sklearn.datasets 模块生成数据集

sklearn.datasets.make_blobs()

地址:http://sklearn.apachecn.org/cn/0.19.0/modules/generated/sklearn.datasets.make_blobs.html#sklearn.datasets.make_blobs

简单说明: 该函数生成块状数据集,较适合训练聚类算法。

生成数据集分布类似于下图:

参数:

n_samples : int, #可选项,默认值100 # 生成样本总数量

n_features : int #可选项,默认值2#生成样本的特征(维度)

centers : int #可选项, 默认值 3 #类型表示质心数量, array 表示提供质心,如: [n_centers, n_features],

cluster_std : float or sequence of floats #可选项,默认值 1.0#标准偏差

center_box : pair of floats (min, max), 可选项 default=(-10.0, 10.0)#波动区间

shuffle : boolean, #可选项,默认True #是否将群圈起来

random_state : int, RandomState instance or None, optional (default=None)

Returns:
X : array of shape [n_samples, n_features]#生成的数据

y : array of shape [n_samples] #生成数据所属的群

使用案例

sklearn.datasets.make_blobs(n_samples=100, n_features=2, centers=3, cluster_std=1.0, center_box=(-10.0, 10.0), shuffle=True, random_state=None)

聚类与K最近邻

聚类的概念

对于没有分类的数据,首先要做的就是寻找具有相同特征的数据,将他们分配到相同的组。

为此,数据集可以分成任意数量的端,其中每个段都可以用它的成员的质量中心(质点)来表示。

为了将不同的成员分配到相同的组中,需要定义一下怎样表示不同元素之间的距离。在定义距离之后,可以说相对于其他质心,每个类成员都更靠近自己所在类的质心。

K均值

K均值(K-means)是一种常见的聚类算法,并且比较容易实现。它非常直接,一般用于分析数据的第一步。经过该处理,我们能够得到一些相关数据集的先验知识。

K均值的机制

K均值算法师徒给给定的数据分割K个不相交的组,每个组的指标就是该组所有成员的均值。这个点通常称为质心,指具有相同名称的算术实体,并且可以被表示为任意维度的向量。

TnsorFlow 训练结果的保存与载入

1
2
3
4
5
6
7
8
9
10
11
12
saver = tf.train.Saver({
"W_conv1":W_conv1,
"b_conv1":b_conv1,
"W_conv2":W_conv2,
"b_conv2":b_conv2,
"W_fc1":W_fc1,
"b_fc1":b_fc1,
"W_fc2":W_fc2,
"b_fc2":b_fc2,
},max_to_keep=1)
saver.save(sess, "d:\model")
#保存数据的关键代码如上