5.8 卷积神经网络
卷积神经网络:借助卷积核提取特征后,送入全连接网络。
卷积是什么?卷积就是特征提取器,就是CBAPD
model = tf.keras.models.Sequential([
#<< C >>
Conv2D(filters=6, kernel_size=(5, 5), padding='same'), # 卷积层
#<< B >>
BatchNormalization(), # BN层
#<< A >>
Activation('relu'), # 激活层
#<< P >>
MaxPool2D(pool_size=(2, 2), strides=2, padding='same'), # 池化层
#<< D >>
Dropout(0.2), # dropout层
])
5.9 CIFAR10数据集
Cifar10数据集:
提供 5万张 32*32 像素点的十分类彩色图片和标签,用于训练。
提供 1万张 32*32 像素点的十分类彩色图片和标签,用于测试。
内含有十个分类情况,分别对应标签0-9
airplane | |
automobile | |
bird | |
cat | |
deer | |
dog | |
frog | |
horse | |
ship | |
trunk |
导入cifar10数据集:
cifar10 = tf.keras.datasets.cifar10
(x_train, y_train),(x_test, y_test) = cifar10.load_data()
查看数据集内容:
import tensorflow as tf
from matplotlib import pyplot as plt
import numpy as np
np.set_printoptions(threshold=np.inf)
cifar10 = tf.keras.datasets.cifar10
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
# 可视化训练集输入特征的第一个元素
plt.imshow(x_train[0]) # 绘制图片
plt.show()
# 打印出训练集输入特征的第一个元素
print("x_train[0]:\n", x_train[0])
# 打印出训练集标签的第一个元素
print("y_train[0]:\n", y_train[0])
# 打印出整个训练集输入特征形状
print("x_train.shape:\n", x_train.shape)
# 打印出整个训练集标签的形状
print("y_train.shape:\n", y_train.shape)
# 打印出整个测试集输入特征的形状
print("x_test.shape:\n", x_test.shape)
# 打印出整个测试集标签的形状
print("y_test.shape:\n", y_test.shape)
运行后显示如下:
等。。。
5.10 神经网络搭建示例
示例:用卷积神经网络训练cifar10数据集,网络为一层卷积、两层全连接。
6个5*5卷积核 | C(核:6*5*5,步长:1,填充:same ) | |
过2*2的池化核,池化步长为2 | B(Yes) | |
A(relu) | ||
P(max,核:2*2,步长:2,填充:same) | ||
D(0.2) | ||
128神经元的全连接层 | Flatten | |
Dense(神经元:128,激活:relu,Dropout:0.2) | ||
因为十分类,所以过10神经元的全连接层 | Dense(神经元:10,激活:softmax) |
为增强程序的可视化能力,在class类中搭建网络结构。
在__init__()函数中,准备每层网络结构。
在call()函数中调用__init__()里搭建好的每层网络结构,从输入到输出来一遍前向传播,返回推理结果y。
以下为常见的写法,通常情况只对网络结构进行修改,也就是class类中的网络结构的修改。
import tensorflow as tf import os import numpy as np from matplotlib import pyplot as plt from tensorflow.keras.layers import Conv2D, BatchNormalization, Activation, MaxPool2D, Dropout, Flatten, Dense from tensorflow.keras import Model np.set_printoptions(threshold=np.inf) cifar10 = tf.keras.datasets.cifar10 (x_train, y_train), (x_test, y_test) = cifar10.load_data() x_train, x_test = x_train / 255.0, x_test / 255.0 class Baseline(Model): def __init__(self): super(Baseline, self).__init__() self.c1 = Conv2D(filters=6, kernel_size=(5, 5), padding='same') # 卷积层 self.b1 = BatchNormalization() # BN层 self.a1 = Activation('relu') # 激活层 self.p1 = MaxPool2D(pool_size=(2, 2), strides=2, padding='same') # 池化层 self.d1 = Dropout(0.2) # dropout层 self.flatten = Flatten() self.f1 = Dense(128, activation='relu') self.d2 = Dropout(0.2) self.f2 = Dense(10, activation='softmax') def call(self, x): x = self.c1(x) x = self.b1(x) x = self.a1(x) x = self.p1(x) x = self.d1(x) x = self.flatten(x) x = self.f1(x) x = self.d2(x) y = self.f2(x) return y model = Baseline() model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False), metrics=['sparse_categorical_accuracy']) checkpoint_save_path = "./checkpoint/Baseline.ckpt" if os.path.exists(checkpoint_save_path + '.index'): print('-------------load the model-----------------') model.load_weights(checkpoint_save_path) cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_save_path, save_weights_only=True, save_best_only=True) history = model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test, y_test), validation_freq=1, callbacks=[cp_callback]) model.summary() # print(model.trainable_variables) file = open('./weights.txt', 'w') for v in model.trainable_variables: file.write(str(v.name) + '\n') file.write(str(v.shape) + '\n') file.write(str(v.numpy()) + '\n') file.close() ############################################### show ############################################### # 显示训练集和验证集的acc和loss曲线 acc = history.history['sparse_categorical_accuracy'] val_acc = history.history['val_sparse_categorical_accuracy'] loss = history.history['loss'] val_loss = history.history['val_loss'] plt.subplot(1, 2, 1) plt.plot(acc, label='Training Accuracy') plt.plot(val_acc, label='Validation Accuracy') plt.title('Training and Validation Accuracy') plt.legend() plt.subplot(1, 2, 2) plt.plot(loss, label='Training Loss') plt.plot(val_loss, label='Validation Loss') plt.title('Training and Validation Loss') plt.legend() plt.show()
ACC、LOSS可视化效果打印:
训练后的各个神经元参数按照顺序依次保存在了weight.txt文件里方便下次使用。