《基于Tensorflow的知识图谱实战》 --- MNIST手写体识别

⚽开发平台:jupyter lab

🎈运行环境:python3、TensorFlow2.x

1.利用keras对FashionMNIST数据集识别

1.1 卷积神经网络原理

(1)从本质上来说:卷积神经网络就是将图像处理中的二维离散卷积运算和神经网络结合。这种卷积运算可以自动提取特征。
(2)卷积神经网络主要用于二维图像的识别。
(3)卷积神经网络包含:一个输入层、一个卷积层、一个输出层。
(4)在使用时,一般会使用多层卷积神经不断的去提取特征,特征越抽象越有利于识别(分类)。
(5)通常神经网络也包含:池化层、全连接层、最后接输出层。

对一幅图片进行卷积神经网络处理的过程,主要包含以下4个步骤:
(1)图像输入:获取图输入的数据图像。
(2)卷积:对图像特征进行提取。
(3)池化:用于缩小在卷积时获取的图像特征。
(4)全连接:用于对图像进行分类。

1.2 重要函数介绍

(1)卷积计算函数 Conv2D()(Conv):

### 这个函数时搭建卷积神经网络最核心的函数之一
tf.keras.layers.Conv2D(self,filters, kernel_size, strides=(1, 1), padding='valid', data_format=None,
    dilation_rate=(1, 1), activation=None, use_bias=True,
    kernel_initializer='glorot_uniform', bias_initializer='zeros',
    kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None,
    kernel_constraint=None, bias_constraint=None, **kwargs
)
### 参数说明:
1filter:卷积和树木,卷积计算时使用的空间维度。

2、kernel_size:为卷积核大小,要求是一个输入向量,具有[filter_height,filter_width,in_channels,out_channels]这样的维度,具体含义[卷积核的高度,卷积核的宽度,图像通道数,卷积核个数]
要求类型与参数input相同。
注意:第三维in_channels就是参数input的第四维。

3、strides:滑动步长,卷积时在图像每一维的步长,这是一个一维的向量。第一位和第四维默认为1,第三维和第四维分别是平行和竖直华兴的步进长度。
默认横纵向滑动步长均为1,(1,1),也可以设置其他步长(纵向步长h,横向步长w).

4、padding:补全方式,padding = "SAME"需全零填充,padding = “VALID” 不需要区分大小写。注意此处不区分大小写。

5、data_format 为输入的数据格式,此处有两个取值,data_format = “channels_first” 或 data_format = "channels_last.输入的数据格式。默认取“channels_last”,即默认输入数据的格式中,通道数为最后一个。当data_format = "channels_first"的时候,输入和输出的shape格式为
(batch_size, channels, height, width)即(图片数量,通道数,长,宽)。

6、dalition_rate 为卷积核的膨胀系数,格式为数组或列表,其作用是将卷积核进行形状膨胀,新的位置用0填充,新卷积核的尺寸和膨胀系数的计算公式如下:原卷积核的尺寸为S ,膨胀系数为k,则膨胀后的卷积核尺寸为size = k×(S-1+17、activation 为激活函数。相当于经过卷积输出后,在经过一次激活函数,常见的激活函数有relu,softmax,selu等。一般使用relu作为激活函数。

(2)池化计算函数 MAxPool2D()(conv):

说明:为了降低计算量,我们尝试利用神经网络的“参数共享”这一特性。为了描述大的图像,一个很自然的想法就是对不同位置的特征进行聚合统计。
好处:特征提取可以计算图像一个区域上的某个特定特征的平均值(或最大值),这些概要统计特征不仅具有低得多的维度(相比使用所有提取得到的特征),还会改善结果(不容易过拟合)。
池化:这种聚合的操作就交池化(pooling),有时候也称为平均池化和最大池化(取决于计算池化的方法)。
池化的作用:能够帮助输入的数据表示近似不变性。
近似不变性:对输入的数据进行少量平移后的输出结果并不会发生改变。

# tf.keras.layers.MaxPool2D()(conv):
class MaxPool2D(Pooling2D):
def __init__(self,pool_size=(2,2),strides= None,
				padding = valid',data_format = None,**kwargs):

## 重要参数说明:
1. pool_size:池化窗口的大小,默认大小一般为[2,2]2. strides:和卷积类似,窗口在每一个维度上滑动的步长,默认大小一般也是[2,2]3. pdding:和卷积类似,可以去‘valid’或者‘same’,返回一个Tensor,类型不变,shape仍然是[batch,height,width,channels]这种形式。

1.3 其他函数

(1)tf.expand_dims()函数

tf.expand_dims(
    input,
    axis=None,
    name=None,
    dim=None
)
## 参数说明:
参数:
1. input是输入张量。
2. axis是指定扩大输入张量形状的维度索引值。
3. dim等同于轴,一般不推荐使用。

## 函数功能:
在给定一个input时,在axis轴处给input增加一个维度。

2. 利用API实现MNIST数据集识别

2.1 程序4.5(完整代码)

## 导入相关工具包
import numpy as np
import tensorflow as tf

## 加载MNIST数据集
mnist = tf.keras.datasets.mnist
(x_train,y_train),(x_test,y_test) = mnist.load_data()
## 训练集数目为60000,测试集数目为10000
### 由于CPU训练较慢,现在取部分数据进行实验,若处理速度较快,可省去该步骤
x_train.shape,y_train.shape,x_test.shape   #((60000, 28, 28), (60000,), (10000, 28, 28))
(x_train,y_train),(x_test,y_test) = (x_train[:600],y_train[:600]),(x_test[:100],y_test[:100])
x_train.shape,y_train.shape,x_test.shape   ## ((600, 28, 28), (600,), (100, 28, 28))
### # 将样本从整数转换为[0,1]区间的浮点数
x_train,x_test = x_train/255.0,x_test/255.0
## 在给定一个input时,在axis轴处给input增加一个维度
x_train = tf.expand_dims(x_train,-1)
### 因为有10个不同的目标值
y_train = np.float32(tf.keras.utils.to_categorical(y_train,num_classes=10))
## 对测试集进行上述操作
x_test = tf.expand_dims(x_test,-1)
y_test = np.float32(tf.keras.utils.to_categorical(y_test,num_classes=10))

## 划分数据集
### 这里是为了shuffle数据,单独定义了每个batch的大小batch_size,这与下方的shuffle对应
batch_size = 128
train_dataset = tf.data.Dataset.from_tensor_slices((x_train,y_train)).batch(batch_size).shuffle(batch_size*10)
test_dataset = tf.data.Dataset.from_tensor_slices((x_test,y_test)).batch(batch_size)   ## 测试集不用打乱

## 定义模型
input_xs = tf.keras.Input([28,28,1])
conv = tf.keras.layers.Conv2D(16,3,padding='SAME',activation=tf.nn.relu)(input_xs)
## BatchNormalization()和MaxPool2D层的目的:使输入数据正则化,最大限度地减少魔性的过拟合和增大模型的泛化能力。
conv = tf.keras.layers.BatchNormalization()(conv)
conv = tf.keras.layers.Conv2D(32,3,padding='SAME',activation=tf.nn.relu)(conv)
conv = tf.keras.layers.MaxPool2D(strides = [1,1])(conv)
conv = tf.keras.layers.Conv2D(64,3,padding='SAME',activation=tf.nn.relu)(conv)
## flat函数:将提取计算后的特征值平整化,之后的两个全连接层起到特征提取和分类的作用,最终作出分类。
flat = tf.keras.layers.Flatten()(conv)
## Dense,两个全连接层,用于对卷积层所提取的特征做最终分类
dense = tf.keras.layers.Dense(128,activation=tf.nn.relu)(flat)
logits = tf.keras.layers.Dense(10,activation=tf.nn.softmax)(dense)
model = tf.keras.Model(inputs = input_xs,outputs = logits)

## 编译模型,并进行训练模型
model.compile(optimizer=tf.optimizers.Adam(0.001),loss=tf.losses.categorical_crossentropy,metrics=['acc'])
hist = model.fit(train_dataset,epochs=10)

## 
model.save('./saver/model.h5')

在这里插入图片描述

### 模型导入
from tensorflow.keras.models import load_model
#导入模型
new_model = tf.keras.models.load_model('./saver/model.h5')
new_model.summary()  ### 与保存数据模型结构一致

在这里插入图片描述

2.2 数据展示

import matplotlib.pyplot as plt
### 精确度变化
plt.plot(range(10),hist.history.get('acc'))

在这里插入图片描述

### 损失度变化
plt.plot(range(10),hist.history.get('loss'))

在这里插入图片描述

2.3 数据预测

### 预测测试集数据
predict_x_test = model.predict(x_test)
### 获取测试集数据的最大可能性数值
predict_answer = np.argmax(predict_x_test,axis = 1)

### 获取其中一个样本,进行预测校对
predict_answer[2]
plt.imshow(x_test[2])

在这里插入图片描述

2.4 模型参数

### 模型参数获取
model.summary()

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值