写给小白的TensorFlow的入门课

news2024/11/23 13:47:13

文章目录

    • 前言
    • 学习AI的必要性
      • 和业务的关系
    • 最简单的例子
      • 要做什么?
      • 数据图形化展示
      • 构建计算图形
      • 计算图形
      • 最小化误差
    • MacOS 中配置运行环境
      • 安装
      • 验证安装
    • 简单模型训练
    • 识别数字图片的模型训练
      • Softmax Regression算法
      • 大概步骤
      • 大致算法
      • 实现
    • 结语
    • 参考链接

前言

深度学习就是从大量数据中寻找规律,学习什么?学习模型的各种参数。从训练模型到模型推理,都离不开深度学习框架。TensorFlow和PyTorch就是两个最主要的框架。
AI的模型训练其实就是: 对模型变量的值进行不断调整,直到训练模型对所有可能的变量求出的结果都无限接近目标值,而我们要做的工作就是给足够的数据进行训练,以及不断优化训练算法。

学习AI的必要性

自从2016年AlphaGo战胜李世石后,人工智能,深度学习成为最热门的话题。但是其实深度学习其实很早就有,在2012年的ImageNet图像分类竞赛中,深度学习系统AlexNet夺冠其实已经预示着深度学习开启的AI新时代即将到来。

作为一个IT从业人员,如何理解新的AI时代对我们的影响,先看一下下图的数据:

屏幕快照 2017-05-14 下午10.29.43.png

此图是google内部使用tensorflow(机器学习)的状况,整个以指数形进行增长。2016年Q1的时候已经超过2000的项目在使用。人工智能已经变成了一种基础设施,每一个开发&测试都应该有所了解。

和业务的关系

那作为普通的业务开发&测试人员,AI和我们关系如何呢?整理了一下AI对业务的关系,可以理解为如下图:

  • 算法:根据不同的使用场景,使用不同的算法来进行支撑,因为tensorflow等开源框架的支持,这部分的成本已经大大降低。
  • 计算:机器学习特别是深度学习需要巨大的计算能力,但是现在使用阿里云等云计算平台的计算成本大大减低,这块也逐渐不在成为瓶颈。
  • 数据:这块和各个业务关联性比较大,也是各业务可以利用AI的能力来进行创新的关键,只要结合自己的业务和数据,利用AI能力就能带来很多不一样的突破。

屏幕快照 2017-05-14 下午10.31.09.png

最简单的例子

Tensorflow是google的开源的人工智能学习系统,下面是一个Tensorflow版本的Helloworld列子,让大家对其有个基本的了解。

要做什么?

待预测的方程:y=0.7x+0.3+noise
模型:y=Wx+b
目标:通过给出足够的x,y,预测出W和b.
模拟数据准备:

import numpy as np
 
# 创建200个随机的值,为了模拟真实情况,增加noise y = x * 0.7 + 0.3
x_data = np.random.rand(200).astype(np.float32)

noise = np.random.normal(0,0.01,x_data.shape)

y_data = x_data * 0.7 + 0.3 + noise

数据图形化展示

在这里插入图片描述

构建计算图形

import tensorflow as tf
 
x = tf.placeholder(shape=[None],
                    dtype=tf.float32,name=‘x')

W = tf.Variable(tf.random_uniform([1], -1.0, 1.0)) 

b = tf.Variable(tf.zeros([1])) 

y = W * x + b

计算图形

在这里插入图片描述

最小化误差

# Minimize the mean squared errors.

loss = tf.reduce_mean(tf.square(y - y_data))

optimizer = tf.train.GradientDescentOptimizer(0.5)

train = optimizer.minimize(loss)

计算图形如下:
在这里插入图片描述

MacOS 中配置运行环境

官方教程地址: https://www.tensorflow.org/install/install_mac#installing_with_virtualenv

一共有四种方式,根据官方推荐,我采用的是virtualenv

由于我的MBP没有NVIDIA CUDA GPU,因此这里我没有配GPU

安装

sudo easy_install pip

tensorflow-sample-1.png

sudo pip install --upgrade virtualenv

tensorflow-sample-2.png

virtualenv --system-site-packages tensorflow

tensorflow-sample-3.png

由于MacOS Sierra自带的Python是2.7.10版本,并且我的MBP没有支持GPU,因此执行:

pip install --upgrade tensorflow

如果是其他情况的请参照官方教程
在这里插入图片描述

验证安装

官方地址: https://www.tensorflow.org/install/install_mac#ValidateYourInstallation
tensorflow-sample-4.png

简单模型训练

该案例来自官方的入门案例: https://www.tensorflow.org/get_started/get_started

以tf引入tensorflow:

import tensorflow as tf
定义可训练模型变量W与b:

# 类型为tf.float32初始值为0.3的可训练模型变量W
W = tf.Variable([.3], tf.float32)
# 类型为tf.float32初始值为-0.3的可训练模型变量b
b = tf.Variable([-.3], tf.float32)
定义输出目标变量y:

y = tf.placeholder(tf.float32)
定义距离目标变量的损失值loss:

# 每个输出值与对应目标值差平方的和
loss = tf.reduce_sum(tf.square(linear_model - y))
定义优化器:

# 通过以精度0.01的梯度下降
optimizer = tf.train.GradientDescentOptimizer(0.01)
# 通过优化器,让其距离目标值逐渐减小
train = optimizer.minimize(loss)
准备训练用的数据:

# 输入变量x的值序列
x_train = [1,2,3,4]
# 需要能够对应输出的目标值序列
y_train = [0,-1,-2,-3]
开始训练:

# 初始化可训练变量
init = tf.global_variables_initializer()
# 创建一个session
sess = tf.Session()
# 复位训练模型
sess.run(init)
for i in range(1000):
  # 喂训练数据
  sess.run(train, {x:x_train, y:y_train})
输出训练结果:

curr_W, curr_b, curr_loss  = sess.run([W, b, loss], {x:x_train, y:y_train})
# 最终结果当 W为-0.9999969、b为0.99999082,距离目标值(每个输出值与目标值差的平方和)为5.69997e-11
# 输出: W: [-0.9999969] b: [0.99999082] loss: 5.69997e-11
print("W: %s b: %s loss: %s"%(curr_W, curr_b, curr_loss))

tensorflow-sample-6.png

该次模型训练的性能决定因素是: 优化器选择、精度选择、训练数据

通过高级的接口快速的实现上面的模型训练

import tensorflow as tf
# Numpy通常用于加载,维护与预处理数据
import numpy as np
# 需求队列(还有很多其他类型的column)
features = [tf.contrib.layers.real_valued_column("x", dimension=1)]
# estimator是一个前端调用用于训练与评估的接口,这里有非常多预定义的类型,如Linear Regression, Logistic Regression, Linear Classification, Logistic Classification 以及各种各样的Neural Network Classifiers 与 Regressors. 这里我们用的是Linear Regression
estimator = tf.contrib.learn.LinearRegressor(feature_columns=features)
# TensorFlow有提供了许多工具方法来读写数据集,这里我们使用`numpy_input_fn`,我们不得不告诉方法一共有多少组(num_epochs),并且每组有多大(batch_size)
x = np.array([1., 2., 3., 4.])
y = np.array([0., -1., -2., -3.])
input_fn = tf.contrib.learn.io.numpy_input_fn({"x":x}, y, batch_size=4,
                                              num_epochs=1000)
# 我们可以通过传入训练所用的数据集调用1000次`fit`方法来一步步训练
estimator.fit(input_fn=input_fn, steps=1000)
# 评估目前模型训练的怎么样。实际运用中,我们需要一个独立的验证与测试数据集避免训练过渡(overfitting)
estimator.evaluate(input_fn=input_fn)

当然我们也可以通过tf.contrib.learn.Estimator这个高级接口,再使用低级接口来定制Linear Regressor算法模型(实际上内置的tf.contrib.learn.LinearRegressor也是继承自tf.contrib.learn.Estimator的)。当然我们不是通过继承,是通过提供model_fn来告诉他训练的步骤、如果评估等:

import numpy as np
import tensorflow as tf
# 定义需求队列(这里我们只需要一个featurex)
def model(features, labels, mode):
  # 构建线性模型
  W = tf.get_variable("W", [1], dtype=tf.float64)
  b = tf.get_variable("b", [1], dtype=tf.float64)
  y = W*features['x'] + b
  # 定义距离目标变量的距离
  loss = tf.reduce_sum(tf.square(y - labels))
  # 训练子图
  global_step = tf.train.get_global_step()
  optimizer = tf.train.GradientDescentOptimizer(0.01)
  train = tf.group(optimizer.minimize(loss),
                   tf.assign_add(global_step, 1))
  # ModelFnOps用于将各参数串起来
  return tf.contrib.learn.ModelFnOps(
      mode=mode, predictions=y,
      loss=loss,
      train_op=train)
 
estimator = tf.contrib.learn.Estimator(model_fn=model)
# 定义我们的训练用的数据集
x = np.array([1., 2., 3., 4.])
y = np.array([0., -1., -2., -3.])
input_fn = tf.contrib.learn.io.numpy_input_fn({"x": x}, y, 4, num_epochs=1000)
# 训练
estimator.fit(input_fn=input_fn, steps=1000)

# 评估训练模型
print(estimator.evaluate(input_fn=input_fn, steps=10))

识别数字图片的模型训练

该模型训练是通过MNIST数据,使用Softmax Regressio算法训练一个输入784像素的图片,识别出其对应数字的模型。

tensorflow-mnist-2.png

MNIST包含一个手写的数字,就好像:
在这里插入图片描述

这个案例是为了解答:

TensorFlow是怎么工作的?
机器学习的核心思想是什么?
你可以学习到:

MNIST数据、Softmax Regression算法
建立一个可以基于观察图片的每一个像素来识别数字的模型
通过模型浏览上千个案例来训练模型识别数字
通过测试数据,来验证模型的准确度
MNIST数据

数据是在Yann LeCun’s website: http://yann.lecun.com/exdb/mnist/

该数据分为三部分:

通过分离不同的数据,一部分用于训练,一部分用户测试,一部分用于学习,这样才能验证结果是训练的模型自己生成的。

mnist.train: 55_000个数据用于训练
mnist.test: 10_000个数据用于测试
minst.validation: 5_000个数据用于验证
每个数据有两部分:

手写数字的图片(x)(mnist.train.images、mnist.test.images): 28px * 28px = 784px
对应的标签(y)(mnist.train.labels、mnist.test.labels)
如数字1:

tensorflow-mnist-3.png

mnist.[train/test].images是一个tensor,由55_000个由784个点的二维数组组成,数组中的每个值代表每个像素点,像素点有色的根据浅到深是0到1,无色为0,每个数组所呈现的数字对应一个label,我们表示为[55000,784] tensorflow-mnist-4.png

minst.[train/test].labels也是一个tensor,由55_000个由10个值的一维数组组成,数组中有且仅有一个为1,其余为0,数组的index表示标签所代表的数字,如3表示为[0,0,0,1,0,0,0,0,0,0]],我们表示为[55000,10] tensorflow-mnist-tensorflow-mnist-6.png

Softmax Regression算法

我们算法要尽量准确的通过图片(784个像素点)所呈现的,让结果中正确的数字所占的比例尽量的高,如给出的图片对应的数字是9,模型运算结果可能是: 80%的概率是9,5%概率是8,15%的概率是其他。

该算法使用场景: 从不同的事件中为一个对象分配可能性,因为该算法给我们一个0到1的列表,并且加起来等于1

大概步骤

总结输入的数据在各种分类中的证据(we add up the evidence of our input being in certain classes)
将证据转化为具体的可能性
做像素强度(intensities)的加权值,当图片的强度(intentsity)与某个分类不一致,其权重为负数,当有强有力的证据证明是在那个分类,其权重为正数

最终的模型权重

蓝色为正数权重,红色为负数

在这里插入图片描述

大致算法

下面算法图形中表示: 第i个类型、第j个像素、W为权重、x为输入的图片、b为偏移量

最终算法公式: y=softmax(Wx y = s o f t m a x ( W x + b)

tensorflow-mnist-7.png

tensorflow-mnist-8.png

tensorflow-mnist-9.png

实现

import tensorflow as tf
 
# 导入mnist数据
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
 
# 定义输入图片(tensor)变量x,其结构为任意个数的784个点的图片
x = tf.placeholder(tf.float32, [None, 784])
 
# 定义训练因素
W = tf.Variable(tf.zeros([784, 10])) # 定义权重W, 10张784个点的图片
b = tf.Variable(tf.zeros([10])) # 定义偏移量,0~9
 
# 导入公式 softmax(W * x + b)
y = tf.nn.softmax(tf.matmul(x, W) + b)
 
# 使用cross-entropy(一个常见的loss模型)来定义结果有多差(定义一个标准,这样Tensorflow才能通过不断减少这个差值,来接近最终我们想要的模型)
y_ = tf.placeholder(tf.float32, [None, 10]) # 定义正确的
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1])) # 导入croos-entropy公式
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy) # 使用"梯度减少"算法通过0.5的减少比率来学习
 
sess = tf.InteractiveSession() # 在InteractiveSession中启动模型
tf.global_variables_initializer().run() # 初始化我们创建的模型
 
# 每一步我们通过训练的集合生成100个随机的数据,通过train_step喂乳数据到图片x与对应的表示的数字y_
for _ in range(1000):
  batch_xs, batch_ys = mnist.train.next_batch(100)
  sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
 
# 验证模型训练结果
 
# tf.argmax(y, 1)是对所有输入模型认为的最有可能的结果,tf.argmax(y_,1)实际上对所有输入最有可能的结果,然后通过tf.equal判断两个是否相等
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
# 由于correct_prediction计算出来的是一个Boolean数组,因此我们要通过tf.cast将其转为float,如[True, False, True, True]应该转为[1, 0, 1, 1]其中1占其中的0.75
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
# 最后输出通过模型计算出来的正确率,这个模型的正确率会在92%左右
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

这边的正确率是92%,是由于我们的模型非常简单,最好的模型能够达到99.7%的正确率,可以看看网上的不同模型的测试结果: http://rodrigob.github.io/are_we_there_yet/build/classification_datasets_results.html

结语

这是本人整理的入门资料,还很粗糙,后续继续完善。

参考链接

  • MNIST For ML Beginners
  • TensorFlow Api Doc
  • Getting Started With TensorFlow

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/126818.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

抖音电商发布2023年食品健康行业8大趋势,新减负、新养生等成为关键词

2022抖音电商食品健康峰会暨年货盛典在杭州成功举行。抖音电商食品健康行业还联合欧睿共同发布了《2023年度食品健康行业趋势洞察报告》。图片来源:抖音电商抖音电商食品健康行业负责人白华在会上透露,过去一年,抖音电商食品健康行业呈现出有…

虚拟机数据库改密码ERROR 1396 (HY000): Operation ALTER USER failed for ‘root‘@‘localhost‘

注:原因为MySql 8.0.11 换了新的身份验证插件(caching_sha2_password), 原来的身份验证插件为(mysql_native_password)。而客户端工具Navicat Premium12 中找不到新的身份验证插件(caching_sha2_password&a…

Java实现多线程

目录 基本概念 1、程序、进程、线程 2、使用线程的优点 3、线程的分类 4、线程的生命周期 多线程的实现方法 1、继承Thread类 2、实现Runnable接口 3、实现Callable接口 4、使用线程池 线程同步 1、同步代码、同步方法 2、同步机制中的锁 3、锁(Lock&…

【电商】电商后台---采购管理模块

从供应商的管理到合同的管理,再到商品系统的模块的介绍、商品价格与税率维护策略,不知不觉已经完成了几篇文章,前期的准备工作完成后,接下来就应该进入到采购管理模块了。 几天来一直在构思如何写,写的内容让大家看过觉…

使用天地图加载Geoserver的图层

一、写在前面 在项目中往往使用地图作为底图(比如 天地图卫星图等),再其上覆盖你的通过geoserver发布自定义图层。本文记录了我的实现方法。 二、过程 2.1 我遇到的难题 遇到难题1:使用无人机拍摄制作的正射影像图有几百MB甚至1个G,直接展示图…

YOLO系列目标检测算法——PP-YOLOE

YOLO系列目标检测算法目录 - 文章链接 YOLO系列目标检测算法总结对比- 文章链接 YOLOv1- 文章链接 YOLOv2- 文章链接 YOLOv3- 文章链接 YOLOv4- 文章链接 Scaled-YOLOv4- 文章链接 YOLOv5- 文章链接 YOLOv6- 文章链接 YOLOv7- 文章链接 PP-YOLO- 文章链接 …

深入浅出面向对象设计模式(Java)

设计模式是什么 设计模式是面向对象的一种思想。 设计模式的基本原则? 单一职责原则开放封闭原则里氏替换原则接口隔离原则依赖翻转原则 基本分类和为什么分为3类? 创建型(怎么优雅创建对象) 结构性(对象的结构&am…

巧用Hibernate 完成多数据库的DDL脚本创建

巧用Hibernate 完成多数据库的DDL脚本创建 spring boot jpa 默认的orm框架就是Hibernate。 由hibernate完成数据库的读写也是主流的方式之一。但是不同数据库之间,建表、建索引的方言语句都有较多差别,很难做到一套SQL在所有数据库上进行执行。 那么Hibe…

C++11之线程库

文章目录一、thread二、mutex三、lock_guard 与 unique_lock1. lock_guard2. unique_lock四、atomic五、condition_variable在 C11 之前,涉及到多线程问题,都是和平台相关的,比如 Windows 和 Linux 下各有自己的接口,这使得代码的…

PHP另类判断 - 数组是一维还是二维

之前有一个需求,需要判断一个数组是一维还是二维数组,如果是二维的话就要使用foreach循环来处理 在网上搜了一下给出来的都是下面所写的方式: if(count($updata) count($updata,1)) {// 一维 } else {// 二维 }首先我要说的是,上…

第三十七章 数论——博弈论(1)

第三十七章 数论——博弈论(1)一、Nim游戏1、题目2、结论3、结论验证4、代码二、集合——Nim游戏1、问题2、思路—SG()函数2、代码实现(记忆化搜索)一、Nim游戏 1、题目 2、结论 这里直接说结论: 假设有nnn堆石子&am…

【LeetCode每日一题】——275.H 指数 II

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 二分查找 二【题目难度】 中等 三【题目编号】 275.H 指数 II 四【题目描述】 给你一个整数数…

Jmeter分布式测试

因为jmeter本身的性能问题,有时候为了尽量模拟业务场景,需要模拟大量的并发请求,此时单台压力机就显得力不从心。针对这个情况,jmeter的解决方案是支持分布式压测,即将大量的模拟并发分配给多台压力机,来满…

三优两重政策解读

什么是三优两重: 优秀大数据产品、优秀大数据解决方案、优秀大数据应用案例和重点大数据企业、重点大数据资源; 1、申报主体 在山东省内注册登记,具备独立承担民事责任的能力,包括各类政府机关、企事业单位及社会组织。 ①.大数据…

【从零开始学习深度学习】33.语言模型的计算方式及循环神经网络RNN简介

目录1. 语言模型1.1 语言模型的计算1.2 nnn元语法的定义2. 循环神经网络RNN2.1 不含隐藏状态的神经网络2.2 含隐藏状态的循环神经网络2.3 应用:基于字符级循环神经网络的语言模型3. 总结1. 语言模型 语言模型(language model)是自然语言处理…

多媒体服务器核心实现(流管理)

多媒体服务器比较多,实现的功能也很复杂,但其核心就是是转协议,流管理,连接管理,就是一个时序状态机和信令结合的系统。现在的生态有很多现成的轮子,c/c go实现的均可以拿来就用,只需要按一定的…

插槽,依赖注入,动态组件,异步组件,内置组件

插槽&#xff1a;父组件和子组件内容的一个通信 子组件使用<slot>接收父组件传入的内容 如果内容有多个标签时&#xff0c;使用<template>包裹 默认插槽&#xff1a; <template v-slot:default><h2>标题</h2><p>插槽内容</p> <…

Windows——编写jar启动脚本和关闭脚本

文章目录前言启动脚本编写关闭脚本restart.bat 重启脚本前言 假设项目打包后&#xff0c;项目结构为&#xff1a; 此时如果需要再windows环境中进行项目的启动或关闭&#xff0c;需要频繁的手敲命令&#xff0c;很不方便。此时可以编写.bat脚本文件进行项目的控制。 启动脚本…

就业信息追踪|基于Springboot+Vue开发实现就业信息追踪系统

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

双向链表,添加,删除一个节点

文章目录前言一、创建双向链表&#xff08;重命名&#xff09;二、添加一个节点1.添加头指针&#xff1a;2.若 头指针为空3.若头指针非空三、删除一个节点1.找到某节点2.将节点从链表中删除四. 展示所有的节点五. 实验效果总结前言 链表有几种&#xff0c;大致分为&#xff1a…