tensorflow分为构建模型和训练两部分,构建模型通常会用到Tensor,variable,placeholder,而训练阶段会用到session!
构建模型阶段,构建一个图(graph)来描述我们的模型(数据输入->中间处理->输出),此时不会发生实际运算,而在模型构建完毕之后,会进入训练步骤,此时才会有实际的数据输入以及梯度计算等操作。
下面先一个实例来说明一下
import tesorflow as tfimport numpy as np# create datax_data = np.random.rand(100).astype(np.float32) # 随机生成100个数据y_data = x_data*0.1 + 0.3# create tensorflow struct startWeights = tf.Variable(tf.random_uniform([1], -1.0, 1.0)) #生成一维向量biases = tf.Variable(tf.zeros([1]))y = Weights*x_data + biases#计算损失函数loss = tf.reduce_mean(tf.square(y - y_data))optimizer = tf.train.GradientDescentOptimizer(0.5)train = optimizer.minimize(loss)init = tf.initialize_all_variable()# create tensorflow struct endwith tf.Session() as sess: sess.run(init) for step in range(201): sess.run(train) if step % 20 == 0: PRint(step, sess.run(Weights), sess.run(biases))控件Session:抽象模型的实现者
import tensorflow as tfmatrix1 = tf.constant([3, 3]) # 一行两列的矩阵matrix2 = tf.constant([[2], [2]]) # 两行一列的矩阵# method1sess = tf.Session()# 两个矩阵相乘result1 = tf.matmul(matrix1, matrix2)print(sess.run(result1))sess.close()# method2with tf.Session() as sess: result2 = tf.matmul(matrix1, matrix2) print(sess.run(result2))session会话,抽象模型的实现者,代码多处会用到它,原因在于,模型是抽象的,只有实现了模型之后,才能够得到具体的值。同样的参数训练、预测,甚至变量的实际查询,都需要用到session。
Variable变量
import tensorflow as tfstate = tf.Variable(0, name=' counter') # 计算器one = tf.constant(1) # 常数为1# 执行new_value = state + onenew_value = tf.add(state, one)# 将new_value赋值给stateupdata = tf.assign(state, new_value)# 初始化所有变量init = tf.initialize_all_variable()with tf.Session() as sess: sess.run(init) # 循环3次 for i in range(3): sess.run(updata) # sess指针需要在state上run一下才可以得到结果 print(sess.run(state))只要定义了Variable就一定会要用到tf.initialize_all_variables()来初始化所有的变量,即tf.Variable()与tf.initialize_all_varilables()组合使用的。
Variable需要在session之前初始化才可以在session中被使用。
变量一般是用来计算图中的需要计算的各个参数的,包含矩阵以及向量等。它是可以被读取和修改的,模型参数一般用Variable来表示。
传入值placeholder
import tensorflow as tfinput1 = tf.placeholder(tf.float32)input2 = tf.placeholder(tf.float32)# 两个数相乘output = tf.mul(input1, input2)with tf.Session() as sess: print(sess.run(output, feed_dict={input1:[7.], input2:[2.]}))只要用到tf.placeholder就会用到feed_dict字典,它们是绑定的,组合使用的。
添加层def
import tensoflow as tfdef add_layer(inputs, in_size, out_size, activetion_funtion=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(inputs, Weights) + biases if activetion_funtion is None: outputs = Wx_plus_b else: outputs = activetion_funtion(Wx_plus_b) return outputs矩阵首字母大写,并非有这样的规定,只为了便于自己知晓。
推荐biases不为0。初始化值不为0比较好,所以选择随机。
activation_function=None代表线性函数
新闻热点
疑难解答