TensorFlow—上手篇

TensorFlow—上手篇

1,关于import 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图中。

在这里插入图片描述

具体的栗子如下:

​ 构造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:

在这里插入图片描述

​ 而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]))

训练结果如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/acceptedday/article/details/104014653