• Keras实战(一)


    什么是感受野

    局部感受野(Local Receptive Field)是指在神经网络中,每个神经元只与输入图像的一小部分区域相连,这个区域就称为局部感受野。
    简单来说,局部感受野就像是我们看待事物时的一个小窗口,我们只能通过这个小窗口看到一部分场景,而不能看到整个场景。同样,在神经网络中,每个神经元也只能处理输入图像的一小部分信息,而不能处理整个图像的信息。
    举一个例子,假设我们有一个包含许多像素点的图像,每个像素点都可以表示为红、绿、蓝三种颜色的组合。现在有一个神经元,它只能处理三个像素点,即它的局部感受野只包含这三个像素点。当我们输入一张图像时,只有这三个像素点会传递给这个神经元进行处理,而其他像素点则不会对这个神经元的输出产生影响。
    通过将输入图像划分成许多小的区域,并将每个神经元与这些小的区域相连,可以使得神经网络能够更好地理解和处理图像中的局部特征,从而提高图像分类、目标检测等任务的准确性。

    keras minst

    from keras.models import Sequential
    from keras.layers.core import Dense, Activation, Dropout
    from keras.optimizers import SGD, RMSprop, Adam
    import numpy as np
    from keras.datasets import mnist
    from keras.utils import np_utils  # todo: 用于处理numpy的工具函数
    from keras import regularizers  # todo: 正则化
    
    # todo:手写识别
    
    # todo:重复性设置-作用是可以每次复现实验结果
    np.random.seed(1671)
    
    # todo:网络和训练
    NB_EPOCH = 20  # todo:200次迭代-200次重复训练
    BATCH_SIZE = 128  # todo: 指的是一次性处理数据的数量,批数
    NB_CLASSSE = 10  # todo: 代表输出结果的种类数量
    OPTIMIZER = SGD()  # todo: 优化器,随机梯度下降
    OPTIMIZER2 = RMSprop()  # todo: 优化器2
    OPTIMIZER3 = Adam()  # todo: 优化器3
    N_HIDDEN = 128  # todo: 隐藏层中神经元的个数
    VALIDATION_SPLIT = 0.2  # todo:训练集中用作验证集的比例
    VERBOSE = 1  # todo: 是否打印日志,每一个epoch以进度条等信息展示
    DROPOUT = 0.3  # todo: 随机杀死30%的神经元
    # todo: 读取数据
    # todo:(X_train, y_train)是训练数据,其中X_train是训练图像,y_train是训练标签。
    (x_train, y_train), (x_test, y_test) = mnist.load_data()
    # todo:X_train 是 60 000 行 28×28 的数据,变形为 60000×784
    RESHAPE = 784
    # todo: 数据
    x_train = x_train.reshape(60000, RESHAPE)
    x_test = x_test.reshape(10000, RESHAPE)
    # todo: 标签 NumPy库将X_train的数据类型转换为'float32'
    x_train = x_train.astype('float32')
    x_test = x_test.astype('float32')
    # todo: 像素值从0到255的范围缩放到0到1之间,以便于数学运算和优化
    x_train = x_train / 255
    x_test = x_test / 255
    # todo:X_test.shape[0]返回的是X_test数组的第一维的大小,也就是测试样本的数量。
    print(x_train.shape[0], 'train samples')
    print(x_test.shape[0], 'test samples')
    # todo:这行代码是在Python中使用Keras库中的np_utils.to_categorical函数,
    #  将y_train中的整数标签转换为二进制类别矩阵。NB_CLASSES是分类的数量,
    #  也就是你的任务中有多少不同的标签。对于每一个样本,
    #  该函数会创建一个长度为NB_CLASSES的二进制向量,对应标签的位置为1,其他位置为0。
    #  这种格式对于多分类问题是非常有用的,因为它允许我们使用像softmax这样的函数来计算每个类别的概率。
    y_train = np_utils.to_categorical(y_train, NB_CLASSSE)
    y_test = np_utils.to_categorical(y_test, NB_CLASSSE)
    # todo:定义模型-正则化层通常应用在卷积层或全连接层之后,在激活函数层之前
    model = Sequential()
    model.add(Dense(N_HIDDEN, kernel_regularizer=regularizers.l2(0.01), input_shape=(RESHAPE,)))
    # todo:添加隐藏层
    model.add(Activation('relu'))
    model.add(Dropout(DROPOUT))
    model.add(Dense(N_HIDDEN))
    model.add(Activation('relu'))
    model.add(Dropout(DROPOUT))
    model.add(Dense(NB_CLASSSE))
    model.add(Activation('softmax'))
    # todo:调用模型(model)的summary方法。这个方法会打印出模型的架构信息,包括每一层的名称、输出形状、参数数量等。
    model.summary()
    # todo:模型的编译 损失函数,优化器 评估指标 metrics=['accuracy']则设置评估模型性能的标准,这里使用准确率。
    model.compile(loss='categorical_crossentropy', optimizer=OPTIMIZER3, metrics=['accuracy'])
    # todo: 模型编译好之后就是训练 fit()
    history = model.fit(x_train, y_train, batch_size=BATCH_SIZE, epochs=NB_EPOCH, verbose=VERBOSE,
                        validation_split=VALIDATION_SPLIT)
    # todo: 测试
    score = model.evaluate(x_test, y_test, verbose=VERBOSE)
    print('Test Score:', score[0])  # todo: 损失值loss
    print('Test accuracy:', score[1])  # todo: 准确率acc
    
    # todo: 保存模型
    model.save('my_model.h5')
    # 加载模型
    # model = load_model('my_model.h5')
    # todo;200 epoch
    # todo: 未加隐藏层之前是92.30%
    # todo: 加隐藏层之后是97.6%
    # todo: 加Dropout之后是97.7%
    # todo: 更换优化器2之后是97.6%
    # todo: 更换优化器3之后是97.9%
    # todo: 加了正则化L2(0.01)之后是97%
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83

    为什么要共享权重与偏执?
    因为卷积核目的是(例如在3x3的感受野)使得在中心像素与周围其他像素之间的关联关系上,能够在窗口移动的过程中,保留这种模式规则。
    感受野(卷积核)->产生一个特征图。
    在这里插入图片描述

  • 相关阅读:
    Rust Bevy 实体组件系统
    Python - GFPGAN + MoviePy 提高人物视频画质
    Docker容器技术实战1
    MyBatis
    新建一个Python Jupyter Notebook的运行环境
    Taro React 系列文章 - 总目录
    4.2串的模式匹配(含KMP算法)
    我的DW个人网站设计——安徽宣城6页HTML+CSS+JavaScript
    Java native 关键字
    SOLIDWORKS® 2024 新功能 - 3D CAD
  • 原文地址:https://blog.csdn.net/qq_46073162/article/details/133043138