TensorFlow-4 实现多层感知机

1 TensorFlow搭建网络的步骤

(1)定义公式,也就是forward时的计算;
(2)定义loss,选定优化器,并指定优化器优化loss
(3)迭代地对数据进行训练;
(4)在测试集上或验证集上对准确率进行评测。

2 设置

数据:Mnist数据
网络:1个隐含层,隐含层节点数300(200--1000范围内的结果差别不大)。
    W1的初始化参数为截断的正太分布,其标准差为0.1.
          模型使用的激活函数为ReLU。
          对隐含层的输出采用dropout, 训练时keep_prob=0.75,即保留75%的数据,防止过拟合。测试时keep_prob=1
          loss使用交叉信息熵,优化器选用Adagrad,并把学习速率设为0.3.。
          一共采用3000个batch,每个batch包含100条样本。

3 代码实现

'''
利用神经网络实现数字识别
'''
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

class NN(object):
    def __init__(self,l_input,l_hidden,l_output,transfer_function=tf.nn.relu,
                 optimizer=tf.train.AdagradOptimizer):
        self.l_input=l_input
        self.l_hidden=l_hidden
        self.l_output=l_output
        self.transfer=transfer_function
        self.optimizer=optimizer
        self.keep_prob=tf.placeholder(tf.float32)
        self.x=tf.placeholder(tf.float32,[None,self.l_input]) #输入数据
        self.w1=tf.Variable(tf.truncated_normal([self.l_input,self.l_hidden],stddev=0.1))#w1初始化服从标准差为0.1的截断正态分布
        self.b1=tf.Variable(tf.zeros([self.l_hidden],dtype=tf.float32))#b1初始化为0
        self.hidden=self.transfer(tf.matmul(self.x,self.w1)+self.b1)#隐含层输出
        self.hidden=tf.nn.dropout(self.hidden,self.keep_prob) #dropout策略
        self.w2=tf.Variable(tf.zeros([self.l_hidden,self.l_output],dtype=tf.float32))#w2初始化为0
        self.b2=tf.Variable(tf.zeros([self.l_output],dtype=tf.float32))#b2初始化为0
        self.y_=tf.placeholder(tf.float32,[None,self.l_output])#存放真实标记
        self.y=tf.nn.softmax(tf.matmul(self.hidden,self.w2)+self.b2)    #预测标记
        #定义损失函数和优化策略
        self.cost=tf.reduce_mean(tf.reduce_sum(-self.y_*tf.log(self.y),reduction_indices=[1]))#交叉信息熵
        self.optimi=self.optimizer(0.3).minimize(self.cost)#Adagrad优化函数,初始学习率为0.3
        init=tf.global_variables_initializer()
        self.sess=tf.InteractiveSession()
        self.sess.run(init)

    def part_fit(self,X,Y,keep_prob):
        '''
        训练使用
        :param X: 输入数据
        :param Y: 真实标签
        :param keep_prob: Dropout留下数据比例
        :return:cost
        '''
        cost,opt=self.sess.run((self.cost,self.optimi),feed_dict={self.x:X,self.y_:Y,self.keep_prob:keep_prob})
        return cost

    def accuracy_test(self,X,Y,keep_prob):
        '''
        输出识别精度
        :param X: 输入数据
        :param Y: 真实标签
        :param keep_prob: Dropout留下数据比例,测试时请设为1
        :return:识别精度
        '''
        correct_prediction=tf.equal(tf.argmax(self.y_,1),tf.argmax(self.y,1))
        accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
        accuracy=self.sess.run(accuracy,feed_dict={self.x:X,self.y_:Y, self.keep_prob:keep_prob})
        return accuracy

#读入数据
mnist=input_data.read_data_sets('MNIST_data',one_hot=True)
#训练数据
nn=NN(784,300,10)#创建实例
keep_prob=tf.placeholder(tf.float32)
for i in range(3000):
    batch_xs,batch_ys=mnist.train.next_batch(100)
    cost=nn.part_fit(batch_xs,batch_ys,0.75)
    if i%100==0:
        accuracy=nn.accuracy_test(mnist.test.images,mnist.test.labels, 1.0)
        print("cost=","{:.4f}".format(cost))
        print("accuracy=","{:.4f}".format(accuracy))

4 实验结果

cost= 2.3026  accuracy= 0.1551
cost= 0.3391  accuracy= 0.9221
cost= 0.2836  accuracy= 0.9343
cost= 0.1652  accuracy= 0.9555
cost= 0.0984  accuracy= 0.9579
cost= 0.0788  accuracy= 0.9607
cost= 0.0292  accuracy= 0.9643
cost= 0.0789  accuracy= 0.9691
cost= 0.0817  accuracy= 0.9703
cost= 0.0987  accuracy= 0.9694
cost= 0.0985  accuracy= 0.9683
cost= 0.0621  accuracy= 0.9725
cost= 0.0270  accuracy= 0.9735
cost= 0.1084  accuracy= 0.9731
cost= 0.0520  accuracy= 0.9740
cost= 0.2447  accuracy= 0.9746
cost= 0.1029  accuracy= 0.9745
cost= 0.0313  accuracy= 0.9760
cost= 0.0460  accuracy= 0.9759
cost= 0.1547  accuracy= 0.9775
cost= 0.1251  accuracy= 0.9726
cost= 0.0792  accuracy= 0.9754
cost= 0.0183  accuracy= 0.9785
cost= 0.0313  accuracy= 0.9771
cost= 0.0780  accuracy= 0.9783
cost= 0.0567  accuracy= 0.9789
cost= 0.0100  accuracy= 0.9783
cost= 0.1010  accuracy= 0.9760
cost= 0.0502  accuracy= 0.9777
cost= 0.0395  accuracy= 0.9788

5 源码下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勤劳的凌菲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值