gpt4 book ai didi

machine-learning - 我可以使用 `tf.nn.dropout`来实现DropConnect吗?

转载 作者:行者123 更新时间:2023-11-30 08:25:41 25 4
gpt4 key购买 nike

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

最佳答案

回答

是的,您可以使用tf.nn.dropout来执行DropConnect,只需使用tf.nn.dropout来包装您的权重矩阵而不是你的后矩阵乘法。然后,您可以通过乘以 dropout 来撤消权重变化,如下所示

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

代码示例

下面是使用 drop connect 计算 XOR 函数的代码示例。我还注释掉了执行 dropout 的代码,您可以将其插入并比较输出。

### 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。

关于machine-learning - 我可以使用 `tf.nn.dropout`来实现DropConnect吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44355229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com