Neural network 如何在Tensorflow中应用Drop-Out来提高神经网络的精度?
退学是正规化技术。我想将其应用于notMNIST数据,以减少过度拟合,从而完成我的Udacity深度学习课程作业。我已经阅读了关于如何调用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) 列车数据集=保存[“列车数据集”]
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