【笔记】莫烦PYTHON | Tensorflow教程——Tensorflow基础构架(第二章)

2.1 处理结构


        Tensorflow首先要定义神经网络的结构,然后再把数据放入结构当中进行运算和训练。我们要做得就是要建立一个这样的结构,然后把数据放进去,之后tensorflow就可以自己运行,tensorflow字面意思翻译过来就是向量在里面飞。

        从输入层输入数据,数据飞到隐藏层再到输出层,用梯度下降法处理,完成对几个参数的更新,用更新之后的参数再次应用到隐藏层中去学习,不停的循环直至结果收敛。
        TensorFlow是采用数据流图(data flow graphs)来计算,所以首先我们得创建一个数据流流图,然后再将我们的数据(数据以张量(tensor)的形式存在)放在数据流图中计算。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。训练模型时tensor会不断的从数据流图中的一个节点flow到另一节点,这就是TensorFlow名字的由来。

Tensor 张量意义
张量有多种:
零阶张量:纯量/标量(scalar),是一个数值,比如[1]
一阶张量:向量(vector)一维
二阶张量:矩阵(matrix)二维
等等

2.2 例子2

#加载这两个模块,并使用numpy来创建我们的数据
import tensorflow as tf 
import numpy as np #科学计算的模块

# create data
x_data = np.random.rand(100).astype(np.float32) #随机生成100个数,定制成float32的形式
y_data = x_data*0.1 + 0.3

###开始创建结构###
Weights = tf.Variable(tf.random_uniform([1], -1.0, 1.0)) #随机生成一个1维的-1到1的范围的数
biases = tf.Variable(tf.zeros([1])) #定义w和b,b初始定义为0的1维数

y = Weights*x_data + biases #拟合公式y,预测的y

loss = tf.reduce_mean(tf.square(y-y_data)) #误差公式loss,预测值y和真实值y_data的差

optimizer = tf.train.GradientDescentOptimizer(0.5) #使用GradientDescentOptimizer优化器,学习效率<1
train = optimizer.minimize(loss) #用优化器减小误差

# init = tf.initialize_all_variables() # tf 马上就要废弃这种写法,用下面这种
init = tf.global_variables_initializer()  #初始化结构
###结束创建结构###

sess = tf.Session() #session像一个指针,指向要处理的地方
sess.run(init)          # Very important,激活init

for step in range(201): #训练201步
    sess.run(train) #要训练train,也就是optimizer
    if step % 20 == 0:
        print(step, sess.run(Weights), sess.run(biases)) #每20步打印一次结果,sess.run指向w和b并输出

 结果:

2.3 Session 会话控制

        Session是Tensorflow为了控制、输出文件的执行语句。运行session.run()可以得到运算结果。
Session的两种打开方式

import tensorflow as tf

# create two matrixes
matrix1 = tf.constant([[3,3]]) #行向量
matrix2 = tf.constant([[2],
                       [2]]) #列向量
product = tf.matmul(matrix1,matrix2) #矩阵乘法 matrixl multiply,在numpy中是np.dot(matrix1,matrix2)

# method 1
sess = tf.Session() #Session是一个object,首字母要大写
result = sess.run(product) #因为product不是直接计算的步骤,所以需要Session来激活product并得到计算结果,这是Tensorflow的思考模式
print(result)
sess.close() #有没有都可以,写上会显得比较完整

# method 2
with tf.Session() as sess: #我们打开tf.Sesssion并命名成sess,再执行下面的代码,执行完之后自动关闭,不需要手动close
    result2 = sess.run(product)
    print(result2)

 结果:

2.4 Variable 变量


在定义变量上python与tensorflow不同
tensorflow语法:state = tf.Variable()
如果在tensorflow中定义了变量,那么一定要初始化变量:init = tf.initialize_all_variables() # tf 马上就要废弃这种写法,用下面这种
init = tf.global_variables_initializer()

import tensorflow as tf

state = tf.Variable(0, name='counter') #定义一个变量,令他的初始值为0,命名为counter

# 定义常量one 初始值为1
one = tf.constant(1)

# 定义加法步骤 (注: 此步并没有直接计算)
new_value = tf.add(state, one)

# 将 State 更新成 new_value,把new_value加到state上
update = tf.assign(state, new_value)

# 如果定义 Variable, 就一定要用 initialize
# init = tf.initialize_all_variables() # tf 马上就要废弃这种写法
init = tf.global_variables_initializer()  # 替换成这样就好

# 使用 Session
with tf.Session() as sess:
    sess.run(init) #执行 初始化所有的变量
    for _ in range(3):
        sess.run(update) #执行update
        print(sess.run(state)) #执行state并打印

2.5 Placeholder 传入值


        placeholder是tensorflow的占位符,暂时存储变量,tensorflow要从外部传入数据,就要用到placeholder。
        要给节点输入数据时用 placeholder,在 TensorFlow 中用placeholder 来描述等待输入的节点,只需要指定类型即可,然后在执行节点的时候用一个字典来“喂”这些节点。相当于先把变量 hold 住,然后每次从外部传入data,注意 placeholder 和 feed_dict 是绑定一起用的。
feed机制:给feed提供数据,作为run()调用的参数,feed只在调用它的方法内有效,方法结束,feed就会消失。
语法:

tf.placeholder()
sess.run(xxx,feed_dict={input:xx})
import tensorflow as tf

#在 Tensorflow 中需要定义 placeholder 的 type ,一般为 float32 形式
input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)

# mul = multiply 是将input1和input2 做乘法运算,并输出为 output 
ouput = tf.multiply(input1, input2)

#传值工作交给sess.run(),需要传入的值放在了feed_dict={},并一一对应每一个input
with tf.Session() as sess:
    print(sess.run(ouput, feed_dict={input1: [7.], input2: [2.]}))
# 结果:[ 14.]

2.6 什么是激励函数

为了解决不能用线性函数表达的问题
已知的激励函数有很多种,根据不同的神经网络选择不同的激励函数,当然,也可以自己构造出一个激励函数,但是构造的这个函数必须可微分,因为你要进行反向传播求导。

原函数y=Wx,这里的AF就是指的激励函数,激励函数拿出自己最擅长的”掰弯利器”,套在了原函数上 用力一扭,原来的 Wx 结果就被扭弯了。
而这个AF其实就是另一个非线性函数,将这些掰弯利器嵌套在原有的结果之上,强行把原有的线性结果给扭曲了,使得输出结果 y 也有了非线性的特征。

常用选择
 

        在浅层神经网络中,可以使用任意的激励函数,可以随便掰弯,不会有很大的影响,但是对于多层神经网络,会涉及到梯度爆炸以及梯度消失等问题。
对于少量层结构的神经网络:
卷积神经网络CNN:relu函数
循环神经网络RNN:tanh函数或者relu函数

2.7 激励函数 activation function


        激励函数运行时激活神经网络中某一部分神经元,将激活信息向后传入下一层的神经系统。激励函数的实质是非线性方程。Tensorflow 的神经网络里面处理较为复杂的问题时都会需要运用激励函数。
 

猜你喜欢

转载自blog.csdn.net/nyist_yangguang/article/details/122748043
今日推荐