【brisyramshere】TF学习笔记总结记录

人工智能

#1

坚持✊,一步一个脚印,和大家一起共同进步!加油!


#2

week1 task1


#1.使用tf计算算式的值: #x=2,y=3z=7 求解:res=x*y+z的结果

import tensorflow as tf

x=tf.constant(2)
y=tf.constant(3)
z=tf.constant(7)

res=tf.add(tf.mul(x,y),z)
\#res=x*y+z
with tf.Session() as session:
	print session.run(res)

输出:13 #问题:使用*、+和使用tf.mul()、tf.add() 有什么区别?

week1 task2


#使用tf计算求解,矩阵乘法结果: #矩阵乘法: #A :[[3., 3.]] #B: [[2.],[2.]] #A矩阵和B矩阵的乘法运算

import tensorflow as tf

A=tf.constant([[3.,3.]])
B=tf.constant([[2.],[2.]])
res=tf.matmul(A,B)
with tf.Session() as session:
	print session.run(res)

输出:[[12.]]


#3

#Week 1理论概念掌握任务list #思考问题: 1、机器学习中,监督学习 or 非监督学习概念区分,应用场景调研? 监督学习即有导师信号的学习,在训练过程中,会有正确答案作为指导去训练模型,通常应用于存在很多经验的场景,通过先验的知识去指导进行模型的训练。 非监督学习,则不存在导师信号,没有任何训练样本,直接对数据进行建模。同样应用在不能够提供足够的训练样本、没有先验经验的情况下。

2、做机器学习项目,有哪些环节? 包括训练和识别两个阶段。训练阶段又包括(1)提取特征(2)分类模型训练。

3、深度学习,目前有哪些应用领域? (1)计算机视觉,如图像分类、物体检测,大多使用卷积神经网络。 (2)语音识别,使用循环神经网络 (3)自然语言处理,如翻译、词性标注、感情分析等 (3)人机博弈,如alpha go,其中的监督学习部分使用的是卷积神经网络,同时还结合了增强学习。最新的alpha zero则只是用了增强学习。

4、数据预处理,需要注意哪些? 要保证数据不会被扭曲,确保数据的真实性;尽量降低数据的冗余性;减少噪声数据的污染等。

5、tensorflow运行原理,架构有哪些核心点? (1)tensorflow中最基本的概念是计算图,tensorflow中所有的计算都会变成计算图中的节点。 (2)数据以tensor(多位数组)的形式存储,是计算图中唯一的数据模型。 (3)tensor以flow的形式在计算图中流动。流动方向和关系,表示了各个计算节点之间的依赖关系。 (4)流动过程中交汇的节点代表了一个operater(运算),包括不同的op,如mul,add。。。 (3)通过session(会话)来执行定义好的计算图,拥有并管理计算图中所要用到的所有资源。


#4

**

week2 动手任务1

** mnist手写体数字识别数据集的训练和识别问题。 使用了含有一个隐层的深度神经网络,隐层节点数为100个。

输入层节点:28*28=784 隐层:100 激活函数:relu 输出层:10 激活函数:softmax

隐层参数:w1:784100 b1:100 输出层:w2=10010 b2:10

使用交叉熵cross_entropy作为cost function 采用梯度下降的方法进行参数的更新 tf.train.GradientDscentOptimizer(lr).minimize(cross_entropy)


#5

程序代码:

#coding=utf-8

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

#整理mnist数据
mnist=input_data.read_data_sets("/tmp/data",one_hot=True)


learning_rate=0.001;
hide_layer=100 #一个隐层,节点数为200
#建立输入输出占位符和w b参数的变量
x=tf.placeholder(tf.float32,[None,784],name='x-input') #None表示不设定行数,具体x的行数由batch的size决定
y_=tf.placeholder(tf.float32,[None,10],name='y-input')

w1=tf.Variable(tf.truncated_normal([784,hide_layer],stddev=0.1))
w2=tf.Variable(tf.truncated_normal([hide_layer,10],stddev=0.1))

b1=tf.Variable(tf.constant(0.1,shape=[hide_layer]))
b2=tf.Variable(tf.constant(0.1,shape=[10]))

hide_layer_out=tf.nn.relu(tf.matmul(x,w1)+b1)

y=tf.matmul(hide_layer_out,w2)+b2

#使用sparse_softmax_cross_entropy_with_logits函数,同时计算了softmax和交叉熵,输入参数:logits:y 计算结果 labels:y_ 训练样本的实际类别
cross_entropy=tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y,labels=tf.argmax(y_,1))

#优化方法:梯度下降,交叉熵最小化
train_step=tf.train.GradientDescentOptimizer(learning_rate).minimize(cross_entropy)

correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(y_,1))
accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))

with tf.Session() as sess:
	tf.initialize_all_variables().run();

	validation_feed={x:mnist.validation.images,y_:mnist.validation.labels}
	test_feed={x:mnist.test.images,y_:mnist.test.labels}

	for i in range(10000):
		if(i%500==0):
			vali_acc=sess.run(accuracy,feed_dict=validation_feed)
			print("validation accuracy:%g"%vali_acc)
		train_x,train_y=mnist.train.next_batch(100)
		sess.run(train_step,feed_dict={x:train_x,y_:train_y})
	test_acc=sess.run(accuracy,feed_dict=test_feed)
	print("final accuracy of the test data:%g "%test_acc)

#6

遇到问题: 导入mnist数据时,出现no module named protobuf (1)mnist数据的读取和处理,需要protobuf的安装。通过在https://github.com/google/protobuf上下载了probuf的源码,进行编译和安装。再在python里面安装protobuf模块。 (2)安装protobuf时,又需要安装m4,autoconf,antomake,libtools。


#7

**

WEEK2 思考题 (努力追赶中!)

**


#8

back propagation算法原理 反向传播是基于梯度下降方法的。神经网络通过梯度下降的方法,求偏导的方式,得到参数w和b的改变方向。但是因为神经网络有很多层,但是输出和损失函数的计算只是在最后一层。通过求偏导可以直接得到最后一层与倒数第二层之间的参数的改变量,但是前面的层的参数的改变,就需要通过链式法则,反向传播的方式获取。 在反向传播算法里面,需要计算前一层的参数的偏导,需要用到后一层计算的结果,所以整个网络是从最后一层开始计算,然后逐渐往前面传播的,所以叫做反向传播算法。

sigmoid函数,tanh函数和ReLU函数的区别,以及各自优缺点,对应的tf函数 sigmod函数: 优点: (1)导数很好求,便于使用梯度下降算法。 (2)将输出值压缩到0-1之间,网络激活只不会发散。 (3)0-1之间的值,可以将其看为事件发生的概率值。 缺点: (1)函数饱和与梯度消失:输入或者输出值很大或者很小的时候,导数值很小,梯度下降的很慢,收敛速度不够。 (2)不是关于原点中心对称的。输入不管是正是负,输出全部都成了正的。导致后面的网络的输入都成了正的。

tanh函数: 优点:关于原点对称,解决了sigmoid存在的问题,收敛速度加快 缺点:仍然存在饱和性问题

ReLU函数 优点:解决饱和性问题,收敛速度快 缺点:对于小于零的输入值点,求导为零,,该点不会再进行权值更新,神经元死亡。

softmax和cross_entropy原理解释 (1)softmax softmax这个名字是相对于普通的max来取的。 若a>b,max(a,b)会采用一棒子打死的态度,结果为a 而softmax(a,b)的结果则是大概率为a,仍存在小概率取b。所以叫soft,并不是一棒子打死。 softmax的值为该元素的exp指数与所有元素的exp指数和之比。 之所以采用exp指数,是因为在计算交叉熵的时候,我们需要对输出取-ln(),即对exp取-ln,产生对消,大大简化运算复杂度。所以softmax往往和交叉熵的计算是放在一起的。比如tensorflow里面的函数:tf.nn.sparse_softmax_cross_entropy_with_logits()

(2)cross_entropy 设输入X对应着输出Y

f(x)为y=1发生的概率 (1-f(x))为y=0发生的概率

y非1即0,则输入为x时,y发生的概率为: yi*f(xi)+(1-yi)*(1-f(xi))

对于有很多个输入xi同时发生的概率,可以写成: L(W,b)=累乘(yi*f(xi)+(1-yi)*(1-f(xi))) 该函数为似然函数,似然函数达到最大,表示模型参数能够最好的吻合这一堆输入的训练样本

所以 W*,b*=arg max(L(W,b)) 为了好计算 W*,b*=arg min(-ln(L(W,b))) -ln(L(W,b))=-累加( yi*ln(f(xi)) + (1-yi) * ln((1-f(xi))) ) 这个表达式就是两个伯努利分布的交叉熵!

tf.placeholder()、tf.constant()、tf.Variable()的区别 tf.placeholder():定义一个占位符,占位符用来送样本的输入和输出,相当于管道的入口和出口。 tf.constant():定义一个常量,常量是图进行计算的过程中不发生变化的。 tf.Variable():定义一个变量,变量是可以在迭代过程中改变的,通常用来存网络的参数W,b

举例说明:tf.Graph()概念理解 创建一个图,图能够隔离变量,一个图对应着一个网络,进行着变量和网络结构的管理,不会和其他的图中的变量混淆。

tf.name_scope()和tf.variable_scope()的理解 (1)tf.name_scope()主要结合tf.Variable()结合使用,为了方便管理变量参数名称。 多次在同一个name_scope()下面使用tf.Variable()创建相同name的变量,name_scope会被加上***_1这种防止重名的后缀,相当于重新产生了新的命名空间和下面的变量。两次产生的变量不是同一个,不能共享。

(2)tf.variable_scope()主要结合tf.get_variable()使用,为了实现变量共享。 同一个命名空间下两次使用tf.get_variable()并不会出现tf.Variable()那样的为了避免重名而对变量名加后缀的情况,而是对tf.get_variable()赋予了新的功能:首次调用是创建变量,后面在调用则可用来获取已经创建的变量的值,以实现变量共享。

tf.variable_scope()和tf.get_variable()的理解 (1)tf.get_variable():通过名字寻找变量,如果变量不存在,则会创建新的变量。 调用方式:v = tf.get_variable(name, shape, dtype, initializer)

(2)tf.variable_scope()可以生成一个上下文管理器,设置命名空间。 在该命名空间下,可通过变量名共享变量,通过tf.get_variable()函数获取。同时tf.variable_scope()中的reuse参数可以设置变量是否可以进行共享。 当tf.get_variable_scope().reuse == False:作用域就是为创建新变量所设置的.,tf.get_variable()函数只能获取已创建的变量,不能创建,若变量不存在会报错。 当tf.get_variable_scope().reuse == True:作用域是为重用变量所设置,tf.get_variable()函数只会创建新的变量,若同名变量已经存在,则会报错。 可调用tf.get_variable_scope().reuse_variables()将reuse设置为True

tf.global_variables_initializer()什么时候使用 在变量已经定义好了,需要开始运行计算图之前使用。对所有的Variable进行初始化。


#9

win10下Tensorflow GPU版安装 一开始安装了cuda9.0,但是会出现如下问题:

所以只能够下载cuda8.0.通过以下地址可以下载: https://developer.nvidia.com/cuda-80-ga2-download-archive