欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

TensorFlow—上手篇

程序员文章站 2022-04-21 15:00:13
...

TensorFlow—上手篇

1,关于import tensorflow的报错问题:

TensorFlow—上手篇

根据显示的文件路径找到相应的文件,采用sublime_text编辑(因为用这个可以看到行号,用其他的文本编辑也可以显示行号找到对应位置即可),找到行号为523的位置,将如下内容:

_np_qint8 = np.dtype([(“qint8”, np.int8, 1)])

修改为:

_np_qint8 = np.dtype([(“qint8”, np.int8, (1,))])

2,关于tensorflow的结构概念问题:

定义如下:

​  使用图(graphs)来表示计算任务

​  在被称之为会话(Session)的上下文(context)中执行图

​  使用tensor表示数据

​  通过变量(Variable)维护状态

​  使用feed和fetch可以为任意的操作赋值或者从其中获取数据

​ tensorflow主要由4个部分组成,Tensor数据层,variable变量层,operation操作层,以上三层组合为graph,最后将graph封装在Session图中。

TensorFlow—上手篇

具体的栗子如下:

​ 构造2个矩阵作为tensor层,乘法作为操作层,结果的计算作为graph,用默认的Session图封装并调用。

#导入tensorflow库
import tensorflow as tf
#定义2个矩阵作为tensor数据层
m1=tf.constant([[2,3]])
m2=tf.constant([[2],[3]])
#调用matmul作为operation操作层,并且pro作为gragh
pro=tf.matmul(m1,m2)
#采用Session默认图,通过ss封装并调用graph(pro)
with tf.Session() as ss:
    res=ss.run(pro)
    print(res)

最终显示结果为:

​ [[13]]

3,关于Variable的语法问题:

1.如何进行variable的赋值?

​ 采用tensorflow.Variable()赋值:

import tensorflow as tf
#定义一个自变量x1
x1=tf.Variable([2,3])
#定义一个常量m1
m1=tf.constant([2,3])
#定义一个op减法
op1=tf.subtract(x1,m1)
#定义一个op加法
op2=tf.add(x1,op1)
#初始化全局变量
init=tf.global_variables_initializer()
#使用默认图Session()
with tf.Session() as sess:
    sess.run(init)
    print(sess.run(op1))
    print(sess.run(op2))

​ 显示结果为:

​ [0 0] [2 3]

2.使用tensorflow实现累加操作?

​ 采用tensorflow.assign()进行赋值更新操作:

#实现0~5的自加
x2=tf.Variable(0)
m2=tf.constant(1)
res=tf.add(x2,m2)
#使用assign()进行赋值的更新
update=tf.assign(x2,res)
init=tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    for _ in range(5):
        sess.run(update)
        print(sess.run(x2))

​ 显示结果为:

​ 1 2 3 4 5

3.思考题?

​ 如果将print(sess.run(x2))改为print(sess.run(res)),或者print(sess.run(update))的显示结果是什么?

​ print(sess.run(res))的显示结果为:2 3 4 5 6

​ 原因在于:每次多加了一个m2。

​ print(sess.run(update))的显示结果为:2 4 6 8 10

​ 原因在于:每次多加了一个m2的基础上还多加了之前上一轮的x2。

4,fetch和feed是什么东西?

​ fetch,主要用于一次运行多个op:

TensorFlow—上手篇

​ 而feed是什么呢?

​ feed,用于在调用graph时再向op输入实参,与fetch需要提前输入实参不同:

#fetch
in1=tf.placeholder(tf.int32)
in2=tf.placeholder(tf.int32)
op1=tf.multiply(in1,in2)
#init=tf.global_variables_initializer()
with tf.Session() as sess:
    #sess.run(init)
    #feed数据以字典形式传入
    print(sess.run(op1,feed_dict={in1:21,in2:23}))

4,如何写一个简单的二次函数训练模型?

​ 1.原始数据x_data采用numpy.random.rand()随机生成。

​ 2.y_data采用自定义(得到精准的k,b),以及对k,b进行变量类型的定义。

​ 3.写出预测值y,k,b,x_data之间的函数关系式。

​ 4.定义损失代价函数loss。

​ 5.定义梯度下降优化器,设置学习率(0<学习率<1)。

​ 6.最小化代价函数optimizer.minimize(loss)。

​ 7.初始化全局变量,k和b。

​ 8.使用默认图Session(),调用graph成员cost,进行重复训练。

​ 9.每训练30次,打印k和b,以及loss的值。

#梯度下降训练线性模型
x_data=np.random.rand(100)
y_data=0.1*x_data*x_data+0.2
k=tf.Variable(0.)
b=tf.Variable(0.)
y=k*x_data*x_data+b
#定义二次损失代价函数
loss=tf.reduce_mean(tf.square(y-y_data))
#定义优化器
optimizer=tf.train.GradientDescentOptimizer(0.3)#0.3作为梯度下降的学习率
#最小化代价函数
cost=optimizer.minimize(loss)
#初始化变量
init=tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    for _ in range(300):
        sess.run(cost)
        if _%30==0:
            print(_,sess.run([k,b,loss]))

训练结果如下:
TensorFlow—上手篇

相关标签: tensorflow