数据集 cifar10_300.csv 是将原始的 cifar10 数据集经过处理后的数据集。该数据集一共有300张图片,包括10个类别,每个类别30张图片,数据集的最后一列为标签列。图片样例如下:
# 导入需要的包
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv2D, MaxPooling2D, Flatten
import numpy as np
import pandas as pd
tf.reset_default_graph
# 设置随机种子
seed = 7
np.random.seed(seed)
tf.set_random_seed(seed)
# 导入训练集和测试集
cifar10_300 = pd.read_csv("cifar10_300.csv")
X = cifar10_300.values[:,:-1]
Y = cifar10_300["label"].values
# 进行数据归一化
X = X/255
# 分割训练集和测试集,
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size = 0.2, random_state = 10, stratify = Y)
# 将数据集转换成网络输入需要的形状
x_train = x_train.reshape([-1, 32, 32, 3])
x_test = x_test.reshape([-1, 32, 32, 3])
print("x_train shape:", x_train.shape,"\nx_test shape:", x_test.shape)
# 将标签转换为one-hot编码
y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)
# 构建模型结构
model = Sequential()
# 第一部分,卷积层+池化
model.add(Conv2D(filters = 64, # 设置卷积核的个数
kernel_size = (3, 3), # 设置卷积核的大小
strides=(1, 1), # 设置卷积的步长
input_shape=(32, 32, 3), # 设置输入的形状
padding='same', # 设置填充方式
activation='relu', # 设置激活函数
kernel_initializer='uniform' #设置权重初始化方法
))
model.add(Conv2D(filters = 64, # 设置卷积核的个数
kernel_size = (3, 3), # 设置卷积核的大小
strides=(1, 1), # 设置卷积的步长
padding='same', # 设置填充方式
activation='relu', # 设置激活函数
kernel_initializer='uniform' #设置权重初始化方法
))
model.add(MaxPooling2D(pool_size=(2, 2)))
# 第二部分,卷积层+池化
model.add(Conv2D(filters = 128, # 设置卷积核的个数
kernel_size = (3, 3), # 设置卷积核的大小
strides=(1, 1), # 设置卷积的步长
padding='same', # 设置填充方式
activation='relu', # 设置激活函数
kernel_initializer='uniform' #设置权重初始化方法
))
model.add(Conv2D(filters = 128, # 设置卷积核的个数
kernel_size = (3, 3), # 设置卷积核的大小
strides=(1, 1), # 设置卷积的步长
padding='same', # 设置填充方式
activation='relu', # 设置激活函数
kernel_initializer='uniform' #设置权重初始化方法
))
model.add(MaxPooling2D(pool_size=(2, 2)))
# 第三部分,卷积层+池化
model.add(Conv2D(filters = 256, # 设置卷积核的个数
kernel_size = (3, 3), # 设置卷积核的大小
strides=(1, 1), # 设置卷积的步长
padding='same', # 设置填充方式
activation='relu', # 设置激活函数
kernel_initializer='uniform' #设置权重初始化方法
))
model.add(Conv2D(filters = 256, # 设置卷积核的个数
kernel_size = (3, 3), # 设置卷积核的大小
strides=(1, 1), # 设置卷积的步长
padding='same', # 设置填充方式
activation='relu', # 设置激活函数
kernel_initializer='uniform' #设置权重初始化方法
))
model.add(Conv2D(filters = 256, # 设置卷积核的个数
kernel_size = (1, 1), # 设置卷积核的大小
strides=(1, 1), # 设置卷积的步长
padding='same', # 设置填充方式
activation='relu', # 设置激活函数
kernel_initializer='uniform' #设置权重初始化方法
))
model.add(MaxPooling2D(pool_size=(2, 2)))
# 第四部分,卷积层+池化
model.add(Conv2D(filters = 512, # 设置卷积核的个数
kernel_size = (3, 3), # 设置卷积核的大小
strides=(1, 1), # 设置卷积的步长
padding='same', # 设置填充方式
activation='relu', # 设置激活函数
kernel_initializer='uniform' #设置权重初始化方法
))
model.add(Conv2D(filters = 512, # 设置卷积核的个数
kernel_size = (3, 3), # 设置卷积核的大小
strides=(1, 1), # 设置卷积的步长
padding='same', # 设置填充方式
activation='relu', # 设置激活函数
kernel_initializer='uniform' #设置权重初始化方法
))
model.add(Conv2D(filters = 512, # 设置卷积核的个数
kernel_size = (1, 1), # 设置卷积核的大小
strides=(1, 1), # 设置卷积的步长
padding='same', # 设置填充方式
activation='relu', # 设置激活函数
kernel_initializer='uniform' #设置权重初始化方法
))
model.add(MaxPooling2D(pool_size=(2, 2)))
# 第五部分,卷积层+池化
model.add(Conv2D(filters = 512, # 设置卷积核的个数
kernel_size = (3, 3), # 设置卷积核的大小
strides=(1, 1), # 设置卷积的步长
padding='same', # 设置填充方式
activation='relu', # 设置激活函数
kernel_initializer='uniform' #设置权重初始化方法
))
model.add(Conv2D(filters = 512, # 设置卷积核的个数
kernel_size = (3, 3), # 设置卷积核的大小
strides=(1, 1), # 设置卷积的步长
padding='same', # 设置填充方式
activation='relu', # 设置激活函数
kernel_initializer='uniform' #设置权重初始化方法
))
model.add(Conv2D(filters = 512, # 设置卷积核的个数
kernel_size = (1, 1), # 设置卷积核的大小
strides=(1, 1), # 设置卷积的步长
padding='same', # 设置填充方式
activation='relu', # 设置激活函数
kernel_initializer='uniform' #设置权重初始化方法
))
model.add(MaxPooling2D(pool_size=(2, 2)))
# 第六部分,全连接层
model.add(Flatten()) # 扁平化
model.add(Dense(4096, activation='relu'))
model.add(Dense(4096, activation='relu'))
# 输出层
model.add(Dense(10, activation='softmax'))
# 创建会话
with tf.Session() as sess:
# 进行模型的编译
adam = keras.optimizers.Adam(lr = 0.00001) # 定义优化方法,使用“adam”,并设置学习率
model.compile(loss='categorical_crossentropy', # 设置损失函数
optimizer=adam, # 设置优化方法
metrics=['accuracy']) # 设置检测指标
# 网络训练,batch大小为 64, 训练轮数为 5 轮
model.fit(x_train, y_train, batch_size = 64, epochs = 5)
# 模型测试,使用模型预测测试集的标签
y_pred = model.predict_classes(x_test)
# 模型评价,评价模型在测试集上的准确率
test_accuracy = model.evaluate(x_test, y_test)[1]
print('Test Accuracy:', test_accuracy)