【Tensorflow】相关复习

  • 用tensorflow实现线性回归,主要考察的是一个tf的一个实现思路。(贝壳)

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

#使用numpy生成200个随机点
x_data=np.linspace(-0.5,0.5,200)[:,np.newaxis]
noise=np.random.normal(0,0.02,x_data.shape)
y_data=np.square(x_data)+noise

#定义两个placeholder存放输入数据
x=tf.placeholder(tf.float32,[None,1])
y=tf.placeholder(tf.float32,[None,1])

#定义神经网络中间层
Weights_L1=tf.Variable(tf.random_normal([1,10]))
biases_L1=tf.Variable(tf.zeros([1,10]))    #加入偏置项
Wx_plus_b_L1=tf.matmul(x,Weights_L1)+biases_L1
L1=tf.nn.tanh(Wx_plus_b_L1)   #加入激活函数

#定义神经网络输出层
Weights_L2=tf.Variable(tf.random_normal([10,1]))
biases_L2=tf.Variable(tf.zeros([1,1]))  #加入偏置项
Wx_plus_b_L2=tf.matmul(L1,Weights_L2)+biases_L2
prediction=tf.nn.tanh(Wx_plus_b_L2)   #加入激活函数

#定义损失函数(均方差函数)
loss=tf.reduce_mean(tf.square(y-prediction))
#定义反向传播算法(使用梯度下降算法训练)
train_step=tf.train.GradientDescentOptimizer(0.1).minimize(loss)

with tf.Session() as sess:
    #变量初始化
    sess.run(tf.global_variables_initializer())
    #训练2000次
    for i in range(2000):
        sess.run(train_step,feed_dict={x:x_data,y:y_data})

    #获得预测值
    prediction_value=sess.run(prediction,feed_dict={x:x_data})

    #画图
    plt.figure()
    plt.scatter(x_data,y_data)   #散点是真实值
    plt.plot(x_data,prediction_value,'r-',lw=5)   #曲线是预测值
    plt.show()

TensorFlow——实现线性回归算法

TensorFlow——实现简单的线性回归

  • 请简要介绍下Tensorflow的计算图。(阿里)

Tensorflow是一个通过计算图的形式来表述计算的编程系统,计算图也叫数据流图,可以把计算图看做是一种有向图,Tensorflow中的每一个计算都是计算图上的一个节点,而节点之间的边描述了计算之间的依赖关系。

  • tf前向传播

import tensorflow as tf
import os

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

# 声明w1、w2两个变量,这里还通过seed参数设定了随机种子,
# 这样可以保证每次运行得到的结果是一样的。
w1 = tf.Variable(tf.random_normal((2, 3), stddev=1, seed=1))
w2 = tf.Variable(tf.random_normal((3, 1), stddev=1, seed=1))

# 暂时将输入的特征向量定义为一个常量,注意这里x是一个1*2的矩阵。
x = tf.constant([[0.7, 0.9]])

# 通过前向传播算法获得神经网络输出。
a = tf.matmul(x, w1)
y = tf.matmul(a, w2)

sess = tf.Session()
# 这里不能直接通过sess.run(y)来获取y的取值,
# 因为w1和w2都还没有运行初始化过程,以下两行分别初始化了w1和w2两个变量。
sess.run(w1.initializer)
sess.run(w2.initializer)
# 输出[[3.95757794]]
print(sess.run(y))
sess.close()

tf.random_normal([2, 3], stddev=1) 会产生一个 2×3 的矩阵,矩阵中的元素是均值为 0,标准差为 1 的随机数,tf.random_normal 函数可以通过参数 mean 来指定平均值,在没有指定时默认为 0。

【Tensorflow】相关复习_第1张图片

Tensorflow实战-前向传播算法

tensorflow(六)训练分类自己的图片(CNN超详细入门版)

  • tensorflow如何实现并行,梯度更新是同步还是异步,同步异步的优缺点

Tensorflow的梯度异步更新

背景:先说一下应用吧,一般我们进行网络训练时,都有一个batchsize设置,也就是一个batch一个batch的更新梯度,能有这个batch的前提是这个batch中所有的图片的大小一致,这样才能组成一个placeholder。那么若一个网络对图片的输入没有要求,任意尺寸的都可以,但是我们又想一个batch一个batch的更新梯度怎么办呢?——梯度异步更新。

TensorFlow多GPU并行的实现(这个完全解决了上面的问题)

梯度更新可以同步,也可以异步。

同步/异步优劣比较

  • 同步模式解决了异步模式中存在的参数更新问题,然而同步模式的效率却低于异步模式
  • 在同步模式下,每一轮迭代都需要设备统一开始、统一结束
  • 如果设备的运行速度不一致,那么每一轮训练都需要等待最慢的设备结束才能开始更新参数,于是很多时间将被花在等待上
  • 虽然理论上异步模式存在缺陷,但是因为训练深度学习模型时,使用的随机梯度下降本身就是梯度下降的一个近似解法,而且即使是梯度下降也无法保证达到全局最优
  • 所以在实际应用中,相同时间内,使用异步模式训练的模型不一定比同步模式差
  • tensorflow的分布式版本

Tensorflow分布式原理理解

你可能感兴趣的:(框架学习)