微信扫一扫打赏支持

Tensorflow2(预课程)---7.6、cifar10分类-层方式-卷积神经网络-Inception10

Tensorflow2(预课程)---7.6、cifar10分类-层方式-卷积神经网络-Inception10

一、总结

一句话总结:

InceptionNet:一层内使用不同尺寸卷积核,提升感知力使用批标准化,缓解梯度消失
InceptionNet:1、1*1卷积;2、3*3卷积+1*1卷积;3、5*5卷积+1*1卷积;4、1*1卷积+3*3卷积;
class ConvBNRelu(Model):
    def __init__(self, ch, kernelsz=3, strides=1, padding='same'):
        super(ConvBNRelu, self).__init__()
        self.model = tf.keras.models.Sequential([
            Conv2D(ch, kernelsz, strides=strides, padding=padding),
            BatchNormalization(),
            Activation('relu')
        ])

    def call(self, x):
        x = self.model(x, training=False) #在training=False时,BN通过整个训练集计算均值、方差去做批归一化,training=True时,通过当前batch的均值、方差去做批归一化。推理时 training=False效果好
        return x


class InceptionBlk(Model):
    def __init__(self, ch, strides=1):
        super(InceptionBlk, self).__init__()
        self.ch = ch
        self.strides = strides
        self.c1 = ConvBNRelu(ch, kernelsz=1, strides=strides)
        self.c2_1 = ConvBNRelu(ch, kernelsz=1, strides=strides)
        self.c2_2 = ConvBNRelu(ch, kernelsz=3, strides=1)
        self.c3_1 = ConvBNRelu(ch, kernelsz=1, strides=strides)
        self.c3_2 = ConvBNRelu(ch, kernelsz=5, strides=1)
        self.p4_1 = MaxPool2D(3, strides=1, padding='same')
        self.c4_2 = ConvBNRelu(ch, kernelsz=1, strides=strides)

    def call(self, x):
        x1 = self.c1(x)
        x2_1 = self.c2_1(x)
        x2_2 = self.c2_2(x2_1)
        x3_1 = self.c3_1(x)
        x3_2 = self.c3_2(x3_1)
        x4_1 = self.p4_1(x)
        x4_2 = self.c4_2(x4_1)
        # concat along axis=channel
        x = tf.concat([x1, x2_2, x3_2, x4_2], axis=3)
        return x


class Inception10(Model):
    def __init__(self, num_blocks, num_classes, init_ch=16, **kwargs):
        super(Inception10, self).__init__(**kwargs)
        self.in_channels = init_ch
        self.out_channels = init_ch
        self.num_blocks = num_blocks
        self.init_ch = init_ch
        self.c1 = ConvBNRelu(init_ch)
        self.blocks = tf.keras.models.Sequential()
        # 代码非常简单:4个layer,两个block,block的前一个layer都不一样
        for block_id in range(num_blocks):
            for layer_id in range(2):
                # 第一个InceptionBlock
                if layer_id == 0:
                    block = InceptionBlk(self.out_channels, strides=2)
                else:
                    block = InceptionBlk(self.out_channels, strides=1)
                self.blocks.add(block)
            # enlarger out_channels per block
            # channel数每次增加2倍,resnet和vgg里面好像也是这么做的
            self.out_channels *= 2
        self.p1 = GlobalAveragePooling2D()
        self.f1 = Dense(num_classes, activation='softmax')

    def call(self, x):
        x = self.c1(x)
        x = self.blocks(x)
        x = self.p1(x)
        y = self.f1(x)
        return y


model = Inception10(num_blocks=2, num_classes=10)

 

 

 

二、cifar10分类-层方式-卷积神经网络-Inception10

博客对应课程的视频位置:

 

步骤

1、读取数据集
2、拆分数据集(拆分成训练数据集和测试数据集)
3、构建模型
4、训练模型
5、检验模型

需求

cifar10(物品分类)


该数据集共有60000张彩色图像,这些图像是32*32,分为10个类,每类6000张图。这里面有50000张用于训练,构成了5个训练批,每一批10000张图;另外10000用于测试,单独构成一批。测试批的数据里,取自10类中的每一类,每一类随机取1000张。抽剩下的就随机排列组成了训练批。注意一个训练批中的各类图像并不一定数量相同,总的来看训练批,每一类都有5000张图。


 

 

In [1]:
import pandas as pd
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt

1、读取数据集

直接从tensorflow的dataset来读取数据集即可

In [2]:
 (train_x, train_y), (test_x, test_y) = tf.keras.datasets.cifar10.load_data()
print(train_x.shape, train_y.shape)
(50000, 32, 32, 3) (50000, 1)

这是32*32的彩色图,rgb三个通道如何处理呢

In [3]:
plt.imshow(train_x[0])
plt.show()
In [4]:
plt.figure()
plt.imshow(train_x[1])
plt.figure()
plt.imshow(train_x[2])
plt.show()
In [5]:
print(test_y)
[[3]
 [8]
 [8]
 ...
 [5]
 [1]
 [7]]
In [6]:
# 像素值 RGB
np.max(train_x[0])
Out[6]:
255

2、拆分数据集(拆分成训练数据集和测试数据集)

上一步做了拆分数据集的工作

In [7]:
# 图片数据如何归一化
# 直接除255即可
train_x = train_x/255.0
test_x = test_x/255.0
In [8]:
# 像素值 RGB
np.max(train_x[0])
Out[8]:
1.0
In [9]:
train_y=train_y.flatten()
test_y=test_y.flatten()
train_y = tf.one_hot(train_y, depth=10)
test_y = tf.one_hot(test_y, depth=10)
print(test_y.shape)
(10000, 10)

3、构建模型

应该构建一个怎么样的模型:

 

 

 

 

In [11]:
from tensorflow.keras.layers import Conv2D, BatchNormalization, Activation, MaxPool2D, Dropout, Flatten, Dense, \
    GlobalAveragePooling2D
from tensorflow.keras import Model
In [13]:
class ConvBNRelu(Model):
    def __init__(self, ch, kernelsz=3, strides=1, padding='same'):
        super(ConvBNRelu, self).__init__()
        self.model = tf.keras.models.Sequential([
            Conv2D(ch, kernelsz, strides=strides, padding=padding),
            BatchNormalization(),
            Activation('relu')
        ])

    def call(self, x):
        x = self.model(x, training=False) #在training=False时,BN通过整个训练集计算均值、方差去做批归一化,training=True时,通过当前batch的均值、方差去做批归一化。推理时 training=False效果好
        return x


class InceptionBlk(Model):
    def __init__(self, ch, strides=1):
        super(InceptionBlk, self).__init__()
        self.ch = ch
        self.strides = strides
        self.c1 = ConvBNRelu(ch, kernelsz=1, strides=strides)
        self.c2_1 = ConvBNRelu(ch, kernelsz=1, strides=strides)
        self.c2_2 = ConvBNRelu(ch, kernelsz=3, strides=1)
        self.c3_1 = ConvBNRelu(ch, kernelsz=1, strides=strides)
        self.c3_2 = ConvBNRelu(ch, kernelsz=5, strides=1)
        self.p4_1 = MaxPool2D(3, strides=1, padding='same')
        self.c4_2 = ConvBNRelu(ch, kernelsz=1, strides=strides)

    def call(self, x):
        x1 = self.c1(x)
        x2_1 = self.c2_1(x)
        x2_2 = self.c2_2(x2_1)
        x3_1 = self.c3_1(x)
        x3_2 = self.c3_2(x3_1)
        x4_1 = self.p4_1(x)
        x4_2 = self.c4_2(x4_1)
        # concat along axis=channel
        x = tf.concat([x1, x2_2, x3_2, x4_2], axis=3)
        return x


class Inception10(Model):
    def __init__(self, num_blocks, num_classes, init_ch=16, **kwargs):
        super(Inception10, self).__init__(**kwargs)
        self.in_channels = init_ch
        self.out_channels = init_ch
        self.num_blocks = num_blocks
        self.init_ch = init_ch
        self.c1 = ConvBNRelu(init_ch)
        self.blocks = tf.keras.models.Sequential()
        # 代码非常简单:4个layer,两个block,block的前一个layer都不一样
        for block_id in range(num_blocks):
            for layer_id in range(2):
                # 第一个InceptionBlock
                if layer_id == 0:
                    block = InceptionBlk(self.out_channels, strides=2)
                else:
                    block = InceptionBlk(self.out_channels, strides=1)
                self.blocks.add(block)
            # enlarger out_channels per block
            # channel数每次增加2倍,resnet和vgg里面好像也是这么做的
            self.out_channels *= 2
        self.p1 = GlobalAveragePooling2D()
        self.f1 = Dense(num_classes, activation='softmax')

    def call(self, x):
        x = self.c1(x)
        x = self.blocks(x)
        x = self.p1(x)
        y = self.f1(x)
        return y


model = Inception10(num_blocks=2, num_classes=10)

4、训练模型

In [14]:
# 配置优化函数和损失器
model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['acc'])
# 开始训练
history = model.fit(train_x,train_y,batch_size=128,epochs=50,validation_data=(test_x,test_y))
# 模型的结构
model.summary()
Epoch 1/50
391/391 [==============================] - 17s 43ms/step - loss: 1.8076 - acc: 0.3180 - val_loss: 1.6318 - val_acc: 0.4116
Epoch 2/50
391/391 [==============================] - 16s 40ms/step - loss: 1.4765 - acc: 0.4573 - val_loss: 1.3714 - val_acc: 0.4908
Epoch 3/50
391/391 [==============================] - 16s 41ms/step - loss: 1.3060 - acc: 0.5234 - val_loss: 1.2401 - val_acc: 0.5433
Epoch 4/50
391/391 [==============================] - 17s 42ms/step - loss: 1.1736 - acc: 0.5748 - val_loss: 1.1352 - val_acc: 0.5834
Epoch 5/50
391/391 [==============================] - 17s 44ms/step - loss: 1.0816 - acc: 0.6115 - val_loss: 1.0851 - val_acc: 0.6144
Epoch 6/50
391/391 [==============================] - 17s 44ms/step - loss: 1.0115 - acc: 0.6371 - val_loss: 0.9869 - val_acc: 0.6433
Epoch 7/50
391/391 [==============================] - 18s 45ms/step - loss: 0.9449 - acc: 0.6640 - val_loss: 0.9467 - val_acc: 0.6613
Epoch 8/50
391/391 [==============================] - 18s 45ms/step - loss: 0.9005 - acc: 0.6819 - val_loss: 0.9444 - val_acc: 0.6641
Epoch 9/50
391/391 [==============================] - 18s 45ms/step - loss: 0.8599 - acc: 0.6932 - val_loss: 0.8901 - val_acc: 0.6810
Epoch 10/50
391/391 [==============================] - 18s 45ms/step - loss: 0.8238 - acc: 0.7082 - val_loss: 0.8655 - val_acc: 0.6917
Epoch 11/50
391/391 [==============================] - 18s 45ms/step - loss: 0.7821 - acc: 0.7228 - val_loss: 0.8740 - val_acc: 0.6856
Epoch 12/50
391/391 [==============================] - 19s 49ms/step - loss: 0.7589 - acc: 0.7334 - val_loss: 0.8063 - val_acc: 0.7142
Epoch 13/50
391/391 [==============================] - 19s 48ms/step - loss: 0.7337 - acc: 0.7428 - val_loss: 0.8300 - val_acc: 0.7109
Epoch 14/50
391/391 [==============================] - 19s 48ms/step - loss: 0.6949 - acc: 0.7562 - val_loss: 0.7888 - val_acc: 0.7236
Epoch 15/50
391/391 [==============================] - 19s 48ms/step - loss: 0.6685 - acc: 0.7645 - val_loss: 0.8009 - val_acc: 0.7238
Epoch 16/50
391/391 [==============================] - 19s 48ms/step - loss: 0.6463 - acc: 0.7734 - val_loss: 0.7918 - val_acc: 0.7220
Epoch 17/50
391/391 [==============================] - 19s 48ms/step - loss: 0.6284 - acc: 0.7784 - val_loss: 0.7558 - val_acc: 0.7358
Epoch 18/50
391/391 [==============================] - 19s 48ms/step - loss: 0.6040 - acc: 0.7881 - val_loss: 0.7763 - val_acc: 0.7324
Epoch 19/50
391/391 [==============================] - 20s 52ms/step - loss: 0.5763 - acc: 0.7979 - val_loss: 0.7596 - val_acc: 0.7373
Epoch 20/50
391/391 [==============================] - 21s 53ms/step - loss: 0.5526 - acc: 0.8064 - val_loss: 0.7690 - val_acc: 0.7412
Epoch 21/50
391/391 [==============================] - 21s 54ms/step - loss: 0.5358 - acc: 0.8116 - val_loss: 0.7557 - val_acc: 0.7459
Epoch 22/50
391/391 [==============================] - 21s 53ms/step - loss: 0.5054 - acc: 0.8235 - val_loss: 0.7761 - val_acc: 0.7414
Epoch 23/50
391/391 [==============================] - 21s 53ms/step - loss: 0.4953 - acc: 0.8247 - val_loss: 0.7792 - val_acc: 0.7379
Epoch 24/50
391/391 [==============================] - 21s 53ms/step - loss: 0.4759 - acc: 0.8317 - val_loss: 0.8140 - val_acc: 0.7390
Epoch 25/50
391/391 [==============================] - 21s 53ms/step - loss: 0.4453 - acc: 0.8445 - val_loss: 0.7771 - val_acc: 0.7448
Epoch 26/50
391/391 [==============================] - 21s 53ms/step - loss: 0.4336 - acc: 0.8481 - val_loss: 0.7503 - val_acc: 0.7512
Epoch 27/50
391/391 [==============================] - 22s 55ms/step - loss: 0.4167 - acc: 0.8529 - val_loss: 0.8334 - val_acc: 0.7397
Epoch 28/50
391/391 [==============================] - 25s 64ms/step - loss: 0.3928 - acc: 0.8617 - val_loss: 0.8093 - val_acc: 0.7406
Epoch 29/50
391/391 [==============================] - 23s 59ms/step - loss: 0.3787 - acc: 0.8655 - val_loss: 0.8417 - val_acc: 0.7405
Epoch 30/50
391/391 [==============================] - 24s 60ms/step - loss: 0.3607 - acc: 0.8724 - val_loss: 0.8638 - val_acc: 0.7419
Epoch 31/50
391/391 [==============================] - 25s 63ms/step - loss: 0.3382 - acc: 0.8814 - val_loss: 0.8298 - val_acc: 0.7485
Epoch 32/50
391/391 [==============================] - 20s 52ms/step - loss: 0.3204 - acc: 0.8870 - val_loss: 0.8972 - val_acc: 0.7354
Epoch 33/50
391/391 [==============================] - 23s 59ms/step - loss: 0.3119 - acc: 0.8880 - val_loss: 0.8988 - val_acc: 0.7401
Epoch 34/50
391/391 [==============================] - 22s 56ms/step - loss: 0.2998 - acc: 0.8938 - val_loss: 0.9132 - val_acc: 0.7331
Epoch 35/50
391/391 [==============================] - 24s 61ms/step - loss: 0.2777 - acc: 0.9008 - val_loss: 0.9189 - val_acc: 0.7430
Epoch 36/50
391/391 [==============================] - 24s 62ms/step - loss: 0.2489 - acc: 0.9113 - val_loss: 1.0373 - val_acc: 0.7366
Epoch 37/50
391/391 [==============================] - 22s 56ms/step - loss: 0.2464 - acc: 0.9121 - val_loss: 1.0045 - val_acc: 0.7427
Epoch 38/50
391/391 [==============================] - 24s 62ms/step - loss: 0.2369 - acc: 0.9147 - val_loss: 1.0457 - val_acc: 0.7359
Epoch 39/50
391/391 [==============================] - 26s 65ms/step - loss: 0.2182 - acc: 0.9215 - val_loss: 1.0556 - val_acc: 0.7375
Epoch 40/50
391/391 [==============================] - 25s 64ms/step - loss: 0.2007 - acc: 0.9285 - val_loss: 1.1185 - val_acc: 0.7330
Epoch 41/50
391/391 [==============================] - 25s 65ms/step - loss: 0.1853 - acc: 0.9333 - val_loss: 1.1849 - val_acc: 0.7313
Epoch 42/50
391/391 [==============================] - 25s 65ms/step - loss: 0.1841 - acc: 0.9337 - val_loss: 1.1221 - val_acc: 0.7385
Epoch 43/50
391/391 [==============================] - 25s 65ms/step - loss: 0.1755 - acc: 0.9370 - val_loss: 1.1486 - val_acc: 0.7422
Epoch 44/50
391/391 [==============================] - 25s 65ms/step - loss: 0.1640 - acc: 0.9406 - val_loss: 1.1682 - val_acc: 0.7400
Epoch 45/50
391/391 [==============================] - 25s 65ms/step - loss: 0.1512 - acc: 0.9456 - val_loss: 1.3058 - val_acc: 0.7303
Epoch 46/50
391/391 [==============================] - 25s 64ms/step - loss: 0.1511 - acc: 0.9456 - val_loss: 1.2076 - val_acc: 0.7438
Epoch 47/50
391/391 [==============================] - 26s 66ms/step - loss: 0.1377 - acc: 0.9503 - val_loss: 1.3129 - val_acc: 0.7322
Epoch 48/50
391/391 [==============================] - 25s 65ms/step - loss: 0.1418 - acc: 0.9486 - val_loss: 1.4475 - val_acc: 0.7193
Epoch 49/50
391/391 [==============================] - 25s 65ms/step - loss: 0.1419 - acc: 0.9492 - val_loss: 1.3480 - val_acc: 0.7322
Epoch 50/50
391/391 [==============================] - 26s 66ms/step - loss: 0.1249 - acc: 0.9558 - val_loss: 1.3331 - val_acc: 0.7356
Model: "inception10_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv_bn_relu_25 (ConvBNRelu) multiple                  512       
_________________________________________________________________
sequential_27 (Sequential)   (None, 8, 8, 128)         119616    
_________________________________________________________________
global_average_pooling2d_1 ( multiple                  0         
_________________________________________________________________
dense_1 (Dense)              multiple                  1290      
=================================================================
Total params: 121,418
Trainable params: 120,234
Non-trainable params: 1,184
_________________________________________________________________
In [15]:
plt.plot(history.epoch,history.history.get('loss'))
plt.title("train data loss")
plt.show()
In [16]:
plt.plot(history.epoch,history.history.get('val_loss'))
plt.title("test data loss")
plt.show()
In [17]:
plt.plot(history.epoch,history.history.get('acc'))
plt.title("train data acc")
plt.show()
In [18]:
plt.plot(history.epoch,history.history.get('val_acc'))
plt.title("test data acc")
plt.show()

5、检验模型

In [19]:
# 看一下模型的预测能力
pridict_y=model.predict(test_x)
print(pridict_y)
print(test_y)
[[8.3626978e-02 1.2059946e-09 8.9520222e-07 ... 3.3967318e-09
  3.1532836e-05 2.6114192e-08]
 [7.5900536e-11 1.6248515e-06 3.4092927e-20 ... 7.4938941e-25
  9.9999833e-01 6.0831120e-17]
 [1.2116799e-03 2.7492873e-03 1.4106349e-08 ... 2.6323275e-07
  9.9600667e-01 3.0461657e-05]
 ...
 [2.2101546e-11 1.7584129e-18 3.2485704e-04 ... 3.5030965e-07
  7.4089457e-14 3.1288028e-14]
 [2.1963908e-05 9.9997747e-01 6.3860628e-09 ... 6.9744677e-10
  2.6114601e-12 8.6871786e-08]
 [1.1741505e-18 1.3743291e-19 1.2932442e-11 ... 9.9993253e-01
  2.7877524e-22 6.5594271e-21]]
tf.Tensor(
[[0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 1. 0.]
 [0. 0. 0. ... 0. 1. 0.]
 ...
 [0. 0. 0. ... 0. 0. 0.]
 [0. 1. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 1. 0. 0.]], shape=(10000, 10), dtype=float32)
In [20]:
# 在pridict_y中找最大值的索引,横向
pridict_y = tf.argmax(pridict_y, axis=1)
print(pridict_y)
#
test_y = tf.argmax(test_y, axis=1)
print(test_y)
tf.Tensor([3 8 8 ... 5 1 7], shape=(10000,), dtype=int64)
tf.Tensor([3 8 8 ... 5 1 7], shape=(10000,), dtype=int64)
In [21]:
plt.figure()
plt.imshow(test_x[0])
plt.figure()
plt.imshow(test_x[1])
plt.figure()
plt.imshow(test_x[2])
plt.figure()
plt.imshow(test_x[3])
plt.show()
In [ ]:
 
 
posted @ 2020-09-21 23:41  范仁义  阅读(394)  评论(0编辑  收藏  举报