《基于Tensorflow的知识图谱实战》 --- 使用ResNet对CIFAR100数据集进行分类

⚽开发平台:jupyter lab

🎈运行环境:python3、TensorFlow2.x

1. 背景介绍

1.1ResNet的出现

(1) 卷积神经网络(VGG)存在的问题:根据实验发现,随着卷积神经网络层数的加深,会出现另一个问题,即在训练集上准确率难以达到100%正确,甚至产生了下降(并不能强行解释为“过拟合”,这个问题被称为“神经网络退化”)。
(2) 神经网络退化问题说明:卷积神经网络不能够被简单的使用对基层书的方法进行优化!
-------------------------------分割-------------------------------
(3) ResNet的出现:彻底改变了VGG系列所带来的的固定思维,提出了采用模块化的思想来代替整体的卷积层,通过一个个模块的堆叠来代替不断增加的卷积层。
(4) ResNet常用于:对象检测、人脸识别。
-------------------------------分割-------------------------------
(5) ResNet通过“直连”和“模块”的方法开创了一个时代,改变了人们仅仅依靠堆积神经网络层来获取更高性能的做法,在一定层度上解决了梯度消失和梯度爆炸的问题。
(6) 当简单的堆积神经网络层的做法失效时,人们开始采用模块化的思想设计网络,同时在不断“加宽”模块的内部通道。

1.2 CIFAR-10、CIFAR-100数据集解析和可视化

说明:CIFAR-10、CIFAR-100是两个常用的图像分类数据集。
(1)原因:因为其经常被使用,很多库都有该数据集的加载方法,一般直接调用即可直接构造训练、测试数据集。
(2)问题:然而,这两个数据集到底长什么样子,我们如何用自己的方法把它提取出来呢?
(3)该文章目的:今天,就尝试用我们自定义的方法来提取数据集中的图片、标签、文件名等信息,并进行一个可视化。
链接: CIFAR-10、CIFAR-100数据集解析和可视化

2.数据读取(CIFAR-10为例)

2.1 CIFAR-10-python结构目录图

说明:
(1)data_batch_1 ~ data_batch_5是划分好的训练数据,每个数据里有10000幅图片。
(2)test_batch是测试集数据,也包含10000幅图片。

 CIFAR-10-python

2.2 显示数据

import pickle  ## 因为这几个文件是通过pickle产生的,所以在读取时也许用到这个包
filename = './datasets/cifar-10-python/cifar-10-batches-py/test_batch'
with open(filename,'rb') as f:
    dataset = pickle.load(f, encoding='bytes')
    print(type(dataset))  ## out:<class 'dict'>

print(dataset.keys())
# out: dict_keys([b'batch_label', b'labels', b'data', b'filenames'])
** 参数说明:
*** dict_keys([b'batch_label', b'labels', b'data', b'filenames'])

1.batch_label:对应的值是一个字符串,用来表明当前文件的一些基本信息。
2.labels:对应的值是一个长度为10000的列表,每个数字取值范围0~9,代表当前图片所属类别。
3.data:10000*3072的二维数组,每一行代表一幅图片的像素值。
filenames:对应一个长度为10000的列表,依次存储图片文件名。

2.3 读取数据的完整代码

* 步骤:
*** 1.导入所需的工具包
*** 2.获取训练集数据
*** 3.获取测试集数据
*** 4.统一获取训练集数据和测试集数据,并返回
*** 5.主函数调用
*
## 1.导入所需的工具包
import pickle
import numpy as np
import os

## 2.获取训练集数据
def get_cifar100_train_data_and_label(root = ''):
    def load_file(filename):
        with open(filename,'rb') as fo:
            data = pickle.load(fo,encoding='latin1')
            return data
    data_batch_1 = load_file(os.path.join(root,'data_batch_1'))
    data_batch_2 = load_file(os.path.join(root,'data_batch_2'))
    data_batch_3 = load_file(os.path.join(root,'data_batch_3'))
    data_batch_4 = load_file(os.path.join(root,'data_batch_4'))
    data_batch_5 = load_file(os.path.join(root,'data_batch_5'))
    dataset = []
    labelset = []
    for data in [data_batch_1,data_batch_2,data_batch_3,data_batch_4,data_batch_5]:
        img_data = (data['data'])
        img_label = (data['labels'])
        dataset.append(img_data)
        labelset.append(img_label)
    ## np.concatenate()是numpy中对array进行拼接的函数
    dataset = np.concatenate(dataset)
    labelset = np.concatenate(labelset)
    return dataset,labelset

## 3.获取测试集数据
def get_cifar100_test_data_and_label(root = ''):
    def load_file(filename):
        with open(filename,'rb') as fo:
            data = pickle.load(fo,encoding='latin1')
            return data
    data_batch_1 = load_file(os.path.join(root,'test_batch'))
    dataset = []
    labelset = []
    for data in [data_batch_1]:
        img_data = (data['data'])
        img_label = (data['labels'])
        dataset.append(img_data)
        labelset.append(img_label)
    dataset = np.concatenate(dataset)
    labelset = np.concatenate(labelset)
    return dataset,labelset

## 4.统一获取训练集数据和测试集数据,并返回
def get_CIFAR100_dataset(root = ''):
    train_dataset,label_dataset = get_cifar100_train_data_and_label(root = root)
    test_dataset,test_label_dataset = get_cifar100_test_data_and_label(root = root)
    return train_dataset,label_dataset,test_dataset,test_label_dataset

## 5.主函数
train_dataset,label_dataset,test_dataset,test_label_dataset = get_CIFAR100_dataset(root='./datasets/cifar-10-python/cifar-10-batches-py/')
** out:
(array([[ 59,  43,  50, ..., 140,  84,  72],
        [154, 126, 105, ..., 139, 142, 144],
        [255, 253, 253, ...,  83,  83,  84],
        ...,
        [ 35,  40,  42, ...,  77,  66,  50],
        [189, 186, 185, ..., 169, 171, 171],
        [229, 236, 234, ..., 173, 162, 161]], dtype=uint8),
 array([6, 9, 9, ..., 9, 1, 1]),
 array([[158, 159, 165, ..., 124, 129, 110],
        [235, 231, 232, ..., 178, 191, 199],
        [158, 158, 139, ...,   8,   3,   7],
        ...,
        [ 20,  19,  15, ...,  50,  53,  47],
        [ 25,  15,  23, ...,  80,  81,  80],
        [ 73,  98,  99, ...,  94,  58,  26]], dtype=uint8),
 array([3, 8, 8, ..., 5, 1, 7]))

3.使用ResNet对数据集进行分类(以CIFAR-100为例)

3.1 CIFAR-100-python结构目录图

CIFAR-100-python

3.2 定义resnet_Model()函数

  • RstNet结构图:
    RstNet结构图

ResNet完整地实现需要较高性能的显卡,因此这里对其做了修改,去掉了pooling层,并降低了每次filter的数目和每层的层数。

* 步骤:
*** 1.导入所需的工具包
*** 2.定义resnet_model
*** 3.获取测试集数据
*** 4.统一获取训练集数据和测试集数据,并返回
*** 5.主函数调用
*
### 定义resnet_model
def identity_block(input_tensor,out_dim):
	## conv1:为最上层。是模型的输入层,定义了输入的维度,此处:卷积核[7,7],步进[2,2],作为第一层。
	### out_dim//4 确保为整数。
    conv1 = tf.keras.layers.Conv2D(out_dim//4,kernel_size = 1,padding = 'SAME',activation=tf.nn.relu)(input_tensor)
    conv2 = tf.keras.layers.BatchNormalization()(conv1)
    conv3 = tf.keras.layers.Conv2D(out_dim//4,kernel_size=3,padding='SAME',activation=tf.nn.relu)(conv2)
    conv4 = tf.keras.layers.BatchNormalization()(conv3)
    conv5 = tf.keras.layers.Conv2D(out_dim,kernel_size=1,padding='SAME')(conv4)
    out = tf.keras.layers.Add()([input_tensor,conv5])
    out = tf.nn.relu(out)
    return out
    
def resnet_Model(n_dim = 10):
    input_xs = tf.keras.Input(shape = [32,32,3])
    conv_1 = tf.keras.layers.Conv2D(filters = 64,kernel_size = 3,padding='SAME',activation=tf.nn.relu)(input_xs)
    
    ##[3,4,4,6]
    ##第一层
    out_dim = 64
    identity_1 = tf.keras.layers.Conv2D(filters = out_dim,kernel_size=3,padding='SAME',activation=tf.nn.relu)(conv_1)
    identity_1 = tf.keras.layers.</
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值