Keras实战(一)

什么是感受野?

局部感受野(Local Receptive Field)是指在神经网络中,每个神经元只与输入图像的一小部分区域相连,这个区域就称为局部感受野。

简单来说,局部感受野就像是我们看待事物时的一个小窗口,我们只能通过这个小窗口看到一部分场景,而不能看到整个场景。同样,在神经网络中,每个神经元也只能处理输入图像的一小部分信息,而不能处理整个图像的信息。

举一个例子,假设我们有一个包含许多像素点的图像,每个像素点都可以表示为红、绿、蓝三种颜色的组合。现在有一个神经元,它只能处理三个像素点,即它的局部感受野只包含这三个像素点。当我们输入一张图像时,只有这三个像素点会传递给这个神经元进行处理,而其他像素点则不会对这个神经元的输出产生影响。

通过将输入图像划分成许多小的区域,并将每个神经元与这些小的区域相连,可以使得神经网络能够更好地理解和处理图像中的局部特征,从而提高图像分类、目标检测等任务的准确性。

keras minst

python 复制代码
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%

为什么要共享权重与偏执?

因为卷积核目的是(例如在3x3的感受野)使得在中心像素与周围其他像素之间的关联关系上,能够在窗口移动的过程中,保留这种模式规则。

感受野(卷积核)->产生一个特征图。

相关推荐
33三 三like8 小时前
《基于知识图谱和智能推荐的养老志愿服务系统》开发日志
人工智能·知识图谱
芝士爱知识a8 小时前
【工具推荐】2026公考App横向评测:粉笔、华图与智蛙面试App功能对比
人工智能·软件推荐·ai教育·结构化面试·公考app·智蛙面试app·公考上岸
腾讯云开发者9 小时前
港科大熊辉|AI时代的职场新坐标——为什么你应该去“数据稀疏“的地方?
人工智能
工程师老罗9 小时前
YoloV1数据集格式转换,VOC XML→YOLOv1张量
xml·人工智能·yolo
yLDeveloper10 小时前
从模型评估、梯度难题到科学初始化:一步步解析深度学习的训练问题
深度学习
Coder_Boy_10 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
啊森要自信10 小时前
CANN ops-cv:面向计算机视觉的 AI 硬件端高效算子库核心架构与开发逻辑
人工智能·计算机视觉·架构·cann
2401_8362358610 小时前
中安未来SDK15:以AI之眼,解锁企业档案的数字化基因
人工智能·科技·深度学习·ocr·生活
njsgcs10 小时前
llm使用 AgentScope-Tuner 通过 RL 训练 FrozenLake 智能体
人工智能·深度学习