《python深度学习》笔记(四):神经网络示例

下面介绍一个简单神经网络对MNIST数据集的分类问题,其代码实现主要分为5个步骤:

神经网络示例步骤:

  1. 加载数据集:首先加载MNIST数据集,也就是需要输入到神经网络模型中的输入数据。把数据分为训练集和测试集,在训练数据上进行学习,在测试数据上进行测试。
  2. 准备数据:将数据进行预处理,使其变换为神经网络要求的形状,并缩放到所有值都在0~1之间,这样才能让神经网络更好训练数据。这里使用to_categorical()函数(将类别向量转换为二进制矩阵)对标签编码
  3. 构建网络:使用Sequential()函数方法对多个网络层进行线性堆叠,各层之间是依次顺序的线性关系。不同的张量格式与不同的数据类型需要用到不同的层。
  4. 网络编译:添加损失函数、优化器以及在训练和测试过程中需要监控的指标
  5. 训练网络:调用网络的fit()方法,网络开始在训练数据上进行迭代,每次迭代都会计算损失相对于权重的梯度,并相应的更新权重。最后对测试图像和标签进行评估,并输出测试精度。

后面的更复杂的神经网络模型例子也是这几步,其中最重要的是步骤是数据预处理和构建网络。

代码实现:

from keras.datasets import mnist  # 从数据集中导入mnist
from tensorflow.keras.utils import to_categorical
from keras import models
from keras import layers
# 第一步:加载数据集
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
# 把数据分为训练集和测试集。图像被编码为Numpy数组;而标签是数字数组,取值范围为0到9。图像和标签一一对应。
# 某个样本对应的类叫作标签
# 第三步:构建网络模型
network = models.Sequential()  # 线性堆叠,通过堆叠许多层,构建神经网络。它的核心是添加layers层。各层之间是依次顺序的线性关系
network.add(layers.Dense(512, activation='relu', input_shape=(28*28,)))
network.add(layers.Dense(10, activation='softmax'))
# 网络中有两个Dense层,第一层需要接受一个关于输入数据shape的参数.512表示有隐藏层有512个隐藏单元。
# 28*28=784个输入,最后一层有10个输出。
# 编译模型:三个参数
network.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
# 第二步:输入图像数据。图像为Numpy数组。
# 在训练前,我们需要对数据进行预处理,使变成网络模型需要的shape,并缩放到0-1之间
train_images = train_images.reshape((60000, 28*28))
train_images = train_images.astype('float32')/255  # 把整数变成浮点数,再除以255
test_images = test_images.reshape((10000, 28*28))
test_images = test_images.astype('float32')/255  # 把整数变成浮点数,再除以255
# 准备标签。标签为数字数组,对其进行编码,将类别向量转换为二进制矩阵
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
# 第四步:训练网络
network.fit(train_images, train_labels, epochs=3, batch_size=128)  # 训练精度.batch_size是批量尺寸
test_loss, test_acc = network.evaluate(test_images, test_labels)  # 测试精度
print('test_acc:', test_acc)

 

to_categorical()函数对标签编码,也可以用one-hot编码,结果是一样的

import numpy as np
from tensorflow.keras.utils import to_categorical
# one-hot编码,因为不能直接将整数输入神经网络,需要将列表转化为张量


def vectorize_sequences(sequences, dimension=10):  #定义一个向量化函数
    results = np.zeros((len(sequences), dimension))  # 创建一个零矩阵
    for i, sequence in enumerate(sequences):  # 自动将列表中的元素按顺序编号
        results[i, sequence] = 1.
    return results


sequences = [1, 8, 3, 6, 9]
sequences = vectorize_sequences(sequences)
print(sequences)
print('...............................')

#result = to_categorical(sequences)
# 将类别向量(从0到nb_classes的整数向量)映射为二值类别矩阵, 用于应用到以categorical_crossentropy为目标函数的模型中.
#print(result)

 用一张图来加深对神经网络的理解:

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

码字神经元

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

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

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

打赏作者

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

抵扣说明:

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

余额充值