(原)tensorflow使用eager在mnist上训练的简单例子
转载请注明出处:
https://www.cnblogs.com/darkknightzh/p/9989586.html
代码网址:
https://github.com/darkknightzh/trainEagerMnist
参考网址:
https://github.com/tensorflow/models/blob/master/official/mnist/mnist_eager.py
一 总体流程
tensorflow使用eager时,需要下面几句话(如果不使用第三句话,则依旧可以使用静态图):
import tensorflow as tf
import tensorflow.contrib.eager as tfe
tfe.enable_eager_execution()
tensorflow使用eager模式后,感觉和pytorch一样方便。使用eager后,不需要tf.placeholder,用起来更加方便。
目前貌似tf.keras.layers和tf.layers支持eager,slim不支持。
总体流程如下:
initial optimizer
for I in range(epochs):
for imgs, targets in training_data:
with tf.GradientTape() as tape:
logits = model(imgs, training=True)
loss_value = calc_loss(logits, targets)
grads = tape.gradient(loss_value, model.variables)
optimizer.apply_gradients(zip(grads, model.variables), global_step=step_counter)
update training_accurate, total_loss
test model
save model
二 创建模型
可以使用下面三种方式创建模型
1. 类似pytorch的方式
先在__init__中定义用到的层,然后重载call函数,构建网络。模型前向计算时,会调用call函数。如下面代码所示:
class simpleModel(tf.keras.Model):
def __init__(self, num_classes):
super(simpleModel, self).__init__() input_shape = [28, 28, 1]
data_format = 'channels_last'
self.reshape = tf.keras.layers.Reshape(target_shape=input_shape, input_shape=(input_shape[0] * input_shape[1],)) self.conv1 = tf.keras.layers.Conv2D(16, 5, padding="same", activation='relu')
self.batch1 = tf.keras.layers.BatchNormalization()
self.pool1 = tf.keras.layers.MaxPooling2D((2, 2), (2, 2), padding='same', data_format=data_format) self.conv2 = tf.keras.layers.Conv2D(32, 5, padding="same", activation='relu')
self.batch2 = tf.keras.layers.BatchNormalization()
self.pool2 = tf.keras.layers.MaxPooling2D((2, 2), (2, 2), padding='same', data_format=data_format) self.conv3 = tf.keras.layers.Conv2D(64, 5, padding="same", activation='relu')
self.batch3 = tf.keras.layers.BatchNormalization()
self.pool3 = tf.keras.layers.MaxPooling2D((2, 2), (2, 2), padding='same', data_format=data_format) self.conv4 = tf.keras.layers.Conv2D(64, 5, padding="same", activation='relu')
self.batch4 = tf.keras.layers.BatchNormalization()
self.pool4 = tf.keras.layers.MaxPooling2D((2, 2), (2, 2), padding='same', data_format=data_format) self.flat = tf.keras.layers.Flatten()
self.fc5 = tf.keras.layers.Dense(1024, activation='relu')
self.batch5 = tf.keras.layers.BatchNormalization() self.fc6 = tf.keras.layers.Dense(num_classes)
self.batch6 = tf.keras.layers.BatchNormalization() def call(self, inputs, training=None):
x = self.reshape(inputs) x = self.conv1(x)
x = self.batch1(x, training=training)
x = self.pool1(x) x = self.conv2(x)
x = self.batch2(x, training=training)
x = self.pool2(x) x = self.conv3(x)
x = self.batch3(x, training=training)
x = self.pool3(x) x = self.conv4(x)
x = self.batch4(x, training=training)
x = self.pool4(x) x = self.flat(x)
x = self.fc5(x)
x = self.batch5(x, training=training) x = self.fc6(x)
x = self.batch6(x, training=training)
# x = tf.layers.dropout(x, rate=0.3, training=training)
return x def get_acc(self, target):
correct_prediction = tf.equal(tf.argmax(self.logits, 1), tf.argmax(target, 1))
acc = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
return acc def get_loss(self):
return self.loss def loss_fn(self, images, target, training):
self.logits = self(images, training) # call call(self, inputs, training=None) function
self.loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=self.logits, labels=target))
return self.loss def grads_fn(self, images, target, training): # do not return loss and acc if unnecessary
with tfe.GradientTape() as tape:
loss = self.loss_fn(images, target, training)
return tape.gradient(loss, self.variables)
2. 直接使用tf.keras.Sequential
如下面代码所示:
def create_model1():
data_format = 'channels_last'
input_shape = [28, 28, 1]
l = tf.keras.layers
max_pool = l.MaxPooling2D((2, 2), (2, 2), padding='same', data_format=data_format)
# The model consists of a sequential chain of layers, so tf.keras.Sequential (a subclass of tf.keras.Model) makes for a compact description.
return tf.keras.Sequential(
[
l.Reshape(target_shape=input_shape, input_shape=(28 * 28,)),
l.Conv2D(16, 5, padding='same', data_format=data_format, activation=tf.nn.relu),
l.BatchNormalization(),
max_pool, l.Conv2D(32, 5, padding='same', data_format=data_format, activation=tf.nn.relu),
l.BatchNormalization(),
max_pool, l.Conv2D(64, 5, padding='same', data_format=data_format, activation=tf.nn.relu),
l.BatchNormalization(),
max_pool, l.Conv2D(64, 5, padding='same', data_format=data_format, activation=tf.nn.relu),
l.BatchNormalization(),
max_pool, l.Flatten(),
l.Dense(1024, activation=tf.nn.relu),
l.BatchNormalization(), # # l.Dropout(0.4),
l.Dense(10),
l.BatchNormalization()
])
3. 使用tf.keras.Sequential()及add函数
如下面代码所示:
def create_model2():
data_format = 'channels_last'
input_shape = [28, 28, 1] model = tf.keras.Sequential() model.add(tf.keras.layers.Reshape(target_shape=input_shape, input_shape=(input_shape[0] * input_shape[1],))) model.add(tf.keras.layers.Conv2D(16, 5, padding="same", activation='relu'))
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.MaxPooling2D((2, 2), (2, 2), padding='same', data_format=data_format)) model.add(tf.keras.layers.Conv2D(32, 5, padding="same", activation='relu'))
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.MaxPooling2D((2, 2), (2, 2), padding='same', data_format=data_format)) model.add(tf.keras.layers.Conv2D(64, 5, padding="same", activation='relu'))
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.MaxPooling2D((2, 2), (2, 2), padding='same', data_format=data_format)) model.add(tf.keras.layers.Conv2D(64, 5, padding="same", activation='relu'))
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.MaxPooling2D((2, 2), (2, 2), padding='same', data_format=data_format)) model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(1024, activation='relu'))
model.add(tf.keras.layers.BatchNormalization()) model.add(tf.keras.layers.Dense(10))
model.add(tf.keras.layers.BatchNormalization()) return model
三 使用动态图更新梯度
在更新梯度时,需要加上下面的几句话
with tf.GradientTape() as tape:
logits = model(imgs, training=True)
loss_value = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=labs))
grads = tape.gradient(loss_value, model.variables)
optimizer.apply_gradients(zip(grads, model.variables), global_step=step_counter)
第二行得到特征,第三行得到损失,第四行得到梯度,第五行将梯度应用到模型,更新模型参数。
四 保存及载入模型
1. 使用tfe.Saver
代码如下
def saveModelV1(model_dir, model, global_step, modelname='model1'):
tfe.Saver(model.variables).save(os.path.join(model_dir, modelname), global_step=global_step)
def restoreModelV1(model_dir, model):
dummy_input = tf.constant(tf.zeros((1, 28, 28, 1))) # Run the model once to initialize variables
dummy_pred = model(dummy_input, training=False) saver = tfe.Saver(model.variables) # Restore the variables of the model
saver.restore(tf.train.latest_checkpoint(model_dir))
2. 使用tf.train.Checkpoint
代码如下
step_counter = tf.train.get_or_create_global_step()
checkpoint = tf.train.Checkpoint(model=model, optimizer=optimizer, step_counter=step_counter) def saveModelV2(model_dir, checkpoint, modelname='model2'):
checkpoint_prefix = os.path.join(model_dir, modelname)
checkpoint.save(checkpoint_prefix) def restoreModelV2(model_dir, checkpoint):
checkpoint.restore(tf.train.latest_checkpoint(model_dir))
五 具体代码
代码未严格按照总体流程的步骤,仅供参考,见https://github.com/darkknightzh/trainEagerMnist
其中eagerFlag为使用eager的方式,0为不使用eager(使用静态图),1为使用V1的方式,2为使用V2的方式。当使用静态图时,不要加tfe.enable_eager_execution(),否则会报错。具体可参考代码。
(原)tensorflow使用eager在mnist上训练的简单例子的更多相关文章
- tensorflow -gpu安装,史上最新最简单的途径(不用自己装cuda,cdnn)
tensorflow -gpu安装首先,安装Anoconda1. 官网下载点我: 2.安装 点击 python 3.6 version自动下载x64版,下载好之后,然后安装. 如图,打上勾之后,一路n ...
- asp.net.mvc 的单文件上传和多文件上传的简单例子
首先打开vs2012,创建空的mvc4项目,名称为MVCStudy,选择基本模板
- [原][osg][QT]osg与QT界面结合的简单例子二
//main.cpp #include "VREObliqueEditorQTWindow.h" #include <QtWidgets/QApplication> # ...
- tensorflow 13:多gpu 并行训练
多卡训练模式: 进行深度学习模型训练的时候,一般使用GPU来进行加速,当训练样本只有百万级别的时候,单卡GPU通常就能满足我们的需求,但是当训练样本量达到上千万,上亿级别之后,单卡训练耗时很长,这个时 ...
- 深度学习笔记 (二) 在TensorFlow上训练一个多层卷积神经网络
上一篇笔记主要介绍了卷积神经网络相关的基础知识.在本篇笔记中,将参考TensorFlow官方文档使用mnist数据集,在TensorFlow上训练一个多层卷积神经网络. 下载并导入mnist数据集 首 ...
- tensorflow中使用mnist数据集训练全连接神经网络-学习笔记
tensorflow中使用mnist数据集训练全连接神经网络 ——学习曹健老师“人工智能实践:tensorflow笔记”的学习笔记, 感谢曹老师 前期准备:mnist数据集下载,并存入data目录: ...
- 深度学习-tensorflow学习笔记(2)-MNIST手写字体识别
深度学习-tensorflow学习笔记(2)-MNIST手写字体识别超级详细版 这是tf入门的第一个例子.minst应该是内置的数据集. 前置知识在学习笔记(1)里面讲过了 这里直接上代码 # -*- ...
- Caffe系列4——基于Caffe的MNIST数据集训练与测试(手把手教你使用Lenet识别手写字体)
基于Caffe的MNIST数据集训练与测试 原创:转载请注明https://www.cnblogs.com/xiaoboge/p/10688926.html 摘要 在前面的博文中,我详细介绍了Caf ...
- 【实践】如何利用tensorflow的object_detection api开源框架训练基于自己数据集的模型(Windows10系统)
如何利用tensorflow的object_detection api开源框架训练基于自己数据集的模型(Windows10系统) 一.环境配置 1. Python3.7.x(注:我用的是3.7.3.安 ...
随机推荐
- hexo添加404公益界面
http://hellolb.top/2018/08/16/hexo添加404公益界面/ hexo个人博客添加404公益界面,这里我使用的腾讯404公益界面 我的博客主题是hexo+yilia,其实所 ...
- 总结mysql的三种外键约束方式
如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表.外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常 ...
- Mybatis之注解实现动态sql
通过注解实现动态sql一共需要三部:1.创建表,2.创建entity类,3.创建mapper类, 4.创建动态sql的Provider类.1.和2.可以参见该系列其他文章,这里主要对3和4进行演示,并 ...
- ReentrantLock和condition源码浅析(二)
转载请注明出处... 接着上一篇的ReentrantLock和condition源码浅析(一),这篇围绕着condition 一.condition的介绍 在这里为了作对比,引入Object类的两个方 ...
- JAVAScript:前端模块化开发
目录 一:前端模块化概要 1.1.模块化概要 1.2.函数封装 1.3.对象封装 1.4.立即执行函数表达式(IIFE) 1.5.模块化规范 1.5.1.CommonJS 1.5.2.AMD((Asy ...
- linux 学习笔记 查看文件篇
1 diff 比较两个文件 #diff -y test.txt test.txt 输出源文件和目标文件的全部.分左右两栏. aaaa aaaa bbb | b ccc < > ddd 注 ...
- SpringBoot使用WebFlux响应式编程操作数据库
这一篇文章介绍SpringBoot使用WebFlux响应式编程操作MongoDb数据库. 前言 在之前一篇简单介绍了WebFlux响应式编程的操作,我们在来看一下下图,可以看到,在目前的Spring ...
- Java笔记(五)泛型
泛型 一.基本概念和原理 泛型将接口的概念进一步延申,“泛型”的字面意思是广泛的类型. 类.接口和方法都可以应用于非常广泛的类型,代码与它们能够操作 的数据类型不再绑定到一起,同一套代码可以应用到多种 ...
- lnmp更改网站文件和MySQL数据库的存放目录
购买阿里云服务器,一般建议买一个数据盘,也就是系统盘和数据盘分开,将网站文件和Mysql数据库等都保存在数据盘,即使系统盘或者环境出问题,重置系统盘和重新配置环境,都不会影响数据盘的东西. 配置好LN ...
- docker自动重启容器
docker run --restart=always -d --name myunbuntu ubuntu /bin/bash -c "l am a docker" //无 ...