【问题标题】:Can I use `tf.nn.dropout` to implement DropConnect?我可以使用 `tf.nn.dropout` 来实现 DropConnect 吗?
【发布时间】:2017-06-04 14:36:20
【问题描述】:

我(认为)我掌握了 DropOut 和 use of the TensorFlow API in implementing it 的基础知识。但是与tf.nn.dropout 中的辍学概率相关的标准化似乎不是DropConnect 的一部分。那是对的吗?如果是这样,规范化是否有任何“伤害”,或者我可以简单地将tf.nn.dropout 应用于我的权重以实现 DropConnect?

【问题讨论】:

    标签: machine-learning tensorflow neural-network


    【解决方案1】:

    回答

    是的,你可以使用 tf.nn.dropout 来做 DropConnect,只需使用 tf.nn.dropout 来包装你的权重矩阵而不是你的后矩阵乘法。然后,您可以通过乘以 dropout 来撤消权重变化,就像这样

    dropConnect = tf.nn.dropout( m1, keep_prob ) * keep_prob
    

    代码示例

    这是一个使用 drop connect 计算 XOR 函数的代码示例。我还注释掉了可以退出并比较输出的代码。

    ### imports
    import tensorflow as tf
    
    ### constant data
    x  = [[0.,0.],[1.,1.],[1.,0.],[0.,1.]]
    y_ = [[1.,0.],[1.,0.],[0.,1.],[0.,1.]]
    
    ### induction
    
    # Layer 0 = the x2 inputs
    x0 = tf.constant( x  , dtype=tf.float32 )
    y0 = tf.constant( y_ , dtype=tf.float32 )
    
    keep_prob = tf.placeholder( dtype=tf.float32 )
    
    # Layer 1 = the 2x12 hidden sigmoid
    m1 = tf.Variable( tf.random_uniform( [2,12] , minval=0.1 , maxval=0.9 , dtype=tf.float32  ))
    b1 = tf.Variable( tf.random_uniform( [12]   , minval=0.1 , maxval=0.9 , dtype=tf.float32  ))
    
    
    ########## DROP CONNECT
    # - use this to preform "DropConnect" flavor of dropout
    dropConnect = tf.nn.dropout( m1, keep_prob ) * keep_prob
    h1 = tf.sigmoid( tf.matmul( x0, dropConnect ) + b1 ) 
    
    ########## DROP OUT
    # - uncomment this to use "regular" dropout
    #h1 = tf.nn.dropout( tf.sigmoid( tf.matmul( x0,m1 ) + b1 ) , keep_prob )
    
    
    # Layer 2 = the 12x2 softmax output
    m2 = tf.Variable( tf.random_uniform( [12,2] , minval=0.1 , maxval=0.9 , dtype=tf.float32  ))
    b2 = tf.Variable( tf.random_uniform( [2]   , minval=0.1 , maxval=0.9 , dtype=tf.float32  ))
    y_out = tf.nn.softmax( tf.matmul( h1,m2 ) + b2 )
    
    
    # loss : sum of the squares of y0 - y_out
    loss = tf.reduce_sum( tf.square( y0 - y_out ) )
    
    # training step : discovered learning rate of 1e-2 through experimentation
    train = tf.train.AdamOptimizer(1e-2).minimize(loss)
    
    ### training
    # run 5000 times using all the X and Y
    # print out the loss and any other interesting info
    with tf.Session() as sess:
      sess.run( tf.initialize_all_variables() )
      print "\nloss"
      for step in range(5000) :
        sess.run(train,feed_dict={keep_prob:0.5})
        if (step + 1) % 100 == 0 :
          print sess.run(loss,feed_dict={keep_prob:1.})
    
    
      results = sess.run([m1,b1,m2,b2,y_out,loss],feed_dict={keep_prob:1.})
      labels  = "m1,b1,m2,b2,y_out,loss".split(",")
      for label,result in zip(*(labels,results)) :
        print ""
        print label
        print result
    
    print ""
    

    输出

    两种风格都能够正确地将输入分离为正确的输出

    y_out
    [[  7.05891490e-01   2.94108540e-01]
     [  9.99605477e-01   3.94574134e-04]
     [  4.99370173e-02   9.50062990e-01]
     [  4.39682379e-02   9.56031740e-01]]
    

    在这里您可以看到 dropConnect 的输出能够正确地将 Y 分类为 true、true、false、false。

    【讨论】:

    • 对于卷积层:我假设 DropConnect 以同样的方式应用于内核权重,代替 Dropout 之前/之后的应用程序([我永远不清楚哪个(stackoverflow.com/q/37573674/656912))汇集。对吗?
    • 是的,你可以用它来dropconnect任何重量。诀窍是包装重量而不是后处理。对于卷积,您将拥有一个权重矩阵,就像上面的代码一样,并且您将以相同的方式包装它。干杯。
    • 在那一点上,我希望为我的 [相关问题](stackoverflow.com/q/37573674/656912) 提供更好的答案(或意见)。
    • Regularization of Neural Networks using DropConnect 论文说“此外,在训练过程中,偏差也被掩盖了”——这是否意味着上面的代码应该将tf.nn.dropout(b1, keep_prob)*keep_prob 应用于b1
    • 哦,这是一个有趣的问题。值得一试,或者至少是一次思想实验。作为一个思想实验,我会说偏差起到“白平衡”嵌入空间的作用,而 dropConnect 的作用是使层到层的连接产生冗余作用,所以我的直觉会说在偏差上使用 dropConnect 是错误的。但是,值得一试。我在那篇论文中没有看到任何经验性测试的内容。这更像是他们在说他们做了什么 - 只是让你知道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    相关资源
    最近更新 更多