机器学习 第一步 我理解的Tensorflow学习方式以及部分功能

先说点什么!

有半个多月没有对学习进行记录了,这段时间一直在学习tensorflow,一直没有找到合适的方式来学习成自己的东西,下面我以自己的方式把tensorflow的学习进行梳理一下。
话不多说,直接进入正题。

什么是tensorflow?

tensorflow是Google的一个新一代的开源机器学习框架(上一代我没有做了解,不是很清楚)。注意,既然是框架,说明架构已经搭建好了,剩下的就是调用这个架构的各个部分(这里的架构不是一个标准化框架的引用植入,而是根据应用者的使用进行各个组件的使用)
其官方首页是:https://tensorflow.google.cn/
支持的语言可以看看:https://tensorflow.google.cn/api_docs/
一句话,学习机器学习的第一步,需要有其支持的语言种类的编程基础,我用的python。还支持其他的语言。剩下的就是选用相应的开发环境和tensorflow的包安装,有很多的开发者做了这方面的详细说明,不再熬述。这里有几点要说明的,算是从中提炼出来的。
1、关于使用系统Ubuntu 16.04 or later:这个,怎么说,在后续的开发使用上,很重要,我还没有去在这个平台上做个编程,据说是必修的,这个在我实战的时候,我再去研究。Raspbian 9.0 or later:这个我去了解了下是树莓派,算是一个小型化的监测系统衍生出来的系统,这个点,说明,tensorflow的应用可以在硬件上做,机器学习设备可以成为独立的智能设备来应用。(我是做硬件的,有六年工作经验,这块儿,我准备接下来可以去做一个开发板,供学习使用)
2、在使用python(我使用的是python,其他的朋友需要了解的话,可以去百度下tensorflow的对其他平台的安装要求)解释器的时候,安装最新的3.7.1是装不上tensorflow的,因为,tensorflow对解释器的要求版本为:Requires Python 3.4, 3.5, or 3.6。所以,版本回滚。
3、顺便提一下,我使用的是:Win7+Pycharm+Python3.6。在新建工程的时候,会创建一个虚拟环境文件夹,不是真的虚拟,是存在的,用于存放当前项目的库、包,以及环境变量(个人这样理解的)。之前,我不习惯这样,每一次新建都要重新安装下包,因为这个项目下载安装的包,其他项目不能使用,所以就有点麻烦,我便改了配置,不使用项目中的虚拟文件夹,直接使用的是python3.6的解释器,将所有的包装在了它下面的目录中,在pycharm的设置中,路径指向解释器地址即可,这里每次新建就不用重新安装。不过,有网友称这样也有弊端,包版本升级以后,内部的项目内容不一定适用了,需要调整原来的代码,我觉得没有那么麻烦,不过,后面确实觉得有点麻烦。毕竟,我们对版本更新的说明没有去关注,这个工作量就有点大,所以又改了回来。说这么多,就是还是与大家共勉,这个还是使用推荐的,包跟着项目走。

tensorflow怎么学习的?

先介绍下tensorflow的学习方式,用一种面向行为的描述:
1、学习对象:就是让tensorflow要学习的内容,有官方的图片啊,数字啊,语言啊,预测啊,这些我成他们为数据集。在让tensorflow学习之前要先准备这些--喂--它的东西,可以从Google的官网数据集进行下载,也可以自己去网上爬一些东西(上个月我学习爬虫就是为了这个tensorflow的食物)。
2、给定学习模型:这里是需要给它很多个苹果实物(训练数据),然后告诉它,这是苹果名称(训练值)。然后在给它做测试,再给他一个苹果(测试数据),问它是什么,它回答是苹果(测试值),与实物(实际值)一致,说明它就学会了。这个模型就是他学习的基础。
在上述的第2条中,其实隐含了另外几个方面:
a、训练过程中,tensorflow的学习理解的错误计算(损失);
b、对tensorflow的学习进行纠正的过程(优化);

学习tensorflow的什么?

tensorflow算是几个主流的机器学习框架之一。既然是框架,我们肯定是学习这个框架的使用了。不过这个框架是以组件形式来根据需求使用选择。都有哪些组件,什么情况下使用。下面,我还是按照官方网站给的介绍进行说明,一个个字码出来,算是对我自己的强化记忆。
下面用一个很简单的项目来进行说明。这个案例在网上很多,也是很好理解的一种方式。
1、准备数据(用已知方程数据进行学习数据集的模拟,也方便于对学习结果的误差监测和预测)
# 导入包
import tensorflow as tf
import numpy as np

# 说明:解决“Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2”问题报错
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

# 定义参数
startValue = -1
stopValue = 1
numbersValue = 40
parameter1 = -1.728
parameter2 = 3.316

# 提供训练数据,创建x取值
xi = np.linspace(startValue, stopValue, numbersValue, dtype=np.float32)
# 调整训练数据维数
xi = xi[:, np.newaxis]
# 增加噪声,调整维数
noise = np.random.random(numbersValue)[:, np.newaxis]
# 提供训练值,调整维数
yi = parameter1 * np.square(xi) + parameter2 + noise
2、准备自变量(数学的说法),在机器学习中,可以称为特征变量。
# 上面已经给定了一个二元一次方程,我们用这个方程对应点的坐标数据作为训练数据和训练值来训练,
# 学习的目标是:最终要将两个参数parameter1和parameter2训练出来是否为-5.728和18.316。

# 这里可以理解为定义两个形参:外部数据传入的入口,使用占位符placeholder来申明
x_input = tf.placeholder(dtype=tf.float32, shape=[None, 1], name="x_input")
y_input = tf.placeholder(dtype=tf.float32, shape=[None, 1], name="y_input")
3、有了数据集,有了数据传递接口,剩下就是需要考虑往哪里传,在tensorflow中,数据需要往神经网络中传,目的就是在网络中进行运算,这里有必要配上一定的计算方式,和数据的处理方式。
# 对于学习的网络层可以分为:输入层,中间隐藏层,输出层
def add_layer(inputs, in_size, out_size, activation_function=None):
    # 这里是对要求的两个参数进行定义,因为需要反向传播,进行多次调整,所以,设置为变量
    weights = tf.Variable(tf.random_normal([in_size, out_size]))
    biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)
    # 这里是学习模型的建立,这个很重要,要是对模型的建立错误,可能就找不到合适的学习结果
    wx_plus_b = tf.matmul(np.square(inputs), weights) + biases
    # 这个是激励函数,简单的理解,就是一个非线性的调整,
    if activation_function is None:
        outputs = wx_plus_b
    else:
        outputs = activation_function(wx_plus_b)
    return outputs
# 这是说明:输入层输入数据为x_input,输入特征变量为1个,输出为10个变量,处理这些变量中数据的神经单元为tf.nn.relu
inlayer = add_layer(x_input, 1, 10, activation_function=tf.nn.relu)
# 这是说明:这一层的输入层输入上一层的输出,本层的输入特征变量为上一层输出的10个,本层的输出为1个神经单元,这些输出的数据不需要处理,所以就None。
outlayer = add_layer(inlayer, 10, 1, activation_function=None)
4、数据在网络中执行完了之后就需要输出了,对于学习,肯定需要一个反复修正的过程,那么这里就有两个问题,一个是怎么判断误差损失,另一个就是怎么来反复修复这个误差。先来看看误差:使用输出的数与测试值进行差方求和后再求平均。
# 计算预测值和真实值的误差,对二者差的平方求和再取平均。
# 计算损失:input_tensor:待处理的tensor
loss = tf.reduce_mean(input_tensor=tf.reduce_sum(tf.square(y_input-outlayer), reduction_indices=[1]))
然后,对这个损失确定优化方式:下面的代码怎么理解:调用tf.train中的优化器进行优化,优化的速率按照0.5来执行,优化的方向是朝着loss最小的方向进行优化,就是减小损失的值,使得这个训练更靠近真实结果。
# 优化方式:梯度下降优化(除了这种优化方式,还有AdagradOptimizer,MomentumOptimizer等)
trainOptimizer = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
5、整个组件差不多了,剩下就可以开始执行了,对于这些代码而言,并没有说,代码有了就可以执行。python中对于执行需要一定的条件,第一点,就是要会话实例,其次就是对所有的变量进行初始化,然后才能执行你需要的训练方式。
# 创建会话
sess = tf.Session()
# 定义一个可以调用的初始化函数
initvar = tf.initialize_all_variables()
# 通过会话运行这个初始化,完成执行训练的前期准备过程
sess.run(initvar)
# 对于上面的代码有一个问题就是,没有做到对会话的资源释放,需要sess.close(),可以使用如下操作:
# with tf.Session() as sess:
#	sess.run( tf.initialize_all_variables())
# 在推出的时候还是会自行的关闭资源,隐含了sess.close()操作
6、现在就将执行的结果打印一些:
for i in range(1000):
    sess.run(trainOptimizer, feed_dict={x_input: xi, y_input: yi})
    # 每50步我们输出一下机器学习的误差
    if i % 20 == 0:
        print(sess.run(loss, feed_dict={x_input: xi, y_input: yi}))
看到损失越来越小,则意味着学习过程是有效的。

对于数据的可视化

构建图形,用散点图描述真实数据之间的关系。

from matplotlib import pyplot as plt

# 创建视图窗口
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)

# 绘制点图
ax.scatter(x_data, y_data)
# l = plt.plot(x_data, y_data, 'ro')
plt.ion()
# plt.show()    # 下面要画图的时候这个要注释掉
# 接下来,我们来显示预测数据。
# 每隔50次训练刷新一次图形,用红色、宽度为5的线来显示我们的预测数据和输入之间的关系,并暂停0.1s。

for i in range(1000):
    # training
    sess.run(train_step, feed_dict={xs: x_data, ys: y_data})
    if i % 50 == 0:
        # to visualize the result and improvement
        try:
            ax.lines.remove(lines[0])
        except Exception:
            pass
        prediction_value = sess.run(prediction, feed_dict={xs: x_data})
        # plot the prediction
        lines = ax.plot(x_data, prediction_value, 'r-', lw=5)
        plt.pause(0.1)

tensorboard

这个工具的用法,就是对变量,操作,占位符使用:with tf.name_scope(‘name’):注意缩进
最后

#最后合并所有的
merged = tf.summary.merge_all()
# 将写入文件到 相对路径下:logs_his/
writer = tf.summary.FileWriter("logs_his/", sess.graph)

在终端出窗口进入,logs_his/的上一级,输入以下的命令:
tensorboard --logdir=’logs_his/‘
在输出的网站复制到浏览器打开。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值