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的感受野)使得在中心像素与周围其他像素之间的关联关系上,能够在窗口移动的过程中,保留这种模式规则。

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

相关推荐
鼠鼠龙年发大财几秒前
【鼠鼠学AI代码合集#7】概率
人工智能
龙的爹23339 分钟前
论文 | Model-tuning Via Prompts Makes NLP Models Adversarially Robust
人工智能·gpt·深度学习·语言模型·自然语言处理·prompt
工业机器视觉设计和实现22 分钟前
cnn突破四(生成卷积核与固定核对比)
人工智能·深度学习·cnn
醒了就刷牙23 分钟前
58 深层循环神经网络_by《李沐:动手学深度学习v2》pytorch版
pytorch·rnn·深度学习
985小水博一枚呀26 分钟前
【对于Python爬虫的理解】数据挖掘、信息聚合、价格监控、新闻爬取等,附代码。
爬虫·python·深度学习·数据挖掘
想要打 Acm 的小周同学呀1 小时前
实现mnist手写数字识别
深度学习·tensorflow·实现mnist手写数字识别
我算是程序猿1 小时前
用AI做电子萌宠,快速涨粉变现
人工智能·stable diffusion·aigc
萱仔学习自我记录1 小时前
微调大语言模型——超详细步骤
人工智能·深度学习·机器学习
湘大小菜鸡2 小时前
NLP进阶(一)
人工智能·自然语言处理
XiaoLiuLB2 小时前
最佳语音识别 Whisper-large-v3-turbo 上线,速度更快(本地安装 )
人工智能·whisper·语音识别