tensorflow03 《TensorFlow实战Google深度学习框架》笔记-04-01

来源:互联网 发布:电脑学习软件 编辑:程序博客网 时间:2024/06/05 03:53

01 关于神经网络的一些个人理解

神经网络、深度神经网络的一个基本假设:
对于一组足够数量的输入神经元(输入数据),能够通过一个复杂函数得到一组想要的指定数量的输出神经元(输出数据)。
我们搭建的神经网络、深度神经网络就是为了找到这个复杂函数。
为了找到这个复杂函数,我们需要用可实现的函数表达来实现。考虑到计算复杂度和数据存储等因素。需要找到最简单的替代”函数群组”(神经网络)。
最简单和方便计算的函数是线性函数y=Wx+b,因为可积可导,可以推广到多维情况的y、w、x、b。
最方便的存储是数组、向量、矩阵。
假设这个复杂函数可积可导。就可以用一组简单的可积可导函数来代替这个复杂函数(链式法则)。
深度神经网络就是要设计这样一组简单的可积可导函数(网络设计)。
可积能够前向传播。可导能够反向传播。
需要注意的问题是:避免导数为0或无穷大。
这样一组简单的线性函数的(权重+偏置)群组,最后就相当于我们要寻找的那个能完成从输入到输出的复杂函数。
我们怎么确认这组(权重+偏置)群组是比较合理(最合理)?用各种误差函数来衡量。误差越小越好。
反向传播使我们能够通过一定的手段(比如梯度下降、随机梯度下降)来修正w、b等参数;修正w、b参数后,再前向传播就会得到更小的误差函数。
训练网络(往复的前向传播、反向传播),能够逼近一个理想的最小误差,也就得到了那一个我们想要的复杂函数。
逼近最小误差,也就是所谓的收敛。
如果训练网络收敛越快、误差越小,在测试数据集表现良好,说明神经网络的设计优秀。
收敛速度快,说明需要的迭代次数少,计算量小;
误差小,说明判断准确度高;
在测试数据集表现良好,说明特征提取准确、覆盖度高。
影响网络质量的一些可控因素:
初始化数据方式(绝对值范围、分布、离散情况等);
训练数据数量(是否全面、有足够代表性;batch前是否随机化数据;单batch数据的代表性、普遍性;数据的准确性)

  1. 线性模型串联依然是线性模型
  2. 线性模型并联依然是线性模型
  3. 单层神经网络不能解决异或问题,多层神经网络可以解决异或问题
  4. 权重(weight)y=Wx
  5. 偏置项(bias)y=Wx+b
  6. 激活函数(activation function)能够实现去线性化(传说3层激活函数后,可以模拟任意函数)(tf.nn.relu、tf.sigmoid、tf.tanh)
  7. 损失函数(loss function):训练预测值和真实值之间的误差表达方式。可以刻画出神经网络的好坏。
  8. 神经网络优化算法:反向传播(backpropagation)、梯度下降、随机梯度下降、每个batch的梯度下降
  9. 学习率(learing rate):确定梯度下降的速度
  10. 正则化(regularization):L1、L2;对避免过拟合有较好效果
  11. 滑动平均模型:可以使训练模型在测试数据集上表现更好

02 几个tensorflow函数

# 《TensorFlow实战Google深度学习框架》04 深层神经网络# win10 Tensorflow1.0.1 python3.5.3# CUDA v8.0 cudnn-8.0-windows10-x64-v5.1# filename:ts04.01.pyimport tensorflow as tfsess = tf.Session();# cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0))# y_代表正确结果,y代表预测结果# tf.clip_by_value确保不会出现log0或者大于1的概率出现v = tf.constant([[1.0, 2.0, 3.0],[4.0, 5.0, 6.0]])print(sess.run(tf.clip_by_value(v, 2.5, 4.5)))# 输出[[2.5 2.5 3.][4. 4.5 4.5]]v = tf.constant([1.0, 2.0, 3.0])print(sess.run(tf.log(v)))# 输出 [ 0.          0.69314718  1.09861231]# 交叉熵中"*"代表对应位置的元素相乘,而不是矩阵相乘v1 = tf.constant([[1.0, 2.0], [3.0, 4.0]])v2 = tf.constant([[5.0, 6.0], [7.0, 8.0]])print(sess.run((v1 * v2)))print(sess.run(tf.matmul(v1, v2)))# 输出:[[5. 12.][21. 32.]]# [[19. 22.][43. 50.]]# 交叉熵得到一个nXm的矩阵,n=batch_size,m=分类数量v = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])print(sess.run(tf.reduce_mean(v)))# 输出 3.5# 带softmax的交叉熵损失函数,y 神经网络输出结果,y_标准答案# cross_entropy = tf.nn.softmax_cross_entropy_with_logits(y, y_)# 对于只有一个正确答案的分类问题# cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(y, y_)# 均方差损失函数,解决回归问题,主要是对具体数值的预测# mse = tf.reduce_mean(tf.square(y_ - y))# 自定义损失函数# loss = tf.reduce_sum(tf.where(tf.greater(y, y_), (y - y_) * a, (y_ - y) * b))v1 = tf.constant([1.0, 2.0, 3.0, 4.0])v2 = tf.constant([4.0, 3.0, 2.0, 1.0])print(sess.run(tf.greater(v1, v2))) # [False False  True  True]print(sess.run(tf.where(tf.greater(v1, v2), v1, v2))) # [ 4.  3.  3.  4.]sess.close();
1 0