Neural network 如何在Tensorflow中应用Drop-Out来提高神经网络的精度?

Neural network 如何在Tensorflow中应用Drop-Out来提高神经网络的精度?,neural-network,tensorflow,deep-learning,Neural Network,Tensorflow,Deep Learning,退学是正规化技术。我想将其应用于notMNIST数据,以减少过度拟合,从而完成我的Udacity深度学习课程作业。我已经阅读了关于如何调用tf.nn.dropout。这是我的密码 继续之前。 来自未来导入打印功能 将numpy作为np导入 导入tensorflow作为tf 从6.0开始,将导入cPickle作为pickle pickle\u文件='notMNIST.pickle' 打开(pickle_文件,'rb')作为f: 保存=pickle.load(f) 列车数据集=保存[“列车数据集”]

退学是正规化技术。我想将其应用于notMNIST数据,以减少过度拟合,从而完成我的Udacity深度学习课程作业。我已经阅读了关于如何调用
tf.nn.dropout
。这是我的密码

继续之前。 来自未来导入打印功能 将numpy作为np导入 导入tensorflow作为tf 从6.0开始,将导入cPickle作为pickle pickle\u文件='notMNIST.pickle' 打开(pickle_文件,'rb')作为f: 保存=pickle.load(f) 列车数据集=保存[“列车数据集”] 列车标签=保存[“列车标签”] valid_dataset=保存['valid_dataset'] 有效的标签=保存['valid\u labels'] test\u dataset=save['test\u dataset'] 测试标签=保存[“测试标签”] del save#提示帮助gc释放内存 打印('Training set',train_dataset.shape,train_labels.shape) 打印('Validation set',valid_dataset.shape,valid_labels.shape) 打印('testset',Test_dataset.shape,Test_labels.shape) 图像大小=28 标签数量=10 def重新格式化(数据集、标签): dataset=dataset.Reformate(-1,图像大小*图像大小)).astype(np.float32) #映射1到[0.0,1.0,0.0…],映射2到[0.0,0.0,1.0…] 标签=(np.arange(num_标签)=标签[:,无]).astype(np.float32) 返回数据集、标签 序列号数据集,序列号标签=重新格式化(序列号数据集,序列号标签) 有效的\u数据集,有效的\u标签=重新格式化(有效的\u数据集,有效的\u标签) 测试数据集,测试标签=重新格式化(测试数据集,测试标签) 打印('Training set',train_dataset.shape,train_labels.shape) 打印('Validation set',valid_dataset.shape,valid_labels.shape) 打印('testset',Test_dataset.shape,Test_labels.shape) def精度(预测、标签): 返回(100.0*np.sum(np.argmax(预测,1)=np.argmax(标签,1))/predictions.shape[0]) #雷卢神经元 #param 培训时间=30 批次大小=521 显示步骤=1 n_输入=784#img形状:28*28 n#u类=10#n列出总类数(0-9位) #超参数 n_hidden_1=256 学习率=0.05 lambda_项=0.01 graph=tf.graph() 使用graph.as_default(): #初始权重 权重隐藏=tf.变量(tf.随机正常([n_输入,n_隐藏1],stddev=np.sqrt(n_输入))) 权重输出=tf.变量(tf.随机正常([n\u隐藏的\u 1,n\u类],stddev=np.sqrt(n\u隐藏的\u 1))) 偏差隐藏=tf.变量(tf.随机正常([n\u隐藏1])) 偏差=tf.变量(tf.随机的正常值([n_类]) x=tf.placeholder(“float”,[None,n_输入]) y=tf.placeholder(“float”,[None,n_类]) def模型(x、权重隐藏、权重输出、偏差隐藏、偏差输出): #具有RELU激活的隐藏层 层1=tf.nn.relu(tf.add(tf.matmul(x,权重隐藏),偏差隐藏)) #将下拉列表应用于隐藏层 保持_prob=tf.placeholder(tf.float32)#在此退出 drop_out=tf.nn.dropout(层_1,保留_prob)#这里的dropout #线性激活输出层 out\u layer=tf.matmul(layer\u 1,weights\u out)+偏差 返回输出层 #构造模型 pred=模型(x,权重隐藏,权重隐藏,偏差隐藏,偏差隐藏) #定义损失和优化器 成本=tf.减少平均值(tf.nn.softmax\u交叉\u熵\u与逻辑(pred,y)+ lambda_项*tf.nn.l2_损失(权重隐藏)+ lambda_项*tf.nn.l2_损失(重量)+ lambda_项*tf.nn.l2_损失(隐藏偏差)+ lambda_项*tf.nn.l2_损失(偏置) 优化器=tf.train.AdamOptimizer(学习率=学习率)。最小化(成本) #运行图表 使用tf.Session(graph=graph)作为sess: tf.initialize_all_variables().run() 打印('已初始化') #训练周期 对于范围内的历元(训练历元): 平均成本=0。 总批次=int(系列数据集形状[0]/批次大小) #循环所有批次 对于范围内的i(总批次): 批次x=序列数据集[(i*批次大小):((i*批次大小)+批次大小),:] 批次y=序列标签[(i*批次大小):((i*批次大小)+批次大小),:] #运行优化op(backprop)和成本op(以获取损失值) _,c=sess.run([optimizer,cost],feed_dict={x:batch_x,y:batch_y}) #计算平均损失 平均成本+=成本/总批次 #按历元步长显示日志 如果历元%display_step==0: 打印(“历元:”、“%04d%”(历元+1)、“成本=”、“{.9f}”。格式(平均成本)) 打印(“优化完成!”) #测试模型 正确的预测=tf.equal(tf.argmax(pred,1),tf.argmax(y,1)) #计算精度 准确度=tf.reduce\u平均值(tf.cast(正确的预测,“浮动”)) 打印(“测试数据精度:”,accurity.eval({x:Test_数据集,y:Test_标签})) 打印(“有效数据精度:”,accurity.eval({x:Valid_dataset,y:Valid_labels}))
tf.nn.dropout
在函数
model()
中被调用,但在我将dropout技术应用于神经网络后,精度似乎没有任何变化,结果如下:

Epoch: 0001 cost= 579980.086977807
Epoch: 0002 cost= 238859.802382506
Epoch: 0003 cost= 90672.733752856
Epoch: 0004 cost= 32649.040985028
Epoch: 0005 cost= 11325.878361874
Epoch: 0006 cost= 3866.805511076
Epoch: 0007 cost= 1357.785540469
Epoch: 0008 cost= 519.381747333
Epoch: 0009 cost= 225.359804119
Epoch: 0010 cost= 110.099476707
Epoch: 0011 cost= 55.212384386
Epoch: 0012 cost= 28.469241683
Epoch: 0013 cost= 14.511494627
Epoch: 0014 cost= 6.567228943
Epoch: 0015 cost= 3.186372240
Epoch: 0016 cost= 1.701917576
Epoch: 0017 cost= 1.041632473
Epoch: 0018 cost= 0.843376874
Epoch: 0019 cost= 0.786183911
Epoch: 0020 cost= 0.775412846
Epoch: 0021 cost= 0.782965020
Epoch: 0022 cost= 0.796788171
Epoch: 0023 cost= 0.814522117
Epoch: 0024 cost= 0.832090579
Epoch: 0025 cost= 0.849197715
Epoch: 0026 cost= 0.867473578
Epoch: 0027 cost= 0.889561496
Epoch: 0028 cost= 0.921837020
Epoch: 0029 cost= 16.655304543
Epoch: 0030 cost= 1.421570476
Optimization Finished!
Test data accuracy: 0.8775
Valid data accuracy: 0.8069

如何通过Tensorflow应用辍学来提高网络的准确性?谢谢大家!

在图中,我建议将
将_prob=tf.placeholder(tf.float32)
移到
模型
函数之外,使其成为全局函数

带有graph.as_default()的
:
...
x=tf.placeholder(“float”,[None,n_输入])
y=tf.placeholder(“float”,[None,n_类])
keep_prob=tf.placeholder(tf.float32)
def模型(x、权重隐藏、权重隐藏、偏差隐藏、偏差隐藏、保持概率):
#具有RELU激活的隐藏层
层1=tf.nn.relu(tf.add(tf.matmul(x,权重隐藏),偏差隐藏))
#将下拉列表应用于隐藏层
drop_out=tf.nn.dropout(层_1,保留_prob)#这里的dropout
#线性输出层
    layer_1 = tf.nn.relu(tf.add(tf.matmul(x, weights_hiden), biases_hidden))
    # apply DropOut to hidden layer
    keep_prob = tf.placeholder(tf.float32)  # DROP-OUT here
    drop_out = tf.nn.dropout(layer_1, keep_prob)  # DROP-OUT here
    # output layer with linear activation
    out_layer = tf.matmul(layer_1, weights_out) + biases_out
    layer_1 = tf.nn.relu(tf.add(tf.matmul(x, weights_hiden), biases_hidden))
    # apply DropOut to hidden layer
    drop_out = tf.nn.dropout(layer_1, keep_prob)  # DROP-OUT here
    # output layer with linear activation
    out_layer = tf.matmul(drop_out, weights_out) + biases_out