总共一百个类,每个类有600个图像。每类500个训练图像,100个测试图像。没填图像都带有一个"精细"标签(它所属的类)核一个粗糙标签(它所属的超类)
用于构建CNN模型的API
Conv2D:实现卷积,kernel_size,strides,padding,datafromat,'NHWC'核'NCHW'
MaxPool2D:池化操作
import keras
import tensorflow as tf
# 构建卷积层,filters:多少个卷积核,kernel_size每个卷积核为5*5大小
# strides:步长,padding:零填充大小为same形式,activation:使用什么激活函数
keras.layers.Conv2D(filters=32,kernel_size=5,strides=1,
padding='same',data_format='channels_last',activation=tf.nn.relu)
# 构建池化操作
keras.layers.MaxPool2D(pool_size=2,strides=2,padding='same')
class CNNMnist():
def __init__(self):
# 读取数据
(self.train,self.train_label),(self.test,self.test_label)=keras.datasets.cifar100.load_data()
# 数据转换为32*32大小的3通道数据,并对数据归一化
self.train=self.train.reshape(-1,32,32,3)/255.0
self.test=self.train.reshape(-1,32,32,3)/255.0
两层卷积层+两层神经网络
第一层:卷积核大小5*5形式的32个,步长为1,零填充为same形式,激活函数为relu,池化为大小2*2步长为2
第二层:卷积核大小5*5形式的个,步长为1,零填充为same形式,激活函数为relu,池化为大小2*2步长为2
经过每一层图片数据大小的变化需要确定,导入的数据中每批次若干图片数据大小为[None,32*32],如果要经过卷积计算,需要变成[None,32,32,3]
第一层:
卷积前-卷积后=[None,32,32,3]-[None,32,32,32],因为外面卷积核里设置的fiter为32个,所以卷积后会生成32个特征图。激活函数过后:[None,32,32,32]-[None,32,32,32]
池化后:[None,32,32,32]-[None,16,16,32],因为外面池化设置的poll_size核strides都是2
第二层:
卷积前-卷积后=[None,16,16,32]-[None,16,16,]。激活函数过后:[None,16,16,]-[None,16,16,]
池化后:[None,16,16,]-[None,8,8,],因为外面池化设置的poll_size核strides都是2
全连接层:
传入全连接层的数据形式为:[None,8,8,],因为是全连接所以变化后还是[None,8,8,],经过第一层神经网络后:[None,8,8,]*[None,8,8,]=[None,1024],然后到输出层的时候[None,1024]*[1024,100]=[None,100]
model = keras.Sequential([
keras.layers.Conv2D(32, kernel_size=5, strides=1,
padding='same', data_format='channels_last', activation=tf.nn.relu),
keras.layers.MaxPool2D(pool_size=2, strides=2, padding='same'),
keras.layers.Conv2D(, kernel_size=5, strides=1,
padding='same', data_format='channels_last', activation=tf.nn.relu),
keras.layers.MaxPool2D(pool_size=2, strides=2, padding='same'),
keras.layers.Flatten(),
keras.layers.Dense(1024, activation=tf.nn.relu),
keras.layers.Dense(100, activation=tf.nn.softmax),
])
定义模型参数
训练模型
模型评估
这些在上几章说过了
from tensorflow import keras
import tensorflow as tf
class CNNMnist():
# 建立模型
model = keras.Sequential([
# 建立第一层卷积层
keras.layers.Conv2D(32, kernel_size=5, strides=1,
padding='same', data_format='channels_last', activation=tf.nn.relu),
# 建立池化层
keras.layers.MaxPool2D(pool_size=2, strides=2, padding='same'),
# 建立第二层卷积层
keras.layers.Conv2D(, kernel_size=5, strides=1,
padding='same', data_format='channels_last', activation=tf.nn.relu),
# 建立第二层池化层
keras.layers.MaxPool2D(pool_size=2, strides=2, padding='same'),
keras.layers.Flatten(),
# 建立第一层神经网络
keras.layers.Dense(1024, activation=tf.nn.relu),
# 建立输出层
keras.layers.Dense(100, activation=tf.nn.softmax),
])
def __init__(self):
(self.train,self.train_label),(self.test,self.test_label)=keras.datasets.cifar100.load_data()
self.train=self.train.reshape(-1,32,32,3)/255.0
self.test=self.train.reshape(-1,32,32,3)/255.0
# 定义模型参数的函数
def compile(self):
CNNMnist.model.compile(optimizer=keras.optimizers.Adam(),
loss=keras.losses.sparse_categorical_crossentropy,
metrics=['accuracy'])
return None
# 开始训练函数
def fit(self):
CNNMnist.model.fit(self.train, self.train_label, epochs=1, batch_size=32)
return None
# 模型评分函数
def evaluate(self):
test_loss, test_acc = CNNMnist.model.evaluate(self.test, self.test_label)
print(test_loss, test_acc)
return None
if __name__ == '__main__':
cnn = CNNMnist()
cnn.compile()
cnn.fit()
print(CNNMnist.model.summary())
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- bangwoyixia.com 版权所有 湘ICP备2023022004号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务