脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Python - python人工智能tensorflow函数tf.nn.dropout使用方法

python人工智能tensorflow函数tf.nn.dropout使用方法

2022-12-15 10:49Bubbliiiing Python

这篇文章主要为大家介绍了python人工智能tensorflow函数tf.nn.dropout使用示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前言

神经网络在设置的神经网络足够复杂的情况下,可以无限逼近一段非线性连续函数,但是如果神经网络设置的足够复杂,将会导致过拟合(overfitting)的出现,就好像下图这样。

python人工智能tensorflow函数tf.nn.dropout使用方法

看到这个蓝色曲线,我就知道:

很明显蓝色曲线是overfitting的结果,尽管它很好的拟合了每一个点的位置,但是曲线是歪歪曲曲扭扭捏捏的,这个的曲线不具有良好的鲁棒性,在实际工程实验中,我们更希望得到如黑色线一样的曲线。

tf.nn.dropout函数介绍

tf.nn.dropout是tensorflow的好朋友,它的作用是为了减轻过拟合带来的问题而使用的函数,它一般用在每个连接层的输出。

Dropout就是在不同的训练过程中,按照一定概率使得某些神经元停止工作。也就是让每个神经元按照一定的概率停止工作,这次训练过程中不更新权值,也不参加神经网络的计算。但是它的权重依然存在,下次更新时可能会使用到它。

?
1
def dropout(x, keep_prob, noise_shape=None, seed=None, name=None)

x 一般是每一层的输出

keep_prob,保留keep_prob的神经元继续工作,其余的停止工作与更新

在实际定义每一层神经元的时候,可以加入dropout。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def add_layer(inputs,in_size,out_size,n_layer,activation_function = None,keep_prob = 1):
    layer_name = 'layer%s'%n_layer
    with tf.name_scope(layer_name):
        with tf.name_scope("Weights"):
            Weights = tf.Variable(tf.random_normal([in_size,out_size]),name = "Weights")
            tf.summary.histogram(layer_name+"/weights",Weights)
        with tf.name_scope("biases"):
            biases = tf.Variable(tf.zeros([1,out_size]) + 0.1,name = "biases")
            tf.summary.histogram(layer_name+"/biases",biases)
        with tf.name_scope("Wx_plus_b"):
            Wx_plus_b = tf.matmul(inputs,Weights) + biases
            #dropout一般加载每个神经层的输出
            Wx_plus_b = tf.nn.dropout(Wx_plus_b,keep_prob)
            #看这里看这里,dropout在这里。
            tf.summary.histogram(layer_name+"/Wx_plus_b",Wx_plus_b)
        if activation_function == None :
            outputs = Wx_plus_b
        else:
            outputs = activation_function(Wx_plus_b)
        tf.summary.histogram(layer_name+"/outputs",outputs)
        return outputs

但需要注意的是,神经元的输出层不可以定义dropout参数。因为输出层就是输出的是结果,在输出层定义参数的话,就会导致输出结果被dropout掉。

例子

本次例子使用sklearn.datasets,在进行测试的时候,我们只需要改变最下方keep_prob:0.5的值即可,1代表不进行dropout。

代码

?
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import tensorflow as tf
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelBinarizer
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 = 500)
def add_layer(inputs,in_size,out_size,n_layer,activation_function = None,keep_prob = 1):
    layer_name = 'layer%s'%n_layer
    with tf.name_scope(layer_name):
        with tf.name_scope("Weights"):
            Weights = tf.Variable(tf.random_normal([in_size,out_size]),name = "Weights")
            tf.summary.histogram(layer_name+"/weights",Weights)
        with tf.name_scope("biases"):
            biases = tf.Variable(tf.zeros([1,out_size]) + 0.1,name = "biases")
            tf.summary.histogram(layer_name+"/biases",biases)
        with tf.name_scope("Wx_plus_b"):
            Wx_plus_b = tf.matmul(inputs,Weights) + biases
            Wx_plus_b = tf.nn.dropout(Wx_plus_b,keep_prob)
            tf.summary.histogram(layer_name+"/Wx_plus_b",Wx_plus_b)
        if activation_function == None :
            outputs = Wx_plus_b
        else:
            outputs = activation_function(Wx_plus_b)
        tf.summary.histogram(layer_name+"/outputs",outputs)
        return outputs
def compute_accuracy(x_data,y_data,prob = 1):
    global prediction
    y_pre = sess.run(prediction,feed_dict = {xs:x_data,keep_prob:prob})
    correct_prediction = tf.equal(tf.arg_max(y_data,1),tf.arg_max(y_pre,1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
    result = sess.run(accuracy,feed_dict = {xs:x_data,ys:y_data,keep_prob:prob})
    return result
keep_prob = tf.placeholder(tf.float32)
xs = tf.placeholder(tf.float32,[None,64])
ys = tf.placeholder(tf.float32,[None,10])
l1 = add_layer(xs,64,100,'l1',activation_function=tf.nn.tanh, keep_prob = keep_prob)
l2 = add_layer(l1,100,100,'l2',activation_function=tf.nn.tanh, keep_prob = keep_prob)
prediction = add_layer(l1,100,10,'l3',activation_function = tf.nn.softmax, keep_prob = 1)
with tf.name_scope("loss"):
    loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=ys,logits = prediction),name = 'loss')
    tf.summary.scalar("loss",loss)
train = tf.train.AdamOptimizer(0.01).minimize(loss)
init = tf.initialize_all_variables()
merged = tf.summary.merge_all()
with tf.Session() as sess:
    sess.run(init)
    train_writer =  tf.summary.FileWriter("logs/strain",sess.graph)
    test_writer = tf.summary.FileWriter("logs/test",sess.graph)
    for i in range(5001):
        sess.run(train,feed_dict = {xs:X_train,ys:Y_train,keep_prob:0.5})
        if i % 500 == 0:
            print("训练%d次的识别率为:%f。"%((i+1),compute_accuracy(X_test,Y_test,prob=0.5)))
            train_result = sess.run(merged,feed_dict={xs:X_train,ys:Y_train,keep_prob:0.5})
            test_result = sess.run(merged,feed_dict={xs:X_test,ys:Y_test,keep_prob:0.5})
            train_writer.add_summary(train_result,i)
            test_writer.add_summary(test_result,i)

keep_prob = 0.5

训练结果为:

训练1次的识别率为:0.086000。
训练501次的识别率为:0.890000。
训练1001次的识别率为:0.938000。
训练1501次的识别率为:0.952000。
训练2001次的识别率为:0.952000。
训练2501次的识别率为:0.946000。
训练3001次的识别率为:0.940000。
训练3501次的识别率为:0.932000。
训练4001次的识别率为:0.970000。
训练4501次的识别率为:0.952000。
训练5001次的识别率为:0.950000。

这是keep_prob = 0.5时tensorboard中的loss的图像:

python人工智能tensorflow函数tf.nn.dropout使用方法

keep_prob = 1

训练结果为:

训练1次的识别率为:0.160000。
训练501次的识别率为:0.754000。
训练1001次的识别率为:0.846000。
训练1501次的识别率为:0.854000。
训练2001次的识别率为:0.852000。
训练2501次的识别率为:0.852000。
训练3001次的识别率为:0.860000。
训练3501次的识别率为:0.854000。
训练4001次的识别率为:0.856000。
训练4501次的识别率为:0.852000。
训练5001次的识别率为:0.852000。

这是keep_prob = 1时tensorboard中的loss的图像:

python人工智能tensorflow函数tf.nn.dropout使用方法

可以明显看出来keep_prob = 0.5的训练集和测试集的曲线更加贴近。

以上就是python人工智能tensorflow函数tf.nn.dropout使用示例的详细内容,更多关于tensorflow函数tf.nn.dropout的资料请关注服务器之家其它相关文章!

原文链接:https://blog.csdn.net/weixin_44791964/article/details/96972541

延伸 · 阅读

精彩推荐
  • Pythonpython针对不定分隔符切割提取字符串的方法

    python针对不定分隔符切割提取字符串的方法

    今天小编就为大家分享一篇python针对不定分隔符切割提取字符串的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    nudt_qxx6532021-04-13
  • Python解决Pycharm下面出现No R interpreter defined的问题

    解决Pycharm下面出现No R interpreter defined的问题

    今天小编就为大家分享一篇解决Pycharm下面出现No R interpreter defined的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    faith默默11612021-04-14
  • PythonDjango与DRF结合的全局异常处理方案详解

    Django与DRF结合的全局异常处理方案详解

    这篇文章主要为大家详细介绍了Django与DRF结合的全局异常处理方案,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Cao Lilu11402022-10-11
  • PythonPython Series从0开始索引的方法

    Python Series从0开始索引的方法

    今天小编就为大家分享一篇Python Series从0开始索引的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    玉米大人12492021-04-16
  • Pythonpytorch + visdom 处理简单分类问题的示例

    pytorch + visdom 处理简单分类问题的示例

    这篇文章主要介绍了pytorch + visdom 处理简单分类问题的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    泛泛之素4972021-02-28
  • Pythonselenium+python自动化测试之多窗口切换

    selenium+python自动化测试之多窗口切换

    这篇文章主要介绍了selenium+python自动化测试之多窗口切换,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    zh1755788097082021-05-21
  • PythonPython 局部变量global详解

    Python 局部变量global详解

    这篇文章主要介绍了Python 局部变量global详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下...

    lanxiaofang9312022-08-14
  • PythonPython突变测试介绍

    Python突变测试介绍

    你一定对所有内容都进行了测试,也许你甚至在项目仓库中有一个徽章,标明有 100% 的测试覆盖率,但是这些测试真的帮到你了吗?你怎么知道的?...

    Linux中国6392020-11-30