过拟合

过拟合(overfitting,过度学习,过度拟合):

过度准确地拟合了历史数据(精确的区分了所有的训练数据),而对新数据适应性较差,预测时会有很大误差。

过拟合是机器学习中常见的问题,解决方法主要有下面几种:

1. 增加数据量

大部分过拟合产生的原因是因为数据量太少。

2. 运用正则化

例如L1、L2 regularization等等,适用于大多数的机器学习,包括神经网络。

3. Dropout

专门用在神经网络的正则化的方法。

Dropout regularization是指在深度学习网络的训练过程中,按照一定的概率将一部分神经网络单元暂时从网络中丢弃,相当于从原始的网络中找到一个更瘦的网络。
只需要给予它一个不被drop掉的百分比,就能很好地降低overfitting。

也就是说,在训练的时候,随机忽略掉一些神经元和神经联结 ,使这个神经网络变得”不完整”,然后用一个不完整的神经网络训练一次。
到第二次再随机忽略另一些, 变成另一个不完整的神经网络。
有了这些随机drop掉的规则, 每一次预测结果都不会依赖于其中某部分特定的神经元。
Dropout的做法是从根本上让神经网络没机会过度依赖。

TensorFlow中的Dropout方法

TensorFlow提供了强大的dropout方法来解决overfitting问题。

示例

 # coding=utf-8
from __future__ import print_function
import tensorflow as tf
from sklearn.datasets import load_digits # 使用sklearn中的数据
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelBinarizer
import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '' digits = load_digits()
X = digits.data
y = digits.target
y = LabelBinarizer().fit_transform(y)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.3) # X_train是训练数据, X_test是测试数据 def add_layer(inputs, in_size, out_size, layer_name, activation_function=None, ):
Weights = tf.Variable(tf.random_normal([in_size, out_size]))
biases = tf.Variable(tf.zeros([1, out_size]) + 0.1, )
Wx_plus_b = tf.matmul(inputs, Weights) + biases
Wx_plus_b = tf.nn.dropout(Wx_plus_b, keep_prob) # dropout
if activation_function is None:
outputs = Wx_plus_b
else:
outputs = activation_function(Wx_plus_b, )
tf.summary.histogram(layer_name + '/outputs', outputs)
return outputs keep_prob = tf.placeholder(tf.float32) # keep_prob(保留的结果所占比例)作为placeholder在run时传入
xs = tf.placeholder(tf.float32, [None, 64])
ys = tf.placeholder(tf.float32, [None, 10]) l1 = add_layer(xs, 64, 50, 'l1', activation_function=tf.nn.tanh) # 隐含层
prediction = add_layer(l1, 50, 10, 'l2', activation_function=tf.nn.softmax) # 输出层 cross_entropy = tf.reduce_mean(-tf.reduce_sum(ys * tf.log(prediction),
reduction_indices=[1])) # loss between prediction and real data
tf.summary.scalar('loss', cross_entropy)
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy) sess = tf.Session()
merged = tf.summary.merge_all()
train_writer = tf.summary.FileWriter("logs/train", sess.graph)
test_writer = tf.summary.FileWriter("logs/test", sess.graph)
init = tf.global_variables_initializer()
sess.run(init) for i in range(500):
sess.run(train_step, feed_dict={xs: X_train, ys: y_train, keep_prob: 0.5}) # keep_prob=0.5相当于50%保留
if i % 50 == 0:
train_result = sess.run(merged, feed_dict={xs: X_train, ys: y_train, keep_prob: 1})
test_result = sess.run(merged, feed_dict={xs: X_test, ys: y_test, keep_prob: 1})
train_writer.add_summary(train_result, i)
test_writer.add_summary(test_result, i)

对比运行结果

在TensorBoard中查看。

训练中keep_prob=1时,暴露出overfitting问题,模型对训练数据的适应性优于测试数据,存在overfitting。

keep_prob=0.5时,dropout发挥了作用,减少了过拟合。

最新文章

  1. HIVE 在执行大量数据JOIN的时候,容易产生内存不足的情况
  2. TW2015技术雷达中文版发布
  3. 树的prufer编码
  4. Java之循环语句练习1
  5. 001_bytearray
  6. Cocos2d-x数据持久化-修改数据
  7. 我是如何理解ThreadLocal
  8. selenium系列------元素定位套路
  9. light oj 1184 Marriage Media
  10. Spring boot 应用打包部署
  11. 标识符and数据类型
  12. 如何明确区分代码中的1和l
  13. ORACLE结构体系篇之表空间详解.md
  14. Deep Learning系统实训之二:梯度下降原理
  15. 有关cookies与session的详细信息
  16. htm-文字标签和注释标签
  17. 【laravel54】详解中间件
  18. STM32 SPI接口的NSS引脚
  19. 处理URL为模块/控制器/方法的格式
  20. 内存池-转载自IBM

热门文章

  1. [Python] uniform() 函数
  2. tcp.go
  3. KVM虚拟化环境准备
  4. Keepalived + nginx实现高可用性和负载均衡
  5. POI读取excel文件。
  6. Python GIL(Global Interpreter Lock)
  7. 点击a标签实现txt文件另存的效果
  8. 【工具篇】Selenium 学习实践(一)环境搭建
  9. Spark学习之数据读取与保存总结(一)
  10. Spark学习之键值对操作总结