您的位置:首页 > 其它

机器学习-tensorflow入门教程一——基础内容

2017-09-10 22:37 519 查看
Tensorflow中每个操作符当做一个节点,连接节点的线称为边,边中流动的数据称为tensor。有一类特殊的边中没有数据流动,这种边称为是依赖控制,作用是让起始节点执行完后在执行目标节点,可以进行灵活的条件控制。

运算核(kernal)是指一个运算操作在某个具体硬件(比如CPU或GPU中)的实现。

Tensorflow内建的操作运算有如下:

类型实例
标量运算Add、Sub、Mul、Div、Exp、Log、Greater、Less、Equal
向量运算Concat、Slice、Split、Constant、Rank、Shape、Shuffle
矩阵运算MatMul、MatrixInverse、MatrixDeterminant
带状态的运算Variable、Assign、AssignAdd
神经网络组件SoftMax、Sigmoid、ReLU、Convolution2D、MaxPooling
储存、恢复Save、Restore
队列及同步运算Enqueue、Dequeue、MutexAcquire、MutexRelease
控制流Merge、Switch、Enter、Leave、NextIteration
1、设置定量

import tensorflow as tf

node1 = tf.constant(3.0,dtype = tf.float32)
node2 = tf.constant([2.3],dtype = tf.float32)
sess = tf.Session()
print(sess.run([node1,node2]))


使用tf.constant可以创建定量,但是必须使用session才能显示定量的数据,session封装了tensorflow的控制以及状态,调用run方法,可以得到constant的值。

2、tf的操作符,加法

import tensorflow as tf

node1 = tf.constant(3.0,dtype = tf.float32)
node2 = tf.constant([2.3],dtype = tf.float32)

node3 = tf.add(node1,node2)

sess = tf.Session()
print(sess.run(node3))


3、placeholder类型量

placeholder相对与constant型,可以接受外部输入,改变自身的数值。

import tensorflow as tf

node1 = tf.placeholder(tf.float32)
node2 = tf.placeholder(tf.float32)

node3 = node1 + node2

sess = tf.Session()
print(sess.run(node3,{node1:3,node2:4}))


node1与node2 为创建的两个可以就收外部输入的量,可以通过字典传入数据。

import tensorflow as tf

node1 = tf.placeholder(tf.float32)
node2 = tf.placeholder(tf.float32)

node3 = node1 + node2
node4 = node3 * 2

sess = tf.Session()
print(sess.run(node4,{node1:[3,4],node2:[4,5]}))


可以使用连续运算操作符,并且字典可以通过列表形式传入多个数据。

placeholder用于提供输入数据,在定义时,数据类型是需要指定的,但是维度信息可以不用·给定,如果不确定可以用None代替。

x = tf.placeholder(tf.float32,shape=(None,2),name = 'x-input')


4、variable类型

在机器学习中,我们需要在训练过程中调整参数,这种可在训练过程中调整的数据类型为variable类型。可以通过一个初始值与数据类型进行声明。

import tensorflow as tf

weight = tf.Variable(3,dtype = tf.float32)
bias = tf.Variable(1,dtype = tf.float32)
x = tf.placeholder(tf.float32)
y = weight * x + bias

init = tf.global_variables_initializer()

sess = tf.Session()
sess.run(init)

print(sess.run(y,{x:3}))


与constant类型(在声明时就初始化)不同,variable类型变量需要调用如下代码进行初始化:

init = tf.global_variables_initializer()
sess.run(init)


tf.Variable的作用就是保存和更新神经网络中的参数。初始值可以设置为随机数。如下方式

import tensorflow as tf

w1 = tf.Variable(tf.random_normal([2,3],stddev=1,mean=1,seed=1,dtype=tf.float32))
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run(w1))


Tensorflow随机数生成函数

函数名称随机数分布主要参数
tf.random_normal正态分布平均值,标准差,取值类型
tf.truncated_normal正态分布,但如果随机出来的值偏离平均值超过2个标准差,那么这个数将会被重新生成
Tensorflow生成常数函数

函数名称功能样例
tf.zeros生成全0的数组tf.zeros([2,3],int32)->[[0,0,0],[0,0,0]]
tf.ones生成全1的数组tf.ones([2,3],int32)->[[1,1,1],[1,1,1]]
tf.fill产生一个全部为给定数字的数组tf.fill([2,3],9)->[[9,9,9],[9,9,9]]
tf.constant产生一个给定值的常量tf.constant([2,3])->[2,3]
Tensorflow也支持通过其他变量的初始值来初始化新的变量,如下所示

import tensorflow as tf
w1 = tf.Variable(tf.random_normal([2,3],stddev=1,mean=1,seed=1,dtype=tf.float32))
w2 = tf.Variable(w1.initialized_value())


w2使用w1的初始值进行初始化

如果变量声明时,参数trainable为True,那么这个变量会被加入GraphKeys.TRANINABLE_VARIABLES集合中。在Tensorflow中可以通过
tf.trainable_variables()
函数得到所有需要优化的参数。Tensorflow中提供的神经网络优化算法将会GraphKeys.TRANINABLE_VARIABLES集合中的变量当做默认的优化对象。

5、loss function 误差计算

import tensorflow as tf

weight = tf.Variable(3,dtype = tf.float32)
bias = tf.Variable(1,dtype = tf.float32)
x = tf.placeholder(tf.float32)
line_regress = weight * x + bias

y = tf.placeholder(tf.float32)

init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)

squared_deltas = tf.square(line_regress - y)
loss = tf.reduce_sum(squared_deltas)

print(sess.run(loss,{x:[1,2,3,4],y:[0,-1,-2,-3]}))


y为理想输出,line_regress为实际计算输出。loss为误差平方和。

6、variable类型变量的改变

import tensorflow as tf

weight = tf.Variable(3,dtype = tf.float32)
bias = tf.Variable(1,dtype = tf.float32)
x = tf.placeholder(tf.float32)
line_regress = weight * x + bias

y = tf.placeholder(tf.float32)

init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)

squared_deltas = tf.square(line_regress - y)
loss = tf.reduce_sum(squared_deltas)

fixW = tf.assign(weight, -1.)
fixb = tf.assign(bias, 1.)
sess.run([fixW, fixb])

print(sess.run(loss,{x:[1,2,3,4],y:[0,-1,-2,-3]}))


使用了如下代码,对variable类型量进行了重新赋值:

fixW = tf.assign(weight, -1.)
fixb = tf.assign(bias, 1.)
sess.run([fixW, fixb])


维度是变量的一个重要属性,但是维度能够在程序运行中进行改变,但是需要设置参数validate_shape=False

fixW = tf.assign(w1,w2,validate_shape = False)


7、训练

简单的使用梯度下降法,确定上述线性回归的参数值。

import tensorflow as tf

weight = tf.Variable(1,dtype = tf.float32)
bias = tf.Variable(-1,dtype = tf.float32)
x = tf.placeholder(tf.float32)
line_regress = weight * x + bias

y = tf.placeholder(tf.float32)

init = tf.global_variables_initializer()
sess = tf.Session()

squared_deltas = tf.square(line_regress - y)
loss = tf.reduce_sum(squared_deltas)

optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)

sess.run(init)
for i in range(1000):
sess.run(train,{x:[1,2,3,4],y:[0,-1,-2,-3]})
if i % 10 == 0:
print(i,sess.run([weight,bias,loss],{x:[1,2,3,4],y:[0,-1,-2,-3]}))


8、线性回归例程

import numpy as np
import tensorflow as tf

##声明特征列表
feature_columns = [tf.feature_column.numeric_column("x",shape=[1])]
##创建线性回归,还有线性分类,神经网络分类等
estimator = tf.estimator.LinearRegressor(feature_columns = feature_columns)

##创建训练数据
x_train = np.array([1.,2.,3.,4.])
y_train = np.array([0.,-1.,-2.,-3.])
x_eval = np.array([2.,5.,8.,1.])
y_eval = np.array([-1.01, -4.1, -7, 0.])

input_fn = tf.estimator.inputs.numpy_input_fn({'x':x_train},y_train,batch_size=4,num_epochs=None,shuffle=True)
train_input_fn = tf.estimator.inputs.numpy_input_fn({'x':x_train},y_train,batch_size=4,num_epochs=1000,shuffle=False)
eval_input_fn = tf.estimator.inputs.numpy_input_fn({'x':x_eval},y_eval,batch_size=4,num_epochs=1000,shuffle=False)

##训练
estimator.train(input_fn=input_fn,steps=1000)

train_metrics = estimator.evaluate(input_fn=train_input_fn)
eval_metrics = estimator.evaluate(input_fn=eval_input_fn)
eval_pre = estimator.predict(input_fn= eval_input_fn)

print("train metrics: %r"%train_metrics)
print('eval metrics: %r'%eval_metrics)
for i in eval_pre:

print('predict: ',i)


WALDM
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: