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%

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

你可能感兴趣的:(keras,人工智能,深度学习)