网站备案服务商查询,苏州seo外包,长沙网站建设服务商,西宁专业网站制作公司一.概述 在文章【机器学习】一个例子带你了解神经网络是什么中#xff0c;我们大致了解神经网络的正向信息传导、反向传导以及学习过程的大致流程#xff0c;现在我们正式开始进行代码的实现#xff0c;首先我们来实现第一步的运算过程模拟讲解#xff1a;正向传导。本次代…一.概述 在文章【机器学习】一个例子带你了解神经网络是什么中我们大致了解神经网络的正向信息传导、反向传导以及学习过程的大致流程现在我们正式开始进行代码的实现首先我们来实现第一步的运算过程模拟讲解正向传导。本次代码实现将以“手写数字识别”为例子。
二.测试训练数据集的获取 首先我们需要通过官网获取到手写数字识别数据集数据集一共分为四个部分分别是训练集的图片六万张、训练集的标签、测试集的图片一万张以及测试集的标签。所以我们在代码中可以使用键值表示对应的key-value
url_base http://yann.lecun.com/exdb/mnist/
key_file {train_img:train-images-idx3-ubyte.gz,train_label:train-labels-idx1-ubyte.gz,test_img:t10k-images-idx3-ubyte.gz,test_label:t10k-labels-idx1-ubyte.gz
} 同时我们需要将下载的文件保存到与代码同一级目录下
dataset_dir os.path.dirname(os.path.abspath(__file__)) 下载部分十分简单么就不在此赘述需要注意的是代码使用了python的urlretrieve函数该函数需要使用头文件urllib.request需要自行下载
def download_mnist():for filename in key_file.values():file_path dataset_dir / filenameif os.path.exists(file_path):returnprint(Downloading filename ... )urllib.request.urlretrieve(url_base filename, file_path)print(Done)
三.测试训练数据集的加载 下载完数据集后我们需要将其加载到我们的程序中以供后续的使用首先是判断一下我们是否已经下载过数据集如果没有下载则先进行下载操作再执行其他步骤 if not os.path.exists(save_file) :download_mnist()dataset _convert_numpy()print(Creating pickle file ...)with open(save_file, wb) as f:pickle.dump(dataset, f, -1)print(Done!) 以上代码有个需要注意的地方因为下载完数据集之后无法直接给到python使用所以还需要对数据进行格式处理处理成python可以识别的格式这一步交由函数_convert_numpy实现
def _convert_numpy(): dataset {}dataset[train_img] _load_img(key_file[train_img])dataset[train_label] _load_label(key_file[train_label])dataset[test_img] _load_img(key_file[test_img])dataset[test_label] _load_label(key_file[test_label])return dataset 其中_load_img函数负责处理图片数据
def _load_img(file_name):file_path dataset_dir \\MNIST\\ file_nameprint(Converting file_name to NumPy Array ...)with gzip.open(file_path, rb) as f:data np.frombuffer(f.read(), np.uint8, offset16)data data.reshape(-1, img_size)print(Done)return data 其中_load_label函数负责处理标签数据
def _load_label(file_name):file_path dataset_dir \\MNIST\\ file_nameprint(Converting file_name to NumPy Array ...)with gzip.open(file_path, rb) as f:labels np.frombuffer(f.read(), np.uint8, offset8)print(Done)return labels 函数中使用到的都是一些python常用的函数所以具体作用不在赘述可自行查询。介绍完_convert_numpy函数我们继续回到数据集加载函数本身为了方便后续数据集的批量调用等操作我们需要在加载数据后对其进行进一步的数据清洗整理等预处理分别为数据归一化normalize、图像展开flatten以及图像标签对应(one_hot_label)先将三个功能代码贴上然后我们再详细讲解各个功能的具体作用 with open(save_file,rb) as f:dataset pickle.load(f)if normalize:for key in [train_img,test_img]:dataset[key] dataset[key].astype(np.float32)if not flatten:for key in (train_img, test_img):dataset[key] dataset[key].reshape(-1, 1, 28, 28)if one_hot_label:dataset[train_label] _change_one_hot_label(dataset[train_label])dataset[test_label] _change_one_hot_label(dataset[test_label])
3.1.数据归一化normalize 数据归一化normalize如果设置为True可以将输入图像归一化为0.01.0 的值。如果将该参数设置为False则输入图像的像素会保持原来的0255。函数实现是使用了python函数中的astype功能将数据用于将数据集指定字段的数据转换为 float32 类型常见于深度学习模型输入前的数据预处理。
dataset[key] dataset[key].astype(np.float32)
3.2.图像展开flatten 图像展开flatten用于设置是否展开输入图像使其变成一维数组。如果将该参数设置为False则输入图像为1 × 28 × 28 的三维数组若设置为True则输入图像会保存为由784 个元素构成的一维数组。函数实现也只是使用到深度学习中常用的reshape函数 dataset[key] dataset[key].reshape(-1, 1, 28, 28)
3.3.图像标签对应(one_hot_label) 图像标签对应one_hot_label用于设置是否将标签保存为onehot表示one-hot representation。one-hot 表示是仅正确解标签为1其余皆为0 的数组就像[0,0,1,0,0,0,0,0,0,0]这样。当one_hot_label为False时就是像7、2这样简单保存正确解标签函数_change_one_hot_label的实现如下
def _change_one_hot_label(X):T np.zeros((X.size, 10))for idx, row in enumerate(T):row[X[idx]] 1return T 以上即为测试训练数据集加载函数的全部内容我们将在下面正式调用一下看看是否能够正常工作在此贴上函数全文
ef load_mnist(normalizeTrue, flattenTrue, one_hot_labelFalse):if not os.path.exists(save_file) :download_mnist()dataset _convert_numpy()print(Creating pickle file ...)with open(save_file, wb) as f:pickle.dump(dataset, f, -1)print(Done!)with open(save_file,rb) as f:dataset pickle.load(f)if normalize:for key in [train_img,test_img]:dataset[key] dataset[key].astype(np.float32)if not flatten:for key in (train_img, test_img):dataset[key] dataset[key].reshape(-1, 1, 28, 28)if one_hot_label:dataset[train_label] _change_one_hot_label(dataset[train_label])dataset[test_label] _change_one_hot_label(dataset[test_label])return (dataset[train_img],dataset[train_label]),(dataset[test_img],dataset[test_label])
四.测试训练数据集的使用测试 我们可以加载数据集并且查看到各个数据集的形状
(x_train, t_train), (x_test, t_test) load_mnist(flattenTrue,normalizeFalse)
# 输出各个数据的形状
print(x_train.shape) # (60000, 784)
print(t_train.shape) # (60000,)
print(x_test.shape) # (10000, 784)
print(t_test.shape) # (10000,) 根据输出我们可以看到训练集图片有六万张每张图片有784各像素28*28训练集标签和照片数量一样那是肯定的测试集图片和标签数量比训练集的少主要用来验证模型学习后的正确性。 我们甚至还能随机从数据集中抽取一张照片查看一下实际样子具体实现如下
def img_show(img):
pil_img Image.fromarray(np.uint8(img))
pil_img.show()
(x_train, t_train), (x_test, t_test) load_mnist(flattenTrue,normalizeFalse)
img x_train[0]
label t_train[0]
print(label) # 5
print(img.shape) # (784,)
img img.reshape(28, 28) # 把图像的形状变成原来的尺寸
print(img.shape) # (28, 28)
img_show(img) 输出的图片如图下所示 在后面的文章中我们将开始正式步入主题讲解神经网络如何学习各层次之间如何传递数值如何反向传导计算损失又在重新学习最终实现传入一张手写数字就能自动识别出具体的数字的。