LeNet_5(Tensorflow实现)

github博客传送门
博客园传送门

本章所需知识:

  1. 没有基础的请观看深度学习系列视频
  2. tensorflow

资料下载链接:

后面上传

恩达老师的可视化极强的网络结构图:

LeNet_5网络结构图

接着加上我自己使用Tensorflow实现的代码:

LeNet_5网络

import tensorflow as tf
import tensorflow.examples.tutorials.mnist.input_data as input_data

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)  # 导入数据集

'''LeNet_5, 可以识别图片中的手写数字, 针对灰度图像训练的'''
class LeNet_5:
    def __init__(self):
        self.in_x = tf.placeholder(dtype=tf.float32, shape=[None, 28, 28, 1], name="in_x")
        self.in_y = tf.placeholder(dtype=tf.float32, shape=[None, 10], name="in_y")

        # 卷积层 (batch, 28, 28, 1) -> (batch, 24, 24, 6)
        self.conv1 = tf.layers.Conv2D(filters=6, kernel_size=5, strides=(1, 1),
                                      kernel_initializer=tf.truncated_normal_initializer(stddev=tf.sqrt(1 / 6)))
        # 池化层 (batch, 24, 24, 6) -> (batch, 12, 12, 6)
        self.pool1 = tf.layers.AveragePooling2D(pool_size=(2, 2), strides=(2, 2))
        # 卷积层 (batch, 12, 12, 6) -> (batch, 8, 8, 16)
        self.conv2 = tf.layers.Conv2D(filters=16, kernel_size=5, strides=(1, 1),
                                      kernel_initializer=tf.truncated_normal_initializer(stddev=tf.sqrt(1 / 16)))
        # 池化层 (batch, 8, 8, 16) -> (batch, 4, 4, 16)
        self.pool2 = tf.layers.AveragePooling2D(pool_size=(2, 2), strides=(2, 2))
        # 全链接层 (batch, 4*4*16(256)) -> (batch, 120)
        self.fc1 = tf.layers.Dense(120, kernel_initializer=tf.truncated_normal_initializer(stddev=tf.sqrt(1 / 120)))
        # 全链接层 (batch, 120) -> (batch, 10)
        self.fc2 = tf.layers.Dense(10, kernel_initializer=tf.truncated_normal_initializer(stddev=tf.sqrt(1 / 10)))

    def forward(self):  # 因为是还原LeNet5 所以使用sigmoid
        self.conv1_out = tf.nn.sigmoid(self.conv1(self.in_x))  # 将图片传入 conv1
        self.pool1_out = self.pool1(self.conv1_out)  # 将 conv1 的输出传入 pool1
        self.conv2_out = tf.nn.sigmoid(self.conv2(self.pool1_out))  # 将 pool1 的输出传入 conv2
        self.pool2_out = self.pool2(self.conv2_out)  # 将 conv2 的输出传入 pool2
        self.flat = tf.reshape(self.pool2_out, shape=[-1, 256])  # 将 pool2 的输出reshape成 (batch, -1(-1指这里的256,具体看计算出的图大小))
        self.fc1_out = tf.nn.sigmoid(self.fc1(self.flat))  # 将 reshape 后的图传入 fc1
        self.fc2_out = tf.nn.softmax(self.fc2(self.fc1_out))  # 将 fc1 的输出传入 fc2

    def backward(self):  # 后向计算
        self.loss = tf.reduce_mean((self.fc2_out - self.in_y) ** 2)  # 均方差计算损失
        self.opt = tf.train.AdamOptimizer().minimize(self.loss)  # 使用Adam优化器优化损失

    def acc(self):  # 精度计算(可不写, 不影响网络使用)
        self.acc1 = tf.equal(tf.argmax(self.fc2_out, 1), tf.argmax(self.in_y, 1))
        self.accaracy = tf.reduce_mean(tf.cast(self.acc1, dtype=tf.float32))


if __name__ == '__main__':
    net = LeNet_5()  # 创建LeNet_5的对象
    net.forward()  # 执行前向计算
    net.backward()  # 执行后向计算
    net.acc()  # 执行精度计算
    init = tf.global_variables_initializer()  # 初始化所有tensorflow变量
    with tf.Session() as sess:
        sess.run(init)
        for i in range(10000):
            train_x, train_y = mnist.train.next_batch(100)  # 取出mnist训练集的 100 批数据和标签
            train_x_flat = train_x.reshape([-1, 28, 28, 1])  # 将数据整型
            # 将数据传入网络,并得到计算后的精度和损失
            acc, loss, _ = sess.run(fetches=[net.accaracy, net.loss, net.opt],
                                    feed_dict={net.in_x: train_x_flat, net.in_y: train_y})
            if i % 100 == 0:  # 每训练100次打印一次训练集精度和损失
                print("训练集精度:|", acc)
                print("训练集损失:|", loss)
                test_x, test_y = mnist.test.next_batch(100)  # 取出100批测试集数据进行测试
                test_x_flat = test_x.reshape([-1, 28, 28, 1])  # 同上
                # 同上
                test_acc, test_loss = sess.run(fetches=[net.accaracy, net.loss],
                                               feed_dict={net.in_x: test_x_flat, net.in_y: test_y})
                print('----------')
                print("验证集精度:|", test_acc)  # 打印验证集精度
                print("验证集损失:|", test_loss)  # 打印验证集损失
                print('--------------------')

最后附上训练截图:

训练截图

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
LeNet-5神经网络 C源代码,这个写的比较好,可以用gcc编译去跑,结合理论可以对深度学习有更深刻的了解 介绍 根据YANN LECUN的论文《Gradient-based Learning Applied To Document Recognition》设计的LeNet-5神经网络,C语言写成,不依赖任何第三方库。 MNIST手写字符集初代训练识别率97%,多代训练识别率98%。 DEMO main.c文件为MNIST数据集的识别DEMO,直接编译即可运行,训练集60000张,测试集10000张。 项目环境 该项目为VISUAL STUDIO 2015项目,用VISUAL STUDIO 2015 UPDATE1及以上直接打开即可编译。采用ANSI C编写,因此源码无须修改即可在其它平台上编译。 如果因缺少openmp无法编译,请将lenet.c中的#include和#pragma omp parallel for删除掉即可。 API #####批量训练 lenet: LeNet5的权值的指针,LeNet5神经网络的核心 inputs: 要训练的多个图片对应unsigned char二维数组的数组,指向的二维数组的batchSize倍大小内存空间指针。在MNIST测试DEMO中二维数组为28x28,每个二维数组数值分别为对应位置图像像素灰度值 resMat:结果向量矩阵 labels:要训练的多个图片分别对应的标签数组。大小为batchSize batchSize:批量训练输入图像(二维数组)的数量 void TrainBatch(LeNet5 *lenet, image *inputs, const char(*resMat)[OUTPUT],uint8 *labels, int batchSize); #####单个训练 lenet: LeNet5的权值的指针,LeNet5神经网络的核心 input: 要训练的图片对应二维数组 resMat:结果向量矩阵 label: 要训练的图片对应的标签 void Train(LeNet5 *lenet, image input, const char(*resMat)[OUTPUT],uint8 label); #####预测 lenet: LeNet5的权值的指针,LeNet5神经网络的核心 input: 输入的图像的数据 labels: 结果向量矩阵指针 count: 结果向量个数 return 返回值为预测的结果 int Predict(LeNet5 *lenet, image input, const char(*labels)[LAYER6], int count); #####初始化 lenet: LeNet5的权值的指针,LeNet5神经网络的核心

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值