伍佰目录 短网址
  当前位置:海洋目录网 » 站长资讯 » 站长资讯 » 文章详细 订阅RssFeed

Tensorflow基础入门十大操作总结

来源:本站原创 浏览:129次 时间:2022-02-12

TensorFlow 是一个开源的、基于 Python 的机器学习框架,它由 Google 开发,提供了 Python,C/C++、Java、Go、R 等多种编程语言的接口,并在图形分类、音频处理、推荐系统和自然语言处理等场景下有着丰富的应用,是目前最热门的机器学习框架。

但不少小伙伴跟我吐苦水说Tensorflow的应用太乱了,感觉学的云里雾里,能不能搞个Tensorflow的教程呀。今天,就和大家一起梳理下TensorFlow的十大基础操作。详情如下:

一、Tensorflow的排序与张量

Tensorflow允许用户把张量操作和功能定义为计算图。张量是通用的数学符号,代表保存数据值的多维列阵,张量的维数称为阶。

引用相关的库

import tensorflow as tfimport numpy as np

获取张量的阶(从下面例子看到tf的计算过程)

# 获取张量的阶(从下面例子看到tf的计算过程)g = tf.Graph()# 定义一个计算图with g.as_default():    ## 定义张量t1,t2,t3    t1 = tf.constant(np.pi)    t2 = tf.constant([1,2,3,4])    t3 = tf.constant([[1,2],[3,4]])     ## 获取张量的阶    r1 = tf.rank(t1)    r2 = tf.rank(t2)    r3 = tf.rank(t3)     ## 获取他们的shapes    s1 = t1.get_shape()    s2 = t2.get_shape()    s3 = t3.get_shape()    print("shapes:",s1,s2,s3)# 启动前面定义的图来进行下一步操作with tf.Session(graph=g) as sess:    print("Ranks:",r1.eval(),r2.eval(),r3.eval())

二、Tensorflow 计算图

Tensorflow 的核心在于构建计算图,并用计算图推导从输入到输出的所有张量之间的关系。假设有0阶张量a,b,c,要评估  ,可以表示为下图所示的计算图:

可以看到,计算图就是一个节点网络,每个节点就像是一个操作,将函数应用到输入张量,然后返回0个或者更多个张量作为张量作为输出。

在Tensorflow编制计算图步骤如下: 

    1. 初始化一个空的计算图

    2. 为该计算图加入节点(张量和操作)

    3. 执行计算图:

        a.开始一个新的会话

        b.初始化图中的变量

        c.运行会话中的计算图

# 初始化一个空的计算图g = tf.Graph()
# 为该计算图加入节点(张量和操作)with g.as_default():    a = tf.constant(1,name="a")    b = tf.constant(2,name="b")    c = tf.constant(3,name="c")    z = 2*(a-b)+c # 执行计算图## 通过调用tf.Session产生会话对象,该调用可以接受一个图为参数(这里是g),否则将启动默认的空图## 执行张量操作的用sess.run(),他将返回大小均匀的列表wi�漴,����th tf.Session(graph=g) as sess:    print('2*(a-b)+c =>',sess.run(z))

2*(a-b)+c => 1
三、Tensorflow中的占位符

Tensorflow有提供数据的特别机制。其中一种机制就是使用占位符,他们是一些预先定义好类型和形状的张量。

通过调用tf.placeholder函数把这些张量加入计算图中,而且他们不包括任何数据。然而一旦执行图中的特定节点就需要提供数据阵列。

3.1 定义占位符

g = tf.Graph()
with g.as_default():    tf_a = tf.placeholder(tf.int32,shape=(),name="tf_a")  # shape=[]就是定义0阶张量,更高阶张量可以用【n1,n2,n3】表示,如shape=(3,4,5)    tf_b = tf.placeholder(tf.int32,shape=(),name="tf_b")    tf_c = tf.placeholder(tf.int32,shape=(),name="tf_c")    r1 = tf_a - tf_b    r2 = 2*r1    z = r2 + tf_c

3.2 为占位符提供数据

当在图中处理节点的时候,需要产生python字典来为占位符来提供数据阵列。

with tf.Session(graph=g) as sess:    feed = {        tf_a:1,        tf_b:2,        tf_c:3    }     print('z:',sess.run(z,feed_dict=feed))

z: 1

3.3 用batch_sizes为数据阵列定义占位符

在研发神经网络模型的时候,有时会碰到大小规模不一致的小批量数据。占位符的一个功能是把大小无法确定的维度定义为None。


g = tf.Graph()
with g.as_default():    tf_x = tf.placeholder(tf.float32,shape=(None,2),name="tf_x")    x_mean = tf.reduce_mean(tf_x,axis=0,name="mean") np.random.seed(123)with tf.Session(graph=g) as sess:    x1 = np.random.uniform(low=0,high=1,size=(5,2))    print("Feeding data with shape",x1.shape)    print("Result:",sess.run(x_mean,feed_dict={tf_x:x1}))    x2 = np.random.uniform(low=0,high=1,size=(10,2))    print("Feeding data with shape",x2.shape)    print("Result:",sess.run(x_mean,feed_dict={tf_x:x2}))

四、Tensorflow 的变量

就Tensorflow而言,变量是一种特殊类型的张量对象,他允许我们在训练模型阶段,在tensorflow会话中储存和更新模型的参数。

4.1 定义变量

  • 方式1:tf.Variable() 是为新变量创建对象并将其添加到计算图的类。

  • 方式2:tf.get_variable()是假设某个变量名在计算图中,可以复用给定变量名的现有值或者不存在则创建新的变量,因此变量名的name非常重要!

无论采用哪种变量定义方式,直到调用tf.Session启动计算图并且在会话中具体运行了初始化操作后才设置初始值。事实上,只有初始化Tensorflow的变量之后才会为计算图分配内存。

g1 = tf.Graph()
with g1.as_default():    w = tf.Variable(np.array([[1,2,3,4],[5,6,7,8]]),name="w")    print(w)

4.2 初始化变量

由于变量是直到调用tf.Session启动计算图并且在会话中具体运行了初始化操作后才设置初始值,只有初始化Tensorflow的变量之后才会为计算图分配内存。因此这个初始化的过程十分重要,这个初始化过程包括:为 相关张量分配内存空间并为其赋予初始值。
初始化方式:

  • 方式1.tf.global_variables_initializer函数,返回初始化所有计算图中现存的变量,要注意的是:定义变量一定要造初始化之前,不然会报错!!!

  • 方式2:将tf.global_variables_initializer函数储存在init_op(名字不唯一,自己定)对象内,然后用sess.run出来

with tf.Session(graph=g1) as sess:    sess.run(tf.global_variables_initializer())    print(sess.run(w))



# 我们来比较定义变量与初始化顺序的关系g2 = tf.Graph()
with g2.as_default():    w1 = tf.Variable(1,name="w1")    init_op = tf.global_variables_initializer()    w2 = tf.Variable(2,name="w2") with tf.Session(graph=g2) as sess:    sess.run(init_op)    print("w1:",sess.run(w1))

w1: 1

with tf.Session(graph=g2) as sess:    sess.run(init_op)    print("w2:",sess.run(w2))

4.3 变量范围

变量范围是一个重要的概念,对建设大型神经网络计算图特别有用。

可以把变量的域划分为独立的子部分。在创建变量时,该域内创建的操作与张量的名字都以域名为前缀,而且这些域可以嵌套。

g = tf.Graph()
with g.as_default():    with tf.variable_scope("net_A"):   #定义一个域net_A        with tf.variable_scope("layer-1"): # 在域net_A下再定义一个域layer-1            w1 = tf.Variable(tf.random_normal(shape=(10,4)),name="weights")   # 该变量定义在net_A/layer-1域下        with tf.variable_scope("layer-2"):            w2 = tf.Variable(tf.random_normal(shape=(20,10)),name="weights")    with tf.variable_scope("net_B"):   # 定义一个域net_B        with tf.variable_scope("layer-2"):            w3 = tf.Variable(tf.random_normal(shape=(10,4)),name="weights")    print(w1)    print(w2)    print(w3)


五、建立回归模型

我们需要定义的变量:

  • 1.输入x:占位符tf_x

  • 2.输入y:占位符tf_y

  • 3.模型参数w:定义为变量weight

  • 4.模型参数b:定义为变量bias

  • 5.模型输出 ̂ y^:有操作计算得到

import tensorflow  as tfimport numpy as npimport matplotlib.pyplot as plt%matplotlib inline
g = tf.Graph()
# 定义计算图with g.as_default():    tf.set_random_seed(123)    ## placeholder    tf_x = tf.placeholder(shape=(None),dtype=tf.float32,name="tf_x")    tf_y = tf.placeholder(shape=(None),dtype=tf.float32,name="tf_y")    ## define the variable (model parameters)    weight = tf.Variable(tf.random_normal(shape=(1,1),stddev=0.25),name="weight")    bias = tf.Variable(0.0,name="bias")    ## build the model    y_hat = tf.add(weight*tf_x,bias,name="y_hat")    ## compute the cost    cost = tf.reduce_mean(tf.square(tf_y-y_hat),name="cost")    ## train the model    optim = tf.train.GradientDescentOptimizer(learning_rate=0.001)    train_op = optim.minimize(cost,name="train_op")
# 创建会话启动计算图并训练模型## create a random toy dataset for regressionnp.random.seed(0)def make_random_data():    x = np.random.uniform(low=-2,high=4,size=100)    y = []    for t in x:        r = np.random.normal(loc=0.0,scale=(0.5 + t*t/3),size=None)        y.append(r)    return x,1.726*x-0.84+np.array(y)
x,y = make_random_data()
plt.plot(x,y,'o')plt.show()


## train/test splitsx_train,y_train = x[:100],y[:100]x_test,y_test = x[100:],y[100:]
n_epochs = 500train_costs  = []with tf.Session(graph=g) as sess:    sess.run(tf.global_variables_initializer())    ## train the model for n_epochs    for e in range(n_epochs):        c,_ = sess.run([cost,train_op],feed_dict={tf_x:x_train,tf_y:y_train})        train_costs.append(c)        if not e % 50:            print("Epoch %4d: %.4f"%(e,c))plt.plot(train_costs)plt.show()

六、在Tensorflow计算图中用张量名执行对象

只需要把

sess.run([cost,train_op],feed_dict={tf_x:x_train,tf_y:y_train})

改为

sess.run(['cost:0','train_op:0'],feed_dict={'tf_x:0':x_train,'tf_y:0':y_train})

注意:只有张量名才有:0后缀,操作是没有:0后缀的,例如train_op并没有train_op:0

## train/test splitsx_train,y_train = x[:100],y[:100]x_test,y_test = x[100:],y[100:]
n_epochs = 500train_costs  = []with tf.Session(graph=g) as sess:    sess.run(tf.global_variables_initializer())    ## train the model for n_epochs    for e in range(n_epochs):        c,_ = sess.run(['cost:0','train_op'],feed_dict={'tf_x:0':x_train,'tf_y:0':y_train})        train_costs.append(c)        if not e % 50:            print("Epoch %4d: %.4f"%(e,c))

七、在Tensorflow中储存和恢复模型

神经网络训练可能需要几天几周的时间,因此我们需要把训练出来的模型储存下来供下次使用。

储存的方法是在定义计算图的时候加入:saver = tf.train.Saver(),并且在训练后输入saver.save(sess,'./trained-model')


g = tf.Graph()
# 定义计算图with g.as_default():    tf.set_random_seed(123)    ## placeholder    tf_x = tf.placeholder(shape=(None),dtype=tf.float32,name="tf_x")    tf_y = tf.placeholder(shape=(None),dtype=tf.float32,name="tf_y")    ## define the variable (model parameters)    weight = tf.Variable(tf.random_normal(shape=(1,1),stddev=0.25),name="weight")    bias = tf.Variable(0.0,name="bias")    ## build the model    y_hat = tf.add(weight*tf_x,bias,name="y_hat")    ## compute the cost    cost = tf.reduce_mean(tf.square(tf_y-y_hat),name="cost")    ## train the model    optim = tf.train.GradientDescentOptimizer(learning_rate=0.001)    train_op = optim.minimize(cost,name="train_op")    saver = tf.train.Saver()# 创建会话启动计算图并训练模型## create a random toy dataset for regressionnp.random.seed(0)def make_random_data():    x = np.random.uniform(low=-2,high=4,size=100)    y = []    for t in x:        r = np.random.normal(loc=0.0,scale=(0.5 + t*t/3),size=None)        y.append(r)    return x,1.726*x-0.84+np.array(y)
x,y = make_random_data()
plt.plot(x,y,'o')plt.show()
## train/test splitsx_train,y_train = x[:100],y[:100]x_test,y_test = x[100:],y[100:]
n_epochs = 500train_costs  = []with tf.Session(graph=g) as sess:    sess.run(tf.global_variables_initializer())    ## train the model for n_epochs    for e in range(n_epochs):        c,_ = sess.run(['cost:0','train_op'],feed_dict={'tf_x:0':x_train,'tf_y:0':y_train})        train_costs.append(c)        if not e % 50:            print("Epoch %4d: %.4f"%(e,c))    saver.save(sess,'C:/Users/Leo/Desktop/trained-model/')

  • 上一篇: 一份使用工具变量回归的AER文章清单, 思路惊奇定会让你脑洞大开!
  • 下一篇: 教你如何一键批量下载B站bilibili视频,比较简单的方法
  •   推荐站点

    • At-lib分类目录At-lib分类目录

      At-lib网站分类目录汇集全国所有高质量网站,是中国权威的中文网站分类目录,给站长提供免费网址目录提交收录和推荐最新最全的优秀网站大全是名站导航之家

      www.at-lib.cn
    • 中国链接目录中国链接目录

      中国链接目录简称链接目录,是收录优秀网站和淘宝网店的网站分类目录,为您提供优质的网址导航服务,也是网店进行收录推广,站长免费推广网站、加快百度收录、增加友情链接和网站外链的平台。

      www.cnlink.org
    • 35目录网35目录网

      35目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向35目录推荐、提交优秀网站。

      www.35mulu.com
    • 就要爱网站目录就要爱网站目录

      就要爱网站目录,按主题和类别列出网站。所有提交的网站都经过人工审查,确保质量和无垃圾邮件的结果。

      www.912219.com
    • 伍佰目录伍佰目录

      伍佰网站目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向伍佰目录推荐、提交优秀网站。

      www.wbwb.net