第五讲 卷积神经网路-- Inception10 --cifar10

Posted wbloger

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第五讲 卷积神经网路-- Inception10 --cifar10相关的知识,希望对你有一定的参考价值。

  1 import tensorflow as tf
  2 import os
  3 import numpy as np
  4 from matplotlib import pyplot as plt
  5 from tensorflow.keras.layers import Conv2D, BatchNormalization, Activation, MaxPooling2D, Dropout, Flatten, Dense, GlobalAveragePooling2D
  6 from tensorflow.keras import Model
  7 
  8 np.set_printoptions(threshold=np.inf)
  9 
 10 ciar10 = tf.keras.datasets.cifar10
 11 (x_train, y_train), (x_test, y_test) = cifar10.load_data()
 12 x_train, x_test = x_train/255.0, x_test/255.0
 13 
 14 class ConvBNRelu(Model):
 15     def __init__(self, ch, kernelsz=3, strides=1, padding=same):
 16         super(ConvBNRelu, self).__init__()
 17         self.model = tf.keras.models.Sequential([
 18             Conv2D(ch, kernelsz, strides=strides, padding=padding),
 19             BatchNormalization(),
 20             Activation(relu)
 21         ])
 22 
 23     def call(self, x):
 24         x = self.model(x, training=False)
 25         #在training=False时,BN通过整个训练集计算均值、方差去做批归一化,training=True时,通过当前batch的均值、方差去做批归一化。推理时 training=False效果好
 26         return x
 27 
 28 
 29 
 30 class InceptionBlk(Model):
 31     def __init__(self, ch, strides=1):
 32         super(InceptionBlk, self).__init__()
 33         self.ch = ch
 34         self.strides = strides
 35         self.c1 = ConvBNRelu(ch, kernelsz=1, strides=strides)
 36         self.c2_1 = ConvBNRelu(ch, kernelsz=1, strides=strides)
 37         self.c2_2 = ConvBNRelu(ch, kernelsz=3, strides=1)
 38         self.c3_1 = ConvBNRelu(ch, kernelsz=1, strides=strides)
 39         self.c3_2 = ConvBNRelu(ch, kernelsz=5, strides=1)
 40         self.p4_1 = MaxPooling2D(3, strides=1, padding=same)
 41         self.c4_2 = ConvBNRelu(ch, kernelsz=1, strides=strides)
 42 
 43     def call(self, x):
 44         x1 = self.c1(x)
 45         x2_1 = self.c2_1(x)
 46         x2_2 = self.c2_2(x2_1)
 47         x3_1 = self.c3_1(x)
 48         x3_2 = self.c3_2(x3_1)
 49         x4_1 = self.p4_1(x)
 50         x4_2 = self.c4_2(x4_1)
 51         # concat along axis=channel
 52         x = tf.concat([x1, x2_2, x3_2, x4_2], axis=1)
 53         return x
 54 
 55 class Inception10(Model):
 56     def __init__(self, num_blocks, num_classes, init_ch=16, **kwargs):
 57         super(Inception10, self).__init__(**kwargs)
 58         self.in_channels = init_ch
 59         self.out_channels = init_ch
 60         self.num_blocks = num_blocks
 61         self.init_ch = init_ch
 62         self.c1 = ConvBNRelu(init_ch)
 63         self.blocks = tf.keras.models.Sequential()
 64         for block_id in range(num_blocks):
 65             for layer_id in range(2):
 66                 if layer_id == 0:
 67                     block = InceptionBlk(self.out_channels, strides=1)
 68                 else:
 69                     block = InceptionBlk(self.out_channels, strides=1)
 70                 self.blocks.add(block)
 71             # enlarger out_channels per block
 72             self.out_channels *=2
 73         self.p1 = GlobalAveragePooling2D()
 74         self.f1 = Dense(num_classes, activation=softmax)
 75 
 76     def call(self, x):
 77         x = self.c1(x)
 78         x = self.blocks(x)
 79         x = self.p1(x)
 80         y = self.f1(x)
 81         return y
 82 
 83 model = Inception10(num_blocks=2, num_classes=10)
 84 
 85 model.compile(optimizer=adam,
 86               loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
 87               metrics=[sparse_categorical_accuracy])
 88 
 89 
 90 checkpoint_save_path = "./checkpoint/Inception10.ckpt"
 91 if os.path.exists(checkpoint_save_path + .index):
 92     print(-------------load the model---------------)
 93     model.load_weights(checkpoint_save_path)
 94 
 95 cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath = checkpoint_save_path,
 96                                                 save_weights_only = True,
 97                                                 save_best_only = True)
 98 
 99 history = model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test, y_test),validation_freq=1,
100                     callbacks=[cp_callback])
101 model.summary()
102 
103 
104 with open(./weights.txt, w) as f:
105     for v in model.trainable_variables:
106         f.write(str(v.name) + 
)
107         f.write(str(v.shape) + 
)
108         f.write(str(v.numpy()) + 
)
109 
110 
111 
112 def plot_acc_loss_curve(history):
113     # 显示训练集和验证集的acc和loss曲线
114     from matplotlib import pyplot as plt
115     acc = history.history[sparse_categorical_accuracy]
116     val_acc = history.history[val_sparse_categorical_accuracy]
117     loss = history.history[loss]
118     val_loss = history.history[val_loss]
119     
120     plt.figure(figsize=(15, 5))
121     plt.subplot(1, 2, 1)
122     plt.plot(acc, label=Training Accuracy)
123     plt.plot(val_acc, label=Validation Accuracy)
124     plt.title(Training and Validation Accuracy)
125     #plt.legend()
126     plt.grid()
127     
128     plt.subplot(1, 2, 2)
129     plt.plot(loss, label=Training Loss)
130     plt.plot(val_loss, label=Validation Loss)
131     plt.title(Training and Validation Loss)
132     plt.legend()
133     #plt.grid()
134     plt.show()
135 
136 plot_acc_loss_curve(history)
137     

 

以上是关于第五讲 卷积神经网路-- Inception10 --cifar10的主要内容,如果未能解决你的问题,请参考以下文章

第五讲 卷积神经网络 --baseline

第五讲 卷积神经网络 --baseline

卷积神经网络结构简述Inception系列网络

卷积神经网络Inception Net

深度学习100例 - 卷积神经网络(Inception V3)识别手语 | 第13天

深度学习系列卷积神经网络模型(从LeNet-5到Inception V4)