从零开始学TensorFlow
前言
只有光头才能变强。
文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y

最近在学习TensorFlow的相关知识,了解了TensorFlow一些基础的知识,现在周末有空了,就写写一些笔记,记录一下自己的成长~
总的来说,TensorFlow还是一个比较新的技术,有兴趣的同学不妨跟着我的笔记,一起学学呗(反正没坏处)~
前面回顾:
知识背景:没有Python基础,没有机器学习基础,可以说是真正从零学TensorFlow的了。
一、安装Tensorflow所需要的环境
1.1安装Python环境
使用环境:Mac
Python有好多个版本,在Mac中自带的Python版本是2.7,但相对而言比较老了。现在一般用Python3.x了,本次下载的版本是3.5.6
我安装Python所使用方法的大致步骤:
- 安装Homebrew
- 安装pyenv
- 在
.bash_profile添加环境变量 - 让环境变量生效
- 安装
3.X版本python
详情可参考如下的链接(总的来说,我根据下面的教程一下子就安装了我想要的Python版本,还是非常不错的。):
- Mac下安装多版本python:
- pyenv相关的命令(常用的pyenv命令):
在安装Python的时候也发现了一个小知识点:
- Mac一般使用bash作为默认的shell,会有好几个环境变量,其中
etc/profile是系统级的,还有几个用户级别的环境变量,比如说:~/.bash_profile - 如果修改的是系统级别的环境变量,也就是
etc/profile,在保存的时候只能是:wq!覆盖,不然会出现readonly错误
(至于TensorFlow和numpy依赖的下载,这里我就不说了,就两条命令就搞掂啦)
1.2PyCharm编辑器
Java有IDEA神器,同样的,Python也有PyCharm,同样是JetBrains出产的。
我在之前从来没使用过PyCharm,也没写过一句的Python代码。
把Pycharm安装好了之后,我想当然就new project去用了,然后就next,next,next,当成IDEA来用。但发现了一个问题:我在之前明明装好了TensorFlow和numpy的依赖,在PyCharm环境下却识别不出来!在命令行窗口下,依赖是存在的!
后来才发现:如果用PyCharm去new一个project,会默认建一个解析器在当前的项目目录下。而PyCharm会遵守“就近原则”使用当前项目路径下的解析器。而我们添加的依赖(TensorFlow、numpy)是在我们安装Python的路径下的,这就导致了在命令行下找到依赖,而在PyCharm中找不到依赖。
解决也很简单:在PyCharm指定一下我们安装Python的路径,切换一下就好了。
参考资料:
- 关于pip安装第三方库,但pycharm中却无法识别的问题;以及pycharm安装第三方库的方法解析
二、体验TensorFlow
好的,我们现在已经安装好TensorFlow所需要的环境了!(看起来好简单,但还是花了我不少时间....)
官网的Demo链接(需要科学上网):
首先我们来看一下这个例子可以干些什么:我们有非常多张的图片(数据集),这些图片有不同的类型(比如衣服、鞋子、裤子,一共有10种类型),把这些数据集扔进我们的神经网络里头,生成出模型。有了模型以后,当我们再将类似的图片扔进去,这个模型可以帮我们预测这张图片是衣服还是鞋子还是裤子。

随后,我跟着官网的代码跑了一(代码我都只是一步一步复制粘贴),最后跑起来:
# TensorFlow and tf.keras
import tensorflow as tf
from tensorflow import keras
# Helper libraries
import numpy as np
print(tf.__version__)
# 加载数据、区分出测试数据和训练数据
# 注意:如果已经下过,重复下载的话,可能会出现EOFError: Compressed file ended before the end-of-stream marker was reached错误
fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
# 分类的列表
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
# 查看数据的值
print(train_images.shape) # 样本的shape(可以看出有多少条样本、维度)
print(len(train_labels)) # label的个数,有多少个样本,就应该有多少个label
print(train_labels) # label的值,对应上面分类列表(从0到9)
# 对测试数据和训练数据进行预处理(实际上就是归一化)
train_images = train_images / 255.0
test_images = test_images / 255.0
# 设置层 (初始处理)--- 建立神经层
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(128, activation=tf.nn.relu),
keras.layers.Dense(10, activation=tf.nn.softmax)
])
# 损失函数、优化器、指标
model.compile(optimizer=tf.train.AdamOptimizer(),
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 将训练集丢进去,训练出模型(Model)
model.fit(train_images, train_labels, epochs=5)
# 将测试数据丢到模型中,评估一下得分(准确率)
test_loss, test_acc = model.evaluate(test_images, test_labels)
print('Test accuracy:', test_acc)
# 评估完准确率以后,我们可以对测试数据进行预测
predictions = model.predict(test_images)
# 选第一个样本预测后的得出最有可能结果
print(np.argmax(predictions[0]))
# 对比结果
print(test_labels[0])
跑出来的结果:
(后期注释:这是TensorFlow的版本)
1.12.0
(后期注释:这是TensorFlow下载数据集的日志)
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz
32768/29515 [=================================] - 0s 3us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz
26427392/26421880 [==============================] - 12s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz
8192/5148 [===============================================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz
4423680/4422102 [==============================] - 2s 0us/step
(后期注释:样本的shape)
(60000, 28, 28)
(后期注释:样本有多少条,对应的label就有多少条)
60000
(后期注释:label的值是从0-9,表示有九种类别)
[9 0 0 ... 3 0 5]
(后期注释:开始训练)
Epoch 1/5
2019-02-19 14:00:46.842852: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
60000/60000 [==============================] - 4s 65us/step - loss: 0.4995 - acc: 0.8246
Epoch 2/5
60000/60000 [==============================] - 4s 62us/step - loss: 0.3734 - acc: 0.8655
Epoch 3/5
60000/60000 [==============================] - 4s 63us/step - loss: 0.3346 - acc: 0.8788
Epoch 4/5
60000/60000 [==============================] - 4s 63us/step - loss: 0.3102 - acc: 0.8861
Epoch 5/5
60000/60000 [==============================] - 4s 63us/step - loss: 0.2918 - acc: 0.8916
10000/10000 [==============================] - 0s 36us/step
(后期注释:预测出来的精确度)
Test accuracy: 0.8514
(后期注释:选第一个样本进行预测,并对比实际的结果)
9
9
参考资料:
- TensorFlow官网的例子(需要科学上网才能进..)
- Tensorflow学习笔记之一:训练你的第一个神经网络——基础分类
2.1总结一下使用TensorFlow的步骤
- 加载数据:使用dataset的api加载数据,并将数据集分成训练数据和测试数据
- 检查数据:检查dataSet的数据有没有问题(例如,样本的记录数、label的记录数等)
- 对数据预处理:对测试数据和训练数据进行归一化处理,目的:减少因为数值的大小所带来的影响(一般我们会将值都缩小在一个小的范围内)
- 建立神经网络:(输入层、隐藏层、输出层)
- 为模型定义损失函数、优化器、指标
- 将训练数据丢进我们的神经网络中,生成出Model
- 将测试数据丢进我们生成好的Model进行评估,预测出我们的准确率
三、TensorFlow介绍
3.1什么是TensorFlow
如果去Google搜关键字“TensorFlow”,那可能你会看到这么一句话:
An open source machine learning framework for everyone.
没错,TensorFlow就是一个机器学习的框架。至于框架,相信大家也比较好理解了;类比到Java,比如说我们的Spring框架给我们封装了好多好用的API,简化我们的开发(想想当年写Servlet的时候!)
TensorFlow作为机器学习的框架,同样也给我们封装了好多好用的API,能够降低学习机器学习的门槛。
- 就拿上面的例子来说,没想到那么少的代码就可以跑机器学习的“HelloWorld”了!
至于机器学习和神经网络的相关基础,我强烈建议读读这两篇文章!通俗易懂的科普文章:
3.2TensorFlow的架构
我们可以发现上面的Demo所用的基础语言是Python,但不要认为TensorFlow就是Python的一个框架。我看到过一个比喻,觉得写得挺好的,粘贴一下:
Python 和 Tensorflow 之间的联系,可以类比 Javascript 和 HTML 之间的关系。Javascript 是一种全功能的编程语言,可以实现各种出色的效果。HTML 是用于表示某种类型的实用计算抽象(这里指的是可由 Web 浏览器呈现的内容)的框架。Javascript 在交互式网页中的作用是组装浏览器看到的 HTML 对象,然后在需要时通过将其更新为新的 HTML 来与其交互。
下面再来看看TensorFlow的架构图(Python只是对TensorFlow进行了封装)

TensorFlow的引擎也是分了很多模块的(这里我们简单了解一下):

最后
总结一下这篇文章:
- 安装TensorFlow必要的环境
- 跟着官方文档,体验一下TensorFlow(机器学习)的“HelloWorld”
- 根据给出的例子,猜出使用TensorFlow(机器学习)时需要做哪些步骤
- TensorFlow就是一个机器学习(深度学习)的框架,提供了很多实用的API方便我们去玩机器学习(深度学习)。
相信看到这里,很多人都跟我之前一样,一脸懵逼。对官方给出的例子中的API不熟悉,去查阅相关资料的时候又发现有好多机器学习相关的术语,对这些术语又不了解。然后就循环懵逼..
while(true){
// 循环懵逼..
}
其实回想刚学Java的时候,也是这么一个过程,当你从屏幕看到“HelloWorld”了以后,大概率来说也是不了解相关的API具体做了什么事(甚至连API都不知道是啥意思)。但花一段时间去学习了以后,就会发现,原来HelloWorld是真的简单!
public static void main(String[] args) {
System.out.println("Hello World");
}
后续我会继续更新我学习TensorFlow时的一些笔记,有兴趣的小伙伴不妨跟着我一起学习~
另外,从文章的开头我也已经说了,我对Python、机器学习都是没有相关基础的,如果有写错的地方不妨在评论区留言指正。
下一篇预告:TensorFlow是什么意思?Tensor?Flow?介绍TensorFlow一些最基础的知识以及常见的机器学习术语。
乐于输出干货的Java技术公众号:Java3y。公众号内有200多篇原创技术文章、海量视频资源、精美脑图,不妨来关注一下!

觉得我的文章写得不错,不妨点一下赞!
从零开始学TensorFlow的更多相关文章
- 从零开始学 Java - Spring 集成 Memcached 缓存配置(二)
Memcached 客户端选择 上一篇文章 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)中我们讲到这篇要谈客户端的选择,在 Java 中一般常用的有三个: Memc ...
- 从零开始学 Java - Spring 集成 ActiveMQ 配置(一)
你家小区下面有没有快递柜 近两年来,我们收取快递的方式好像变了,变得我们其实并不需要见到快递小哥也能拿到自己的快递了.对,我说的就是类似快递柜.菜鸟驿站这类的代收点的出现,把我们原来快递小哥必须拿着快 ...
- 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)
硬盘和内存的作用是什么 硬盘的作用毫无疑问我们大家都清楚,不就是用来存储数据文件的么?如照片.视频.各种文档或等等,肯定也有你喜欢的某位岛国老师的动作片,这个时候无论我们电脑是否关机重启它们永远在那里 ...
- 从零开始学 Java - 我放弃了 .NET ?
这不是一篇引起战争的文章 毫无疑问,我之前是一名在微软温暖怀抱下干了近三年的 .NET 开发者,为什么要牛(sha)X一样去搞 Java 呢?因为我喜欢 iOS 阿!哈哈,开个玩笑.其实,开始学 Ja ...
- 从零开始学 Java - Spring 集成 ActiveMQ 配置(二)
从上一篇开始说起 上一篇从零开始学 Java - Spring 集成 ActiveMQ 配置(一)文章中讲了我关于消息队列的思考过程,现在这一篇会讲到 ActivMQ 与 Spring 框架的整合配置 ...
- 从零开始学Python07作业思路:模拟人生小游戏
标签(空格分隔): 从零开始学Python 一,作业说明 模拟人生: 1 定义三个人物,屌丝John,美女Liz,高富帅Peter. John和Liz大学时是恋人,毕业工作后,Liz傍上了Peter, ...
- 从零开始学 Java - 利用 Nginx 负载均衡实现 Web 服务器更新不影响访问
还记得那些美妙的夜晚吗 你洗洗打算看一个小电影就睡了,这个时候突然想起来今天晚上是服务器更新的日子,你要在凌晨时分去把最新的代码更新到服务器,以保证明天大家一觉醒来打开网站,发现昨天的 Bug 都不见 ...
- 从零开始学 Java - log4j 项目中的详细配置
你还会用笔来写字么 我是不怎么会了,有时候老是拿起笔之后不知道这个字怎么写,这时候就会拿起手机去打出来:有时候还会写出来这个字之后越看越不像,这时候就开始怀疑自己的能力了:有时候写出来了一大堆字之后, ...
- 从零开始学 Java - Spring 支持 CORS 请求踩的坑
谁没掉进过几个大坑 记得好久之前,总能时不时在某个地方看到一些标语,往往都是上面一个伟人的头像,然后不管是不是他说的话,下面总是有看起来很政治正确且没卵用的屁话,我活到目前为止,最令我笑的肚子痛得是下 ...
随机推荐
- String 类的函数实现
#include<iostream> //#include<string> using namespace std; class Strings { public: Strin ...
- Python 描述符是什么?以及如何实现
先看一个例子,@property.被@property修饰的成员函数,将变为一个描述符.这是最简单的创建描述符的方式. class Foo: @property def attr(self): pri ...
- selenium+python自动化测试
F12: 右键 选择复制 path 在selenium+python自动化测试(一)–环境搭建中,运行了一个测试脚本,脚本内容如下: from selenium import webdriver ...
- KVM内核文档阅读笔记
KVM在内核中有丰富的文档,位置在Documentation/virtual/kvm/. 00-INDEX:整个目录的索引及介绍文档. api.txt:KVM用户空间API,所谓的API主要是通过io ...
- HTML学习之制作导航网页
前言 今天用HTML写了一个网址导航,源代码如下: <html> <head> <title>网址导航</title> </head> &l ...
- OAuth 2 开发人员指南
这是支持OAuth2.0的用户指南.对于OAuth1.0,一切都是不同的,所以看它的用户指南. 本用户指南分为两个部分,第一部分是OAuth2.0提供端(OAuth 2.0 Provider),第二部 ...
- JavaScript Math 对象的常用方法
JavaScript Math 对象 Math 对象 Math 对象用于执行数学任务. 使用 Math 的属性和方法的语法: var pi_value=Math.PI; var sqrt_value= ...
- win 上安装cad2002的心得
前不久,一从事测绘的哥们来找我,要我给她装一专业软件,想想应该很简单,不知为何把他难成这样,他极力要求安装xp系统,说是只有xp上才能装成功,我不信这个邪,查了许多资料发现win 7根本不兼容cad2 ...
- 安卓---TextVies、Button、EditText
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...
- 【源码】otter工程结构
最近在搞数据同步相关的内容,需要对otter的代码进行扩展,所以需要先熟悉一下otter的源码.首先我们整体来看下otter的工程结构.otter的工程结构比较复杂,需要花费一定的时间来理解各个部分的 ...