LeNet

代码

import tensorflow as tf
import tensorflow.contrib.slim as slim
import config as cfg

class Lenet:
    def __init__(self):
   		# placeholder的作用:创建一个形参,用于定义self.raw_input_image的参数格式,
   		# 但在真正执行self.raw_input_image的时候才会对它赋值,在这里并没有赋值。
   		# [None, 784]表示列式784,行不确定。
        self.raw_input_image = tf.placeholder(tf.float32, [None, 784])
        
        # 在这里-1就是缺省值,就是先满足其它数,到时总数除以其它几个的乘积,这个位置该是几就是几。
        self.input_images = tf.reshape(self.raw_input_image, [-1, 28, 28, 1])
        
        self.raw_input_label = tf.placeholder("float", [None, 10])
        self.input_labels = tf.cast(self.raw_input_label,tf.int32)
        # cfg.KEEP_PROB表示为每个元素被保留的概率,一般在大量数据训练时,为了防止过拟合,添加Dropout层。
        # 设置一个0~1之间的小数表示有多大的概率被保留下来,在这里probability设为0.5
        self.dropout = cfg.KEEP_PROB
		
		# 创建网络
        with tf.variable_scope("Lenet") as scope:
            self.train_digits = self.construct_net(True)
            scope.reuse_variables()
            self.pred_digits = self.construct_net(False)
		
		# 返回每一行的最大值
        self.prediction = tf.argmax(self.pred_digits, 1)
        
        # 统计预测的和真实值之间的差异,然后把bool value转化成01,最后计算正确率
        self.correct_prediction = tf.equal(tf.argmax(self.pred_digits, 1), tf.argmax(self.input_labels, 1))
        self.train_accuracy = tf.reduce_mean(tf.cast(self.correct_prediction, "float"))
		
		# 在这里输入的train digits会先经过softmax得到它的predict然后和input_label做corss entropy得到loss
        self.loss = slim.losses.softmax_cross_entropy(self.train_digits, self.input_labels)
        self.lr = cfg.LEARNING_RATE
        # 用Adam优化器对loss进行梯度下降的优化
        self.train_op = tf.train.AdamOptimizer(self.lr).minimize(self.loss)



    def construct_net(self,is_trained = True):
    	"""
    	lim.arg_scope:常用于为tensorflow里的layer函数提供默认值以使构建模型的代码更加紧凑苗条。
    	tf.truncated_normal_initializer:从截断的正态分布中输出随机值,生成服从具有指定标准偏差的正态分布的值
    	slim.l2_regularizer:对权重应用L2正则化,较小的L2值有助于防止训练数据过度拟合。
    	"""
        with slim.arg_scope([slim.conv2d], padding='VALID',
                            weights_initializer=tf.truncated_normal_initializer(stddev=0.01),
                            weights_regularizer=slim.l2_regularizer(0.0005)):
            net = slim.conv2d(self.input_images,6,[5,5],1,padding='SAME',scope='conv1')
            net = slim.max_pool2d(net, [2, 2], scope='pool2')
            net = slim.conv2d(net,16,[5,5],1,scope='conv3')
            net = slim.max_pool2d(net, [2, 2], scope='pool4')
            net = slim.conv2d(net,120,[5,5],1,scope='conv5')
            net = slim.flatten(net, scope='flat6')
            net = slim.fully_connected(net, 84, scope='fc7')
            net = slim.dropout(net, self.dropout,is_training=is_trained, scope='dropout8')
            digits = slim.fully_connected(net, 10, scope='fc9')
        return digits

LeNet框架

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值