Tensorflow实战系列教程(二) 通过简单的图像分类任务初识计算机视觉

目录

 

前言:

摘要:

正文:

1.原始数据及标注

2.待训练的参数及模型

3.损失函数及反向传播优化器

4.训练策略介绍

完整工程,跑起来吧!


前言:

一套计算机视觉为切入点的Tensorflow教程,如果感兴趣,欢迎留言讨论。

摘要:

通过搭建一个分类Mnist数据集的示例,利用一个简单的数学矩阵模型,通过训练Mnist数据集的任务,来得到一个可以识别手写数字的模型,我们借此示例来大致梳理一下利用Tensorflow进行计算机视觉任务的基础流程。

 

正文:

1.原始数据及标注

原始数据为Mnist数据集,Mnist数据集我们从基础介绍的博文里可以找到,在这儿不作过多赘述。数据集提供了0-9十个维度的手写数字集合,目的是得到一个可以分清这十个数字的一个模型,因此标注信息为一个10维的数组。通过input_data脚本将数据集信息载入进来。

该工程中,我们通过对55000张784维的原始数据(28x28大小的单通道图片归一化),对模型参数进行训练拟合,代码为:

#截取5500张图像
total_batch = int(mnist.train.num_examples/batch_size)
#递次训练5500图像
for i in range(total_batch):
     batch_xs, batch_ys = mnist.train.next_batch(batch_size)

 

2.待训练的参数及模型

在该工程中,我们对输入的784维数据,利用一个[784,10]的二维矩阵作为参数预测模型,进行运算,通过matmul运算,得到一个10维的输出。预测模型为:

# Set model weights
W = tf.Variable(tf.zeros([784, 10]))    #矩阵的W参数,待训练
b = tf.Variable(tf.zeros([10]))         #偏置值

# Construct model
pred = tf.matmul(x, W) + b

 

 

3.损失函数及反向传播优化器

在该工程中,针对训练任务选取的损失函数为softmax函数,反向传播优化器选择梯度下降优化器,具体为:

# soft_max 越接近的分类value越大,否则越小,损失/代价函数,softmax回归
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = pred,labels = y))

# 梯度下降优化器
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

 

那为什么要选取softmaxcross_entropy函数的结合作为这种多分类任务的损失函数呢?

我们知道softmax的数学模型为:

exp函数的函数特性如下图所示,在作用域中,exp的结果为(0,正无穷大),因此,一个多任务分类的模型预测结果经过softmax回归后,会变成一个范围在(0,1)之间的标准归一化数组。

交叉熵函数cross_entropy的数学模型为:

我们利用numpy库模拟一下其函数实现,为:

cross_entropy = -numpy.sum(y*np.log(y_pred),-1)

通常情况下log下什么都不写默认是自然对数e ,ln函数的特性函数如下图所示,根据ln函数规律,我们可以知道,如果如果y_preb与结果值很接近,则y * ln(y_preb)的值越小,因为y为标准标注[0...1...0],当y_preb与原始标注越接近,则cross_entropy的结果越小,接近于0,反之,则越接近于无穷大。

这个特性使得cross_entropy可以很好的与softmax结合,作为分类任务的损失函数,他们的值可以很好的表征了模型效果,越好的模型结果越接近于0,根据损失值的结果的导向,利用反向传播机制将参数模型不断调整至最优。

 

4.训练策略介绍

训练策略选用分而治之的训练策略,将完整的数据集分为等多的batch块,通过对batch块进行逐步的训练,将模型不断调节,直至将整个数据集中的所有数据均训练到。每将完整数据集遍历一遍,则对当前模型进行一次评价,评价的时候利用测试集进行,因为完整的数据集过于庞大,无法全部载入内存。训练策略为:

training_epochs = 400   #完整数据集训练学习的次数

for epoch in range(training_epochs):
        avg_cost = 0.0
        #截取5500张图像
        total_batch = int(mnist.train.num_examples/batch_size)
        #递次训练5500图像
        for i in range(total_batch):
            batch_xs, batch_ys = mnist.train.next_batch(batch_size)
            #通过反向传播,训练网络
            _, c = sess.run([optimizer, cost], feed_dict={x: batch_xs, y: batch_ys})
            #记录累计误差
            avg_cost += c / total_batch
        print("Epoch:{0}, cost= {1}".format(epoch,avg_cost * 100))
        print("test accuracy is {0}".format(accuracy.eval(feed_dict={x:mnist.test.images, y:mnist.test.labels})))

 

完整工程,跑起来吧!

'''
 如需转载,请保留该信息
 by hzy
 in 西安
'''
import tensorflow as tf
import random
import input_data       #载入Mnist数据,作为tensorflow框架可以使用的数据格式
mnist = input_data.read_data_sets(one_hot=True)

# Parameters
learning_rate = 0.01    #学习率
training_epochs = 400   #循环学习的次数
batch_size = 100        #一份数据集的大小
display_step = 1

# tf Graph Input
x = tf.placeholder(tf.float32, [None, 784]) #读数据的
y = tf.placeholder(tf.float32, [None, 10]) 

# Set model weights
W = tf.Variable(tf.zeros([784, 10]))    #矩阵的W参数,待训练
b = tf.Variable(tf.zeros([10]))         #偏置值

# Construct model
pred = tf.matmul(x, W) + b

# soft_max 越接近的分类value越大,否则越小,损失/代价函数,softmax回归
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = pred,labels = y))
# 梯度下降优化器 AdamOptimizer
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

# Initializing the variables tensorflow变量初始化
init = tf.global_variables_initializer()

#定义验证模型
correct_prediction = tf.equal(tf.argmax(pred,1), tf.argmax(y,1))
#表征准确率
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

#定义访问下标数组
train_index = list(range(mnist.train.num_examples))
print(mnist.train.num_examples)
#记录训练步长
train_step_record = 0
# Launch the graph
saver = tf.train.Saver()



with tf.Session() as sess:
    sess.run(init)
    for epoch in range(training_epochs):
        avg_cost = 0.0
        #截取5500张图像
        total_batch = int(mnist.train.num_examples/batch_size)
        #递次训练5500图像
        for i in range(total_batch):
            
            batch_xs, batch_ys = mnist.train.next_batch(batch_size)
            #通过反向传播,训练网络
            _, c = sess.run([optimizer, cost], feed_dict={x: batch_xs,
                                                          y: batch_ys})
            #记录累计误差
            avg_cost += c / total_batch
        print("Epoch:{0}, cost= {1}".format(epoch,avg_cost * 100))
        print("test accuracy is {0}".format(accuracy.eval(feed_dict={x:mnist.test.images, y:mnist.test.labels})))

    print("Optimization Finished!")

 

 

 

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
每天前100人再送5门编程课! AI+5门300元课程+社群闭门分享会源码开源下载:https://github.com/DjangoPeng/keras-101/tree/master/code_samples 【为什么学AI】 归功于近年来大规模数据和硬件计算能力的大幅度提升,人工智能的概念近两年一直是市场追捧的对象。目前各大厂都争先恐后地布局AI,落地各类AI的的商业应用,也随之打响了一场激烈的人才争夺战。长远来看,越快将 AI 用于自己的工作中就能越早体会到AI带来的收益。 【讲师介绍】 彭靖田 Google Developer Experts。 曾为 TensorFlow Top级 的贡献者,著书《深入理解TensorFlow》,是国内第一本深度剖析 Google AI 框架的畅销书。 曾从0到1深入参与了华为 2012 实验室深度学习平台和华为深度学习云服务的设计与研发工作。 【课程设计】 课程内容基于最新的Keras版本(你也可以使用 TensorFlow 2 的 tf.keras 模块),其中有大量独家解读、案例,以及不少讲师一线实战多年的方法论和深度思考。同时,在层次划分上,难易兼顾,循序渐进。既有核心的基础知识,也有高级的进阶操作,尽量做到“老少皆宜”。 课程分为基础篇、入门篇和实战篇: 一、基础篇: 主要讲解人工智能发展史和深度学习脱颖而出的原由,以及神经网络的基础概念、理论实现、优化原理和计算方法。 、入门篇: 主攻快速上手,通过7个小节让你从0到1实现环境搭建、模型优化,直接试水2个实战项目。同时,增强AI的理论学习,系统掌握机器学习3大分支、模型评估方法、数据预处理常用手段与过拟合问题的解决方案。 三、实战篇: 通过4个实战全面掌握深度学习理论与实现,涵盖目标检测、图像分类、可视化和可解释性学习、迁移学习、特征提取、数据增强等。带你综合运用前面所学的所有知识,逐渐熟练AI开发流程与技能。 课程包含思维导图上的所有内容(价值199元)前500名立减100元,仅99元买完就能学!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

碳纤维石头君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值