TensorFlow 建立网络模型
上次一我们在fashion-mnist上面体验了一把,但是里面有一些建立模型和一些TensorFlow的基础概念都没有给大家讲,所以这节决定将这方面的知识介绍一些,上节是为了引起大家的注意,TensorFlow具有很强大的功能,我们只能后续慢慢的学习。
- 其实在上一次的实例中,有很多地方确实是很困惑的,如果没有接触过机器学习的小伙伴可能理解起来会有一些问题,那么我开头就稍微讲一下,机器学习有一些什么?就我现在了解的一些内容给大家介绍,有可能有一些不到位的地方,还请多多包涵:
- 其实机器学习,总的宗旨就是利用数据的特征来做识别和分类等任务
- 第一大类是分类工作,假设有一百类,经典的做法,就是使用神经网络提取一些数据的特征,然后利用softmax输出层进行不同种类概率的预测:
\[
softmax(i) = \frac{X_i}{\sum_{i=0,99}X_i}
\]
- 上面是softmax层计算的公式,从一百类里面找出每一类的概率值,然后按照概率值来预测输入数据是哪一种类型,就像上一次文章里面的fashion-mnist的数据一样,会预测出输出的类别。softmax(i)代表的就是这个种类的概率值,取最大值作为预测类别。
- 你可以把一个矩阵看成一个数据集合,一行是一个数据信息,就和我们的关系型数据一样,一行代表一个表的一条信息,那么每列就是每一行数据的一个属性,那么在机器学习里面就是数据的特征了,因为在网络模型中,每个特征都有对应的权重,那么,对于每个特征来说,对于最后的分类,识别等工作起的重要程度是不一样的。这也和我们的数据库信息差不多,有一些信息也是无关紧要的。有些信息可以主要决定这一行数据。
- 第二大类就是回归,回归可以看作是一个连续的分类,对于二维数据来说,其实就是根据你给出的数据来拟合一条线。对于三维来讲就是拟合一个平面。再高维就是超平面。
- 最近,也就是2018年3月31在加利福尼亚州山景城的计算机历史博物馆举办了第二届TensorFlow开发者峰会,会上有超过500名使用TensorFlow的用户,还有一些观众,大家有兴趣的话可以关注youtube的TensorFlow官方频道。可以查看开会的视频。
- TensorFlow应用广泛,其中有使用TensorFlow来做开普勒任务分析的
- 也有使用TensorFlow预测心脏发作和中风概率
- 还有一些应用在现实当中的项目。
- 这让我们认识到TensorFlow对于实际领域中应用的越来越广泛,所以我们不学习是不是有点亏。这么好的开源项目。
- 上一次我们既然做过了一次服装类别识别,那么这次我主要从TensorFlow建立模型的步骤讲起:让大家再深入理解一下TensorFlow。
- 第一步也是很重要的一步,那就是导入数据。
- 第二步一般就是对数据进行的预处理,一般包括归一化数据,转换数据等操作。
- 第三步设置算法的超参数,一般也就是学习率,batch_size(批处理个数),epoch(轮次)。这里举一个例子,假如你有10000条训练数据。那么,batch_size设置为100,那么你的一个epoch就迭代100次才能将所有数据训练一遍,每次输入数据是100条,因为一个epoch的意思就是训练完一次训练数据,所以一个epoch是迭代100次就可以结束一轮了。learning_rate一般设置为0.1-0.0001之间,但是也不排除一些特殊情况,主要是learning_rate设置的过小,反向传播更新参数的时候速度会很慢,设置的过大,会出现无法收敛的情况。
- 第四步设置变量和placeholders,变量是记录权重和偏置项信息的,一般在最小化loss函数的时候,反向传播算法会更新权重和偏置项,TensorFlow导入数据是通过placeholders来实现的,大家还记得我们上次的fashion-mnist识别,我的数据就是通过先定义placeholders,最后在Session运行的时候,在feed_dict这个字典参数里面将训练数据喂进去的。
1 2 3 4
| a_var = tf.constant(42) x_input = tf.placeholder(tf.float32, [n_x, None], name="X") x_output = tf.placeholder(tf.float32, [n_y, None], name="y")
|
- 第五步定义图模型,我们有了数据,初始化了变量和placeholders,那我们就需要定义一个图模型,来生成TensorFlow的图模型(计算图)我们必须告诉TensorFlow对我们的数据进行哪些操作,来让我们的模型具有预测能力(更加深入的运算我们在后续的博客里面会陆续讲到)
1
| h_pre_output = tf.add(tf.matmul(W, x_input) + B)
|
- 第六步声明loss函数,在上面计算图中我们定义了一些对我们数据的操作。那么我们需要验证我们预测的输出,和我们真实之间的差距,一般对于回归任务来讲的话,就是平方误差:这样就求得了平方误差。但是对于分类任务,那就是交叉熵误差。就像上一节我们用到的loss生成函数就是softmax这种方式。,交叉熵的公式后续用到再给大家介绍。
\[
loss(i)=\frac{1}{N}\sum{_i}(y\_pre_i-y\_true_i)^2
\]
1 2
| TensorFlow求法: loss = tf.reduce_mean(tf.square(y_pre - y_true))
|
- 第七步声明了loss函数以后,我们需要使用BP算法也就是反向传播算法来更新权重和偏置项。在TenorFlow框架里面有好多这样的优化器,都在 tf.train这个模块里面。
1 2
| optimizer = tf.train.AdamOptimizer(learning_rate = 0.001).minimize(loss) 这个就是我们上次使用的优化器,来优化我们的loss
|
- 最后一步那就是初始化会话Session(),开始训练模型
1 2 3
| with tf.Session() as session: session.run(init) .....
|
- 由上面的步骤,大家再结合上一次的网络代码,是不是可以理解了TensorFlow在建立一个网络模型的时候的具体步骤。
- 其实在TensorFlow中还有一个很重要的概念,那就是Tensor,上次说过了它的概念,那么接下来我讲一下TensorFlow里面的Tensor。
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
| import tensorflow as tf from tensorflow.python.framework import ops ops.reset_default_graph()
sess = tf.Session()
tensor_zeros = tf.zeros([1, 20]) sess.run(tensor_zeros) my_var = tf.Variable(tf.zeros([1, 20])) sess.run(my_var.initializer) sess.run(my_var)
zero_similar = tf.Variable(tf.zeros_like(tensor_zeros))
sess.run(zero_similar.initializer) print(sess.run(zero_similar))
tf.fill([row, col], -1) tf.linspace(start=0.0, stop=1.0, num=3) tf.range(start=6, limit=15, delta=3) tf.random_normal([row_dim, col_dim], mean=0.0, stddev=1.0) tf.random_uniform([row_dim, col_dim], minval=0, maxval=4)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| import tensorflow as tf from tensorflow.python.framework import ops ops.reset_default_graph()
sess = tf.Session()
my_var = tf.Variable(tf.zeros([1,20]))
merged = tf.summary.merge_all()
writer = tf.summary.FileWriter("./tmp/variable_logs", graph=sess.graph)
initialize_op = tf.global_variables_initializer()
sess.run(initialize_op)
|
- 那怎么使用tensorboard
1 2
| #进去我们的环境变量,然后执行 tensorboard --logdir=tmp的绝对路径
|

可以看到我上面执行的命令。然后在浏览器里面输入127.0.0.1:6006然后你就可以看到刚才那个变量的操作过程,这就是tensorboard的魅力

上面就是一个变量在进行初始化时候可视化显示
- Placeholders使用(一样可以使用tensorboard来查看)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| import numpy as np import tensorflow as tf from tensorflow.python.framework import ops ops.reset_default_graph() sess = tf.Session() # 定义一个placeholder x = tf.placeholder(tf.float32, shape = (4, 4))
# 随机生成4 * 4的矩阵 reand_array = np.random.rand(4, 4) y = tf.identity(x) # 返回与输入对象相同的内容和大小 print(sess.run(y, feed_dict={x: rand_array}))
merged = tf.summary.merge_all() writer = tf.summary.FileWriter("./tmp/variable_logs", sess.graph)
|

总结
这次我们就TensorFlow的一些基础概念的介绍,也是为了让大家在以后的TensorFlow使用过程中少一些疑问,后面的章节,我们会慢慢深入。小伙伴们不要着急,我的邮箱是air@weaf.top,依旧是那个可以交流学习的milittle。谢谢大家的驻足。
第一篇 TensorFlow安装
第二篇 TensorFlow初体验(fasion-mnist识别)
修改pip全局镜像方法