这里根据keras提供的cifar100的数据集做一个实战案例的回顾

CIFAR100是一个有100个类别的图片数据集,其体量比CIFAR10大了不是一点点,那么我们要如何更好的处理这样大批量的数据集呢,这里使用卷积神经网络进行解决

其网络结构如下图:

上代码

import tensorflow as tffrom tensorflow.keras import layers, optimizers, datasets, Sequential
import osos.environ['TP_CPP_MIN_LOG_LEVEL'] = '2'
tf.random.set_seed(2345)
#这里使用的是Sequential结构来构建网络,我们先通过调用keras里边的layers进行
#构建一个layers的网络架构,这里构建的是一个5层的卷积神经网络
conv_layers = [# unit 1layers.Conv2D(64, kernel_size = [3,3], padding = 'same', activation = tf.nn.relu),layers.Conv2D(64, kernel_size = [3,3], padding = 'same', activation = tf.nn.relu),layers.MaxPool2D(pool_size = [2,2], strides = 2, padding = 'same'),#卷积网络一般是由两个卷积层和一个池化采样层组合构成的,这里kernel size同一位3*3,池化采样的pool size则为2*2# unit 2 这里第一个参数128是指这个卷积层输出数据的纬度,即卷积核的个数-》batch,其与输出的通道数是一样的#可以看到我们的通道数从3变化为了64 -》 128 -》 256 -》 512layers.Conv2D(128, kernel_size = [3,3], padding = 'same',activation= tf.nn.relu),layers.Conv2D(128, kernel_size = [3,3], padding = 'same', activation = tf.nn.relu),layers.MaxPool2D(pool_size=[2,2], strides = 2, padding = 'same'),# unit 3layers.Conv2D(256, kernel_size = [3,3], padding = 'same',activation= tf.nn.relu),layers.Conv2D(256, kernel_size = [3,3], padding = 'same', activation = tf.nn.relu),layers.MaxPool2D(pool_size=[2,2], strides = 2, padding = 'same'),# unit 4layers.Conv2D(512, kernel_size = [3,3], padding = 'same',activation= tf.nn.relu),layers.Conv2D(512, kernel_size = [3,3], padding = 'same', activation = tf.nn.relu),layers.MaxPool2D(pool_size=[2,2], strides = 2, padding = 'same'),# unit 5
layers.Conv2D(512, kernel_size = [3,3], padding = 'same',activation= tf.nn.relu),layers.Conv2D(512, kernel_size = [3,3], padding = 'same', activation = tf.nn.relu),layers.MaxPool2D(pool_size=[2,2], strides = 2, padding = 'same'),]def preprocess(x, y):x = tf.cast(x, dtype = tf.float32) / 255.y = tf.cast(y, dtype = tf.int32)return x, y#尝龟的归一化操作(x, y), (x_test, y_test) = datasets.cifar100.load_data()
#读入数据
y = tf.squeeze(y, axis = 1)
#把label去掉第二个维度,只留下一个维度作为标签
y_test = tf.squeeze(y_test, axis = 1)
print(x.shape, y.shape, x_test.shape, y_test.shape)train_db = tf.data.Dataset.from_tensor_slices((x, y))
#将数据转换为tensor形式的张量
train_db = train_db.shuffle(1000).map(preprocess).batch(128)
#打乱数据集,并进行预处理,划分为128个为一组的batchtest_db = tf.data.Dataset.from_tensor_slices((x_test, y_test))
test_db = test_db.amp(preprocess).batch(64)
#作为测试集我们就不需要打乱了sample = next(iter(train_db))
#合理通过next(iter())创建一个可以迭代的对象sample
print('sample:', sample[0].shape, sample[1].shape,tf.reduce_min(sample[0]), tf.reduce_max(sample[0]))def main():conv_net = Sequential(conv_layers)#通过之前的list构建卷积网络,下面这个是同理构建全连接层的fc_net = Sequential([layers.Dense(256,activation = tf.nn.relu),layers.Dense(128, activation = tf.nn.relu),layers.Dense(100, activation = None),])#这里我们使用build方法构建对应网络结构,输入第一个为none时表示我们输入的图像个数适应于数据集#而其原始维度是32*32 通道数为3conv_net.build(input_shape = [None, 32, 32, 3])fc_net.build(input_shape= [None, 512])#这里因为最后一个卷积层输出的通道数为512所以全连接层通道数参数为512#[b, 32, 32, 3] => [b, 1, 1, 512]optimizer = optimizers.Adam(lr = 1e-4)#使用Adam 优化器 学习率设置为1e-4# 梯度下降的求梯度我们需要把卷积核全连接的参数汇总到一块variables = conv_net.trainable_variables + fc_net.trainable_variablesfor epoch in range(50):for step, (x, y) in enumerate(train_db):with tf.GradientTape() as tape:"""[b, 32, 32, 3] => [b, 1, 1, 512]"""#将原始输入的 32 * 32 转变为全连接层的 1*1 512out = conv_net(x)# flatten打平512的操作out = tf.reshape(out, [-1, 512])# 这里是100分类问题所以我们还需要将512通道的数据转换为b,100维的数据进行loss计算logits = fc_net(out)# [b] => [b, 100] 这里引入onehot将原始标签进行独热编码y_onehot = tf.one_hot(y, depth = 100)#计算损失函数值loss = tf.losses.categorical_crossentropy(y_onehot, logits, from_logits = True)loss = tf.reduce_mean(loss)grads = tape.gradient(loss, variables)optimizer.apply_gradients(zip(grads, variables))if step % 100 == 0:print(epoch, step, 'loss', float(loss))total_num = 0total_correct = 0for x,y in test_db:out = conv_net(x)out = tf.reshape(out, [-1,512])#-1表示不用指定通过后面的512来限定计算这个维度logits = fc_net(out)prob = tf.nn.softmax(logits, axis = 1)#将输出进行softmax激活函数映射为0-1之间的值pred = tf.argmax(prob, axis = 1)pred = tf.cast(pred, dtype = tf.int32)correct = tf.cast(tf.equal(pred, y), dtype = tf.int32)correct = tf.reduce_sum(correct)total_num += x.shape[0]total_correct += int(correct)acc = total_correct / total_numprint(epoch, 'acc:', acc)if __name__ == '__main__':main()

Tensorflow 卷积神经网络 (四)cifar100实战相关推荐

  1. tensorflow卷积神经网络实战:Fashion Mnist 图像分类与人马分类

    卷积神经网络实战:Fashion Mnist 图像分类与人马分类 一.FashionMnist的卷积神经网络模型 1.卷积VS全连接 2.卷积网络结构 3.卷积模型结构 1)Output Shape ...

  2. TensorFlow 卷积神经网络实用指南 | iBooker·ApacheCN

    原文:Hands-On Convolutional Neural Networks with TensorFlow 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 不要担心自己的形象,只关心 ...

  3. 卷积神经网络四种卷积类型

    卷积神经网络四种卷积类型 https://www.toutiao.com/a6631333810287936013/ 一般卷积 首先,我们需要就定义卷积层的一些参数达成一致. 卷积核大小(Kernel ...

  4. TensorFlow 卷积神经网络之猫狗识别(二)

    本文是TensorFlow 卷积神经网络之猫狗识别 的姊妹篇,是加载上一篇博客训练好的模型,进行猫狗识别 本文逻辑: 我从网上下载了十几张猫和狗的图片,用于检验我们训练好的模型. 处理我们下载的图片 ...

  5. 基于Tensorflow卷积神经网络天气图像识别系统设计

    开发软件: Pycharm + Navicat 12 开发技术:Django + sqlite + Tensorflow卷积神经网络 1.这是一个天气图像识别项目,基于tensorflow,使用卷积神 ...

  6. 基于Tensorflow卷积神经网络(CNN)的人脸年龄和性别检测系统

    文件大小:150M 开发环境:Python3.7.OpenCV4.0.1.24.Tensorflow1.13.1.PyCharm2020 点击下载:点击下载 简要概述:基于Tensorflow卷积神经 ...

  7. TensorFlow 卷积神经网络实用指南:1~5

    原文:Hands-On Convolutional Neural Networks with TensorFlow 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 深度学 ...

  8. 优达学城深度学习之六——TensorFlow卷积神经网络

    TensorFlow卷积层 TensorFlow 提供了 tf.nn.conv2d() 和 tf.nn.bias_add() 函数来创建你自己的卷积层. # Output depth k_output ...

  9. 基于TensorFlow卷积神经网络的手写体数字识别

    一.卷积神经网络(CNN) 二.LeNet 三.代码 1.Mnist手写体训练并测试 2.可视化 四.数据集分析 五.结果分析 1.准确率 2.可视化测试 一.卷积神经网络(CNN) 参考:https ...

最新文章

  1. 本蒟蒻对于二分图一些定理的理解
  2. 嵌入式LED驱动程序
  3. php多表数据排除,thinkphp中多表查询中防止数据重复的sql语句(必看)
  4. 【C语言】控制台窗口图形界面编程(五):文本移动
  5. CSS: 首字母字体变大时下划线不对齐的解决方法
  6. 3D游戏建模到底需要学习哪些美术基础?新手学习3D建模?
  7. android真实项目教程(七)——梦醒边缘花落_by_CJJ
  8. 【python笔记】 for循环和while循环,break和continue语句
  9. Chrome 插件自定义博客编辑界面
  10. mysql 自连接 临时表_存储过程中表(table)的自连接及临时表示例 (自认为好的存储过程示例)...
  11. donet 微服务开发 学习-使用docker部署Asp.net core web应用程序
  12. jquery实现菜单点击左右滑动效果
  13. 产品基础训练 - Persona[用户画像]
  14. USB音频编解码芯片电路方案设计(原理图)|TYPEC音频方案|TYPEC扩展坞方案|USB音频方案
  15. 如何利用Flashback Query 恢复误删除的数据
  16. 专家教你10个秘诀 70%癌症都能预防
  17. Nacos Committer 张龙:Nacos Sync 的设计原理和规划
  18. pyboard呼吸灯代码分享
  19. 硬件篇——阻容串联电路
  20. LMK、ZMK、TMK、ZAK等密钥对照表

热门文章

  1. 【Django】ImportError: cannot import name 'execute_manager'
  2. Java动态代理之JDK实现和CGlib实现
  3. 【LeetCode】231. Power of Two
  4. Effective C++_笔记_条款06_若不想使用编译器自动生成的函数,就该明确拒绝
  5. 利用NTFS流文件隐藏
  6. Windows Phone 7 文件下载进度和速度显示
  7. [导入]正则表达式学习心得体会(2)
  8. 【python】Python简介及优缺点
  9. [hbase]Hbase 在HDFS上的目录树结构
  10. ggplot2 | 如何对连续型变量使用离散型调色板进行配色