卷积神经网络CNN手写数字识别案例

目录

网络设计

设计两个卷积大层

具体参数

代码:

结果:


网络设计

设计两个卷积大层

手写数字识别数据集下载:

链接:https://pan.baidu.com/s/1nqhP4yPNcqefKYs91jp9ng?pwd=xe1h

提取码:xe1h

我们知道mnist图像数据【None,784】28*28

具体参数

第一层

卷积:32个filter、大小5*5、strides = 1、padding = "SAME"

tf.nn.conv2d(input,filter,strides=,padding=)

input:输入图像None,28,28,1

要求:形状batch,heigth,width,channel

类型为float32,64

filter:

weights = tf.Variable(initial_value=tf.random_normal(shape=5,5,1,32))

bias = tf.Variable(initial value=tf.random normal(shape=32))

变量initial value=random normal(shape=F,F,3/1,K)

strides: 步长 1 1,1,1,1

padding: "SAME"

"SAME":越过边缘取样

"VALID":不越过边缘取样

输出形状:None,28,28,32 ----通道数变为32

激活:Relu 上层结果直接输入进来

tf.nn.relu(fetures)

池化:

输入形状:None,28,28,32

大小2*2 、strides2

根据公式计算输出形状:None,14,14,32

第二层

卷积:64个filter、大小5*5、strides = 1、padding = "SAME"

tf.nn.conv2d(input,filter,strides=,padding=)

input:输入图像None,14,14,32

要求:形状batch,heigth,width,channel

类型为float32,64

filter:

weights = tf.Variable(initial_value=tf.random_normal(shape=5,5,32,64))

bias = tf.Variable(initial value=tf.random normal(shape=64))

变量initial value=random normal(shape=F,F,3/1,K)

strides: 步长 1 1,1,1,1

padding: "SAME"

"SAME":越过边缘取样

"VALID":不越过边缘取样

输出形状:None,14,14,64 ----通道数变为64

激活:Relu

tf.nn.relu(fetures)

池化:输入None,14,14,64

大小2*2 、strides2

根据公式计算输出形状:None,7,7,64

全连接层

tf.shape()

None,7,7,64\] ----\>\[None,7\*7\*64

None,7\*7\*64\] \* \[7\*7\*64,10\] = \[None , 10

y_predict = tf.matmulpool2,weights + bias

代码

python 复制代码
import tensorflow as tf
import os
from tensorflow.examples.tutorials.mnist import input_data
tf.compat.v1.disable_eager_execution()

# 1、利用数据,在训练的时候实时提供数据
# mnist手写数字数据在运行时候实时提供给给占位符

tf.compat.v1.app.flags.DEFINE_integer("is_train", 1, "指定是否是训练模型,还是拿数据去预测")
FLAGS = tf.compat.v1.app.flags.FLAGS

def create_weights(shape):

    return tf.Variable(initial_value=tf.compat.v1.random_normal(shape=shape, stddev=0.01))
def create_model(x):
    """
    构建卷积神经网络
    :param x:
    :return:
    """
    # 1)第一个卷积大层
    with tf.compat.v1.variable_scope("conv1"):

        # 卷积层
        # 将x[None, 784]形状进行修改
        input_x = tf.reshape(x, shape=[-1, 28, 28, 1])
        # 定义filter和偏置
        conv1_weights = create_weights(shape=[5, 5, 1, 32])
        conv1_bias = create_weights(shape=[32])
        conv1_x = tf.nn.conv2d(input=input_x, filters=conv1_weights, strides=[1, 1, 1, 1], padding="SAME") + conv1_bias
        
        # 激活层
        relu1_x = tf.nn.relu(conv1_x)

        # 池化层
        pool1_x = tf.nn.max_pool(input=relu1_x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")

    # 2)第二个卷积大层
    with tf.compat.v1.variable_scope("conv2"):

        # 卷积层
        # 定义filter和偏置
        conv2_weights = create_weights(shape=[5, 5, 32, 64])
        conv2_bias = create_weights(shape=[64])
        conv2_x = tf.nn.conv2d(input=pool1_x, filters=conv2_weights, strides=[1, 1, 1, 1], padding="SAME") + conv2_bias

        # 激活层
        relu2_x = tf.nn.relu(conv2_x)

        # 池化层
        pool2_x = tf.nn.max_pool(input=relu2_x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")

    # 3)全连接层
    with tf.compat.v1.variable_scope("full_connection"):
        # [None, 7, 7, 64]->[None, 7 * 7 * 64]
        # [None, 7 * 7 * 64] * [7 * 7 * 64, 10] = [None, 10]
        x_fc = tf.reshape(pool2_x, shape=[-1, 7 * 7 * 64])
        weights_fc = create_weights(shape=[7 * 7 * 64, 10])
        bias_fc = create_weights(shape=[10])
        y_predict = tf.matmul(x_fc, weights_fc) + bias_fc

    return y_predict

def full_connected_mnist():
    """
    单层全连接神经网络识别手写数字图片
    特征值:[None, 784]
    目标值:one_hot编码 [None, 10]
    :return:
    """
    mnist = input_data.read_data_sets("./tmp/mnist_data",one_hot=True)
    # 1、准备数据
    # x [None, 784] y_true [None. 10]
    with tf.compat.v1.variable_scope("mnist_data"):
        x = tf.compat.v1.placeholder(tf.float32, [None, 784])
        y_true = tf.compat.v1.placeholder(tf.int32, [None, 10])
        y_predict = create_model(x)

    # 3、softmax回归以及交叉熵损失计算
    with tf.compat.v1.variable_scope("softmax_crossentropy"):
        # labels:真实值 [None, 10]  one_hot
        # logits:全层的输出[None,10]
        # 返回每个样本的损失组成的列表
        loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y_predict))

    # 4、梯度下降损失优化
    with tf.compat.v1.variable_scope("optimizer"):
        # 学习率
        optimizer = tf.compat.v1.train.AdamOptimizer(0.001).minimize(loss)

    # 5、得出每次训练的准确率(通过真实值和预测值进行位置比较,每个样本都比较)
    with tf.compat.v1.variable_scope("accuracy"):
        equal_list = tf.equal(tf.argmax(y_true, 1), tf.argmax(y_predict, 1))
        accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32))

    # 初始化变量op
    init_op = tf.compat.v1.global_variables_initializer()

    # 开启会话去训练
    with tf.compat.v1.Session() as sess:
        # 初始化变量
        sess.run(init_op)
        if FLAGS.is_train == 1:
            # 循环步数去训练
            for i in range(500):
                # 获取数据,实时提供
                # 每步提供50个样本训练
                mnist_x, mnist_y = mnist.train.next_batch(50)
                # 运行训练op
                _,accuracy_value,loss_value = sess.run([optimizer,accuracy,loss],feed_dict={x: mnist_x, y_true: mnist_y})
                print("训练第%d步的准确率为:%f, 损失为:%f " % (i +1,accuracy_value,loss_value
                                     )
                  )
        else:
            # 如果不是训练,我们就去进行预测测试集数据
            for i in range(100):
                # 每次拿一个样本预测
                mnist_x, mnist_y = mnist.test.next_batch(1)
                print("第%d个样本的真实值为:%d, 模型预测结果为:%d" % (
                                                      i+1,
                                                      tf.argmax(sess.run(y_true, feed_dict={x: mnist_x, y_true: mnist_y}), 1).eval(),
                                                      tf.argmax(sess.run(y_predict, feed_dict={x: mnist_x, y_true: mnist_y}), 1).eval()
                                                      )
                                                      )

    return None


if __name__ == "__main__":
    full_connected_mnist()

结果

相关推荐
燧机科技SuiJi2 小时前
山体坍塌落石滑坡泥石流监测系统 落石泥石流监控摄像机
大数据·人工智能·深度学习·yolo
商业白皮书5 小时前
人形机器人公司打算依托云端 GPU 资源扩充模型训练规模
人工智能·深度学习·机器人
数聚天成DeepSData11 小时前
夜间灯光可以代表经济活动吗?先处理年际一致性
人工智能·深度学习·机器学习·数据集·deepsdata
梦帮科技11 小时前
Linux 内存取证学与 Rootkit 猎杀——Volatility 核心剖析与内核隐藏模块逆向清除
linux·运维·服务器·神经网络·算法·网络安全
高洁0111 小时前
数字孪生、具身智能、世界模型三者交叉
人工智能·python·深度学习·机器学习
Smoothcloud润云12 小时前
PyTorch推理输入长度分桶与Padding优化实战:减少无效计算
人工智能·pytorch·python·深度学习·gpu算力
微三云云仔12 小时前
2026年10月微三云 GEO 优化技术拆解:AI引用机制、结构化部署与服务商评估框架
人工智能·深度学习·geo系统·微三云
禁默14 小时前
论文解读与思考:基于场所地图的标识感知机器人探索方法及工程参考的价值
人工智能·深度学习·算法·机器人
云和数据.ChenGuang14 小时前
Spring AI 入门实战:构建你的第一个 AI 应用
java·人工智能·深度学习·spring·机器学习·语言模型
GPU实战笔记14 小时前
TensorBoard 空面板排查:日志写入、--logdir 与访问入口分层
深度学习·tensorflow·模型训练·tensorboard