基于tensorflow2.0和cifar100的VGG13网络训练
VGG是2014年ILSVRC图像分类竞赛的第二名,相比当年的冠军GoogleNet在可扩展性方面更胜一筹,此外,它也是从图像中提取特征的CNN首选算法,VGG的各种网络模型结构如下:

今天代码的原型是基于VGG13,也就是上图的B类,可以看到它的参数量是很可观的。
因为设备和时间问题,网络并没有训练完成,但是已经看到参数变化的效果。(毕竟VGG团队在最初训练时使用4块显卡并行计算还训练了2-3周,虽然当今显卡性能已经有了明显的提升,但是只能CPU训练的小可怜实在不敢继续下去了)
直接上代码吧
import tensorflow as tf
from tensorflow import keras
import os os.environ['TF_CPP_MIN_LOG'] = '' conv_layers = [
# part 1
keras.layers.Conv2D(64,kernel_size=[3,3],padding='same',activation=tf.nn.relu),
keras.layers.Conv2D(64,kernel_size=[3,3],padding='same',activation=tf.nn.relu),
keras.layers.MaxPool2D(pool_size=[2,2],strides=2,padding='same'), # part 2
keras.layers.Conv2D(128,kernel_size=[3,3],padding='same',activation=tf.nn.relu),
keras.layers.Conv2D(128,kernel_size=[3,3],padding='same',activation=tf.nn.relu),
keras.layers.MaxPool2D(pool_size=[2,2],strides=2,padding='same'), # part 3
keras.layers.Conv2D(256,kernel_size=[3,3],padding='same',activation=tf.nn.relu),
keras.layers.Conv2D(256,kernel_size=[3,3],padding='same',activation=tf.nn.relu),
keras.layers.MaxPool2D(pool_size=[2,2],strides=2,padding='same'), # part 4
keras.layers.Conv2D(512,kernel_size=[3,3],padding='same',activation=tf.nn.relu),
keras.layers.Conv2D(512,kernel_size=[3,3],padding='same',activation=tf.nn.relu),
keras.layers.MaxPool2D(pool_size=[2,2],strides=2,padding='same'), # part 5
keras.layers.Conv2D(512,kernel_size=[3,3],padding='same',activation=tf.nn.relu),
keras.layers.Conv2D(512,kernel_size=[3,3],padding='same',activation=tf.nn.relu),
keras.layers.MaxPool2D(pool_size=[2,2],strides=2,padding='same'),
] fc_layers =[
keras.layers.Dense(4096,activation = tf.nn.relu),
keras.layers.Dense(4096,activation = tf.nn.relu),
keras.layers.Dense(10)
] 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) = keras.datasets.cifar100.load_data()
y = tf.squeeze(y,axis=1)
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))
train_db = train_db.shuffle(1000).map(preprocess).batch(64) test_db = tf.data.Dataset.from_tensor_slices((x_test,y_test))
test_db = train_db.map(preprocess).batch(64) def main():
conv_net = keras.Sequential(conv_layers)
conv_net.build(input_shape=[None,32,32,3])
fc_net = keras.Sequential(fc_layers)
fc_net.build(input_shape=[None,512])
optimizer = keras.optimizers.Adam(lr=1e-4) for epoch in range(50):
for step,(x,y) in enumerate(train_db):
with tf.GradientTape() as tape:
out = conv_net(x)
out = tf.reshape(out,[-1,512])
logits = fc_net(out)
y_onehot = tf.one_hot(y,depth=10)
loss = tf.losses.categorical_crossentropy(y_onehot,logits,from_logits=True)
loss = tf.reduce_mean(loss) gradient = tape.gradient(loss,conv_net.trainable_variables + fc_net.trainable)
optimizer.apply_gradients(zip(gradient,conv_net.trainable_variables + fc_net.trainable)) if step % 100 == 0:
print(epoch,step,'loss:',float(loss)) total_num = 0
total_correct = 0
for x,y in test_db:
out = conv_net(x)
out = tf.reshape(out,[-1,512])
logits = fc_net(out)
prob = tf.nn.softmax(logits,axis=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 += correct
acc = total_correct/total_num print("acc:",acc) if __name__ == '__main__':
main()
通过这样一个网络模型的搭建,确实又加深了我对神经网络的认识以及tensorflow使用的熟练度,果然上机才是最佳学习方式!
基于tensorflow2.0和cifar100的VGG13网络训练的更多相关文章
- colab上基于tensorflow2.0的BERT中文多分类
		
bert模型在tensorflow1.x版本时,也是先发布的命令行版本,随后又发布了bert-tensorflow包,本质上就是把相关bert实现封装起来了. tensorflow2.0刚刚在2019 ...
 - 基于tensorflow2.0 使用tf.keras实现Fashion MNIST
		
本次使用的是2.0测试版,正式版估计会很快就上线了 tf2好像更新了蛮多东西 虽然教程不多 还是找了个试试 的确简单不少,但是还是比较喜欢现在这种写法 老样子先导入库 import tensorflo ...
 - 推荐模型DeepCrossing: 原理介绍与TensorFlow2.0实现
		
DeepCrossing是在AutoRec之后,微软完整的将深度学习应用在推荐系统的模型.其应用场景是搜索推荐广告中,解决了特征工程,稀疏向量稠密化,多层神经网路的优化拟合等问题.所使用的特征在论文中 ...
 - Pytorch半精度浮点型网络训练问题
		
用Pytorch1.0进行半精度浮点型网络训练需要注意下问题: 1.网络要在GPU上跑,模型和输入样本数据都要cuda().half() 2.模型参数转换为half型,不必索引到每层,直接model. ...
 - 基于AFNetworking3.0网络封装
		
概述 对于开发人员来说,学习网络层知识是必备的,任何一款App的开发,都需要到网络请求接口.很多朋友都还在使用原生的NSURLConnection一行一行地写,代码到处是,这样维护起来更困难了. 对于 ...
 - iOS_SN_基于AFNetworking3.0网络封装
		
转发文章,原地址:http://www.henishuo.com/base-on-afnetworking3-0-wrapper/?utm_source=tuicool&utm_medium= ...
 - 一文上手Tensorflow2.0之tf.keras(三)
		
系列文章目录: Tensorflow2.0 介绍 Tensorflow 常见基本概念 从1.x 到2.0 的变化 Tensorflow2.0 的架构 Tensorflow2.0 的安装(CPU和GPU ...
 - 推荐模型AutoRec:原理介绍与TensorFlow2.0实现
		
1. 简介 本篇文章先简单介绍论文思路,然后使用Tensoflow2.0.Keras API复现算法部分.包括: 自定义模型 自定义损失函数 自定义评价指标RMSE 就题目而言<AutoRec: ...
 - 推荐模型NeuralCF:原理介绍与TensorFlow2.0实现
		
1. 简介 NCF是协同过滤在神经网络上的实现--神经网络协同过滤.由新加坡国立大学与2017年提出. 我们知道,在协同过滤的基础上发展来的矩阵分解取得了巨大的成就,但是矩阵分解得到低维隐向量求内积是 ...
 
随机推荐
- CSS-11-外边距
			
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
 - Git详解之分支使用
			
前言 几乎每一种版本控制系统都以某种形式支持分支.使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作.在很多版本控制系统中,这是个昂贵的过程,常常需要创建一个源代码目录的完整副本 ...
 - Linux守护进程之systemd
			
介绍 历史上,Linux 的启动一直采用init进程:下面的命令用来启动服务. $ sudo /etc/init.d/apache2 start # 或者 $ service apache2 star ...
 - 【学习笔记】Git的日常使用
			
Note:本笔记是我学习廖雪峰老师的Git教程整理得到,在此向廖老师的无私付出表示衷心的感谢! 0.Git的历史 Git是一个分布式的版本控制系统(C语言编写,一开始为Linux社区服务,替代BitK ...
 - Oracle:imp导入dmp文件
			
oracle命令行登录 sqlplus / as sysdba 创建用户 create user 用户 identified by 密码 ; 创建表空间 create tablespace 表空间名 ...
 - C#系列之圣诞树代码(五)
			
马上就到圣诞节啦,这里我写啦一个最简单的圣诞树代码 Console.WriteLine("请输入您需要的圣诞树的大小<数字>"); int n = int.Parse( ...
 - http请求中的 OPTIONS 多余请求消除,减少的案例
			
问题: 项目中遇到移动端发送同样的请求2次,仔细看了一下,有个是options报文. HTTP请求翻一倍,对服务器的性能有较大影响,造成nginx的无畏消耗,需要消除它. 解决思路: 1.上网查看了一 ...
 - java数据域初始化
			
1.在声明中赋值 /** * Created by N3verL4nd on 2016/11/19. */ class Test{ private String str = "Hello W ...
 - Git 分支设计规范
			
概述 这篇文章分享 Git 分支设计规范,目的是提供给研发人员做参考. 规范是死的,人是活的,希望自己定的规范,不要被打脸. 在说 Git 分支规范之前,先说下在系统开发过程中常用的环境. 简称 全称 ...
 - 申请Let’s Encrypt通配符HTTPS证书(certbot ACME v2版)
			
1.获取certbot-auto# 下载 # 下载 wget https://dl.eff.org/certbot-auto # 设为可执行权限 chmod a+x certbot-auto 2.开始 ...