【问题标题】:Dropout Tensorflow: Weight scaling at test timeDropout Tensorflow:测试时的权重缩放
【发布时间】:2017-06-22 10:00:56
【问题描述】:

我是否需要在测试时在 tensorflow 中缩放权重,即测试时的 weights*keep_prob 还是 tensorflow 本身?如果是这样,那怎么办? 在训练时,我的 keep_prob 是 0.5。在测试时它的1。 虽然网络是正则化的,但准确性不如正则化之前。 P.S 我正在对 CIFAR10 进行分类

n_nodes_h1=1000
n_nodes_h2=1000
n_nodes_h3=400
n_nodes_h4=100

classes=10
x=tf.placeholder('float',[None,3073])
y=tf.placeholder('float')
keep_prob=tf.placeholder('tf.float32')

batch_size=100

def neural_net(data):
    hidden_layer1=    {'weight':tf.Variable(tf.random_normal([3073,n_nodes_h1])), 
              'biases':tf.Variable(tf.random_normal([n_nodes_h1]))}

    hidden_layer2={'weight':tf.Variable(tf.random_normal([n_nodes_h1,n_nodes_h2])), 
              'biases':tf.Variable(tf.random_normal([n_nodes_h2]))}



    out_layer={'weight':tf.Variable(tf.random_normal([n_nodes_h2,classes])), 
              'biases':tf.Variable(tf.random_normal([classes]))}


    l1= tf.add(tf.matmul(data,hidden_layer1['weight']),     hidden_layer1['biases'])
    l1=tf.nn.relu(l1)

    #************DROPOUT*******************
    l1=tf.nn.dropout(l1,keep_prob)


    l2= tf.add(tf.matmul(l1,hidden_layer2['weight']), hidden_layer2['biases'])
    l2=tf.nn.relu(l2)



    out=  tf.matmul(l2,out_layer['weight'])+ out_layer['biases']


    return out

这是网络

iterations=20
Train_loss=[]
Test_loss=[]

def train_nn(x):
    prediction=neural_net(x)


    cost=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=prediction,labels=y))
    optimizer=tf.train.AdamOptimizer().minimize(cost)

    epochs=iterations

    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())

        for epoch in range (epochs):
            e_loss=0

            i=0
            for _ in range(int(X_train.shape[0]/batch_size)):
                e_x=X_train[i:i+batch_size]
                e_y=y_hot_train[i:i+batch_size]
                i+=batch_size

                _,c=sess.run([optimizer,cost],feed_dict={x:e_x,y:e_y,  keep_prob:0.5})


                e_loss+=c


        print "Epoch: ",epoch," Train loss= ",e_loss 
        Train_loss.append(e_loss)



    correct=tf.equal(tf.argmax(prediction,1),tf.argmax(y,1))

    accuracy=tf.reduce_mean(tf.cast(correct,'float'))
    print "Accuracy on test: " ,accuracy.eval({x:X_test,y:y_hot_test  , keep_prob:1.})
    print "Accuracy on train:"   ,accuracy.eval({x:X_train[0:2600],y:y_hot_train[0:2600],  keep_prob=1.})
train_nn(x)

我需要类似的东西吗

hidden_layer1['weight']*=keep_prob 
#testing time

【问题讨论】:

  • 不,你不需要。 Dropout 层将其所有输出乘以 1 / keep_prob
  • 所以我的网络看起来不错?
  • 你的 dropout 实现很好。但是您的网络不够深,无法退出。增加网络复杂度,当训练数据过拟合时,添加 dropout 以进行正则化。

标签: machine-learning tensorflow neural-network computer-vision deep-learning


【解决方案1】:

Tensorflow 自己做:

使用概率keep_prob,输出放大1/的输入元素/ keep_prob,否则输出 0。缩放使得预期 总和不变。

(来自this page

【讨论】:

    猜你喜欢
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    相关资源
    最近更新 更多