Tensorflow入门
1、Tensorflow简介
TensorFlow™ 是一个使用数据流图进行数值计算的开源软件库。图中的节点代表数学运算, 而图中的边则代表在这些节点之间传递的多维数组(张量)。这种灵活的架构可让您使用一个 API 将计算工作部署到桌面设备、服务器或者移动设备中的一个或多个 CPU 或 GPU。 TensorFlow 最初是由 Google 机器智能研究部门的 Google Brain 团队中的研究人员和工程师开发的,用于进行机器学习和深度神经网络研究, 但它是一个非常基础的系统,因此也可以应用于众多其他领域。
Tensorflow是机器学习和神经网络的python外部包。
2、Tensorflow定义graph
主要思路是通过tensorflow来构建graph或者flow,然后通过创建session来run指定的graph和flow。
下面的例子简单的定义一个graph:
import tensorflow as tf
a = tf.constant(2,name = 'a')
b = tf.constant(3, name = 'b')
x = tf.add(a,b,name = 'add')
with tf.Session() as sess:
writer = tf.summary.FileWriter('./logs',sess.graph)
print(sess.run(x))
writer.close()
对应的flow如下:
3、采用神经网络来做tranning的基本步骤
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
def add_layer(inputs,in_size,out_size,activation_function=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 activation_function is None:
outputs = Wx_plus_b
else:
outputs = activation_function(Wx_plus_b)
return outputs
##输入层是一个属性,有300训练数据
x_data = np.linspace(-1,1,300)[:,np.newaxis]
##生成噪声
noise = np.random.normal(0,0.05,x_data.shape)
##输出层也是一个属性,有300个训练结果
y_data = np.square(x_data)-0.5+noise
xs = tf.placeholder(tf.float32,[None,1])
ys = tf.placeholder(tf.float32,[None,1])
##输入层一个属性,隐藏层10个神经元,输出层也是一个属性
l1 = add_layer(xs,1,10,activation_function=tf.nn.relu)
predition = add_layer(l1,10,1,activation_function=None)
##误差函数是平方差求和再求平均
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys-predition)
,reduction_indices=[1]))
##训练的优化函数是采用梯度下降算法最小化误差
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
##初始化所有变量
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.scatter(x_data,y_data)
plt.ion() ##为了要动态更新图像
plt.show()
for i in range(1000):
##训练神经网络,每次都是300个训练数据喂给数据xs和ys
sess.run(train_step,feed_dict={xs:x_data,ys:y_data})
if i%50 == 0:
#print(sess.run(loss,feed_dict={xs:x_data,ys:y_data}))
try:
ax.lines.remove(lines[0])
except Exception:
pass
prediction_value = sess.run(predition,feed_dict={xs:x_data})
lines = ax.plot(x_data,prediction_value,'r-',lw=5)
plt.pause(0.5) ##延时0.5s
总结下采用神经网络来做tranning的步骤:
- 准备训练数据
- 创建输入层,隐藏层,输出层;其中隐藏层可以有多层
- 定义cost函数,也就是loss
- 选择学习训练算法
- 进行学习
上面步骤可以采用如下tensorboard来展示:
Tensorboard使用:
writer = tf.summary.FileWriter("logs/",tf.get_default_graph())
writer.close()
cmd控制台执行如下命令:
然后通过浏览器打开http://W00250712D:6006 网址即可看到graph
4、Stanford tensorflow 课程网址
https://web.stanford.edu/class/cs20si/2017/
5、Tensorflow经典问题和经典算法
回归问题:也就是拟合问题,输入和输出都是连续值,利用一部分训练值来训练好参数,然后采用新的值来预测数据的结果
分类问题:输出是离散的值,比如数字识别,图像分类等。
这两类问题其实框架都是类似的,都是有输入层,hidden层,输出层,训练方法
输入层:其实就是输入的特征向量,这里可以出很多的特征选择算法
Hidden层:除了层的数量,还有就是激励函数,不同的场景可能需要不同的激励函数进行匹配
输出层:对结果的定义,这个方面一般研究的比较少,基本上结果都是定的
训练方法:这里指的是采用何种方法最快最准的根据loss来调整W和b,常用的有梯度下降算法(SGD),主要是基于学习效率的改进和变化
过拟合问题:三种解决过拟合的问题,第一是增加训练数据,第二L1和L2正规化,第三是dropout regularation
L1和L2正规化的方法可以描述如下:
就是采用训练的参数加权的方式来控制住曲线的弯曲程度,如果p是1,表示L1正规化,如果p为2表示L2正规化。
CNN:卷积神经网络,主要是用于计算机视觉领域,比如图像识别,目标识别等
RNN:循环神经网络,主要用于处理序列的数据,比如文本处理,语言处理,图像描述等。经典RNN算法是LSTM RNN。
非监督学习:又称为聚类算法,就是不用采用训练数据,自己根据数据特征来进行分类。这些又可以称为autoencoder算法,可以压缩和解压。比如PCA算法,特征属性降维等。
批标准化:batch normalization 有时候需要将输入数据进行标准化或者归一化,可以使得训练数据更加有效的改善训练效果
GAN:生成对抗网络算法,比如采用GAN来画画,制作音乐等。GAN算法让机器学习具备想象力。