当前位置: 首页 > news >正文

手写数字识别学习记录(自用)

1、在这里插入图片描述

2、
在 input_shape=(2828,) 中,逗号不可以省略。
如果写成 input_shape=(28
28),Python 会把它当作一个普通的整数表达式,最终得到的是一个整数值 784,而不是一个元组。
当元组中只有一个元素时,为了和普通的带括号的表达式区分开来,必须在元素后面加上逗号。

3、
ReLU 激活函数和Softmax 激活函数对比:
ReLU 函数的数学表达式为f(x)=max(0,x) 。优点是计算简单,能够有效缓解梯度消失问题,加快模型的训练速度。

Softmax 函数将输入的数值转换为概率分布,使得所有输出值的和为 1。每个输出值表示样本属于对应类别的概率。在分类问题中,通常使用 Softmax 函数作为输出层的激活函数,以便得到每个类别的预测概率。

4、
正则化的主要作用是防止模型过拟合。L1 正则化会使模型的部分权重变为 0,从而产生稀疏权重矩阵,有助于特征选择。通过设置合适的正则化系数,可以在模型复杂度和泛化能力之间找到一个平衡。

layers.Dropout(0.01) 表示在训练时每个神经元有 1% 的概率被丢弃。Dropout 可以减少神经元之间的共适应,使得模型不会过度依赖某些特定的神经元,从而提高模型的泛化能力。

正则化通过约束参数的大小来控制模型复杂度,而 Dropout 通过随机丢弃神经元来增加模型的鲁棒性。两者结合可以更有效地防止过拟合,提高模型在测试数据上的性能。

它们搭配使用可以进一步增强防止过拟合的效果,但不是必须搭配使用。

5、
在这里插入图片描述

6、
在这里插入图片描述

7、
在这里插入图片描述
在这里插入图片描述

8、全连接神经网络:

from keras.utils import to_categorical #用于将标签(如数字 0-9)转换为 one-hot 编码格式。
from keras import models, layers, regularizers  # Keras的核心模块,用于构建神经网络模型和定义层。
from keras.optimizers import RMSprop #一种优化算法,用于训练神经网络。
from keras.datasets import mnist #Keras 内置的 MNIST 数据集,包含手写数字图片。
import matplotlib.pyplot as plt
from numpy.core.defchararray import translate

# 准备数据集
(train_images,train_labels),(test_images,test_labels)=mnist.load_data()
# print(train_images.shape,test_images.shape) #各个维度的元素个数
# print(train_images.size,test_images.size) #总元素个数
# print(train_images[0])
# print(train_labels[0])
# plt.imshow(train_images[0])
# plt.show()

# 数据格式调整
train_images = train_images.reshape((60000,28*28)).astype('float') #把60000个二维矩阵(28,28)变成一维向量(28*28),同时将int数据格式转为float
test_images = test_images.reshape((10000,28*28)).astype('float')
train_labels = to_categorical(train_labels) #热化编码,print(train_labels[0]),数字5——>[0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]
test_labels = to_categorical(test_labels)

# 搭建神经网络模型
network = models.Sequential() #创建了一个Sequential模型对象,Sequential是Keras中一种简单的模型类型,它允许你按照顺序依次堆叠各个神经网络层,形成一个线性的网络结构。
network.add(layers.Dense(units=128,activation='relu',input_shape=(28*28,),
                         kernel_regularizer=regularizers.l1(0.0001))) #添加了一个全连接层(密集层,Dense),units=15:该层神经元数量为 15,activation='relu':激活函数为 ReLU,并指定 L1 正则化(正则化系数为 0.0001)
network.add(layers.Dropout(0.01))
network.add(layers.Dense(units=32,activation='relu',
            kernel_regularizer=regularizers.l1(0.0001)))
network.add(layers.Dropout(0.01))
network.add(layers.Dense(units=10,activation='softmax'))
# 构建了一个简单的两层全连接神经网络,输入层接收长度为 784 的一维向量,
# 经过一个包含 15 个神经元的隐藏层(使用 ReLU 激活函数),
# 最后通过一个包含 10 个神经元的输出层(使用 Softmax 激活函数)输出 10 个类别的预测概率。
# 这个模型可以用于解决一些简单的分类问题,如手写数字识别。

print(network.summary()) #打印模型的结构摘要

# 配置并开始训练
network.compile(optimizer=RMSprop(lr=0.001),loss='categorical_crossentropy',metrics=['accuracy']) # compile方法用于配置模型的训练过程,包括优化器、损失函数和评估指标
network.fit(train_images,train_labels,epochs=20,batch_size=128,verbose=2)

# 测试模型性能
y_pre = network.predict(test_images[:5]) #对测试集的前5个样本进行预测,y_pre的其中一个元素:[0.01, 0.02, 0.90, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01]
print(y_pre,test_labels[:5])
test_loss,test_accuracy = network.evaluate(test_images,test_labels) #评估模型在测试集上的性能
print("test_loss:",test_loss,"   test_accuraccy:",test_accuracy) #test_accuraccy: 0.9729999899864197

卷积神经网络:

from keras.utils import to_categorical
from keras import models, layers
from keras.optimizers import RMSprop
from keras.datasets import mnist

# 准备数据集
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

# 搭建LeNet网络
def LeNet():
    network = models.Sequential()
    network.add(layers.Conv2D(filters=6, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1)))
    network.add(layers.AveragePooling2D((2, 2)))
    network.add(layers.Conv2D(filters=16, kernel_size=(3, 3), activation='relu'))
    network.add(layers.AveragePooling2D((2, 2)))
    network.add(layers.Conv2D(filters=120, kernel_size=(3, 3), activation='relu'))
    network.add(layers.Flatten())
    network.add(layers.Dense(84, activation='relu'))
    network.add(layers.Dense(10, activation='softmax'))
    return network

network = LeNet()
network.compile(optimizer=RMSprop(lr=0.001), loss='categorical_crossentropy', metrics=['accuracy'])

train_images = train_images.reshape((60000, 28, 28, 1)).astype('float') / 255
test_images = test_images.reshape((10000, 28, 28, 1)).astype('float') / 255
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)

# 训练网络,用fit函数,epochs表示训练多少个回合,batch_size表示每次训练给多大的数据
network.fit(train_images, train_labels, epochs=10, batch_size=128, verbose=2)
test_loss, test_accuracy = network.evaluate(test_images, test_labels)
print("test_loss:", test_loss, " test_accuracy:", test_accuracy) #test_accuracy: 0.9886999726295471

相关文章:

  • 在nodejs中使用RabbitMQ(二)发布订阅
  • Python实现文件夹监控:自动捕获并处理新增Excel文件,支持子文件夹遍历
  • AI赋能铁道安全巡检探索智能巡检新时代,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建铁路轨道场景下轨道上人员行为异常检测预警系统
  • 高中物理-基础知识1
  • 【3.Git与Github的历史和区别】
  • Spring Boot 原理分析
  • 打靶记录29——dawn
  • 红队视角出发的k8s敏感信息收集——持久化存储与数据泄露
  • 达梦:跟踪日志诊断
  • 备战蓝桥杯 Day2 枚举 Day3 进制转换
  • 2024 StoryDiffusion 文字/文字+图像----->视频
  • 系统不是基于UEFI的win11,硬盘格式MBR,我如何更改为GPT模式添加UEFI启动?
  • 【C++】RBTree(红黑树)模拟实现
  • 【第4章:循环神经网络(RNN)与长短时记忆网络(LSTM)— 4.4 文本分类与情感分析】
  • 【VB语言】EXCEL中VB宏的应用
  • vscode怎么更新github代码
  • 怎么理解 Spring Boot 的约定优于配置 ?
  • pg_sql关于时间的函数
  • npm运行Vue项目报错 error:0308010c:digital envelope routines::unsupported
  • 新用户冷启动阶段使用的推荐算法策略
  • 专家:家长要以身作则,孩子是模仿者学习者有时也是评判者
  • 第一集|好饭不怕晚,折腰若如初见
  • 上海制造佳品汇大阪站即将启幕,泡泡玛特领潮出海
  • 全国人大常委会今年将初次审议检察公益诉讼法
  • 国台办:民进党当局刻意刁难大陆配偶,这是不折不扣的政治迫害
  • 美国务卿鲁比奥将前往土耳其参加俄乌会谈