深度学习实战实验(一)

深度学习实战实验(一)

简介:本人一台MacBook Pro,没有gpu,宿舍限电装不了外接显卡,想尽一切办法,最大的问题就是深度学习不是看书看代码就能学到的,一定要动手做实验。

AWS:我英语垃圾,绑定信用卡麻烦

阿里云:其实好像很不错,就是穷……

我在知乎上看到有个人推荐了一个巨牛逼的学习平台:点击就送屠龙宝刀

预备知识:

广播操作(Broadcasting operation)

一种用numpy-style broadcasting来保证tensor参数的形态兼容的操作。

Devices

一块可以用来运算并且拥有自己的地址空间的硬件,比如GPU和CPU。

eval

Tensor 的一个方法,返回 Tensor 的值。触发任意一个图计算都需要计算出这个值。只能在一个已经启动的会话的图中才能调用该 Tensor 值。

Feed

TensorFlow 的一个概念:把一个 Tensor 直接连接到一个会话图表中的任意节点。feed 不是在构建图(graph)的时候创建,而是在触发图的执行操作时去申请。一个 feed 临时替代一个带有 Tensor 值的节点。把feed数据作为run( )方法和eval( )方法的参数来初始化运算。方法运行结束后,替换的 feed 就会消失,而最初的节点定义仍然还在。可以通过tf.placeholder( )把特定的节点指定为 feed 节点来创建它们。详见【 Basic Usagehref 】。

Fetch

TensorFlow中的一个概念:为了取回运算操作的输出结果。取回的申请发生在触发执行图操作的时候,而不是发生在建立图的时候。如果要取回一个或多个节点(node)的 Tensor 值,可以通过在 Session 对象上调用run()方法并将待取回节点(node)的列表作为参数来执行图表(graph)。详见【Basic Usagehref】。

Graph(图)

把运算任务描述成一个直接的无环图形(DAG),图表中的节点(node)代表必须要实现的一些操作。图中的边代表数据或者可控的依赖。GratheDef 是系统中描述一个图表的协议(api),它由一个 NodeDefs 集合组成。一个GraphDef可以转化成一个更容易操作的图表对象。

IndexedSlices(索引化切片)

在 Python API 中,TensorFlow 仅仅在第一维上对 Tensor 有所体现。如果一个 Tensor 有k维,那么一个 IndexedSlices 实例在逻辑上代表一个沿着这个 Tensor 第一维的(k-1)维切片的集合。切片的索引被连续储存在一个单独的一维向量中,而对应的切片则被拼接成一个单独的k维 Tensor。如果 sparsity 不是受限于第一维空间,请用 SparseTensor。

Node(节点)

图中的一个元素。 把启动一个特定操作的方式称为特定运算图表的一个节点,包括任何用来配置这个操作的属性的值。对于那些多形态的操作,这些属性包括能完全决定这个节点(Node)签名的充分信息。详见graph.proto。

操作(Op/operation)

在 TensorFlow 的运行时中,它是一种类似 add 或 matmul 或 concat的运算。可以用【how to add an ophref】中的方法来向运行时添加新的操作。在 python 的API中,它是图中的一个节点。在【tf.Operationhref】类中列举出了这些操作。一个操作(Operation)的 type 属性决定这个节点(node)的操作类型,比如add和matmul。

Run

在一个运行的图中执行某种操作的行为。要求图必须运行在会话中。在 Python 的 API 中,它是 Session 类的一个方法【tf.Session.runhref】。可以通过 Tensors 来订阅或获取run()操作。

在C++的API中,它是【tensorflow::Sessionhre】类的一个方法。

Session(会话)

启动图的第一步是创建一个 Session 对象。Session 提供在图中执行操作的一些方法。

在 Python API中,使用【tf.Sessionhref】。

在 C++ 的API中,【tensorflow::Sessionhref】是用来创建一个图并运行操作的类:

Shape

Tensor 的维度和它们的大小。

在一个已经启动的图中,它表示流动在节点(node)之间的 Tensor 的属性。一些操作对 shape 有比较强的要求,如果没有 Shape 属性则会报告错误。

在 Python API中,用创建图的 API 来说明 Tensor 的 Shape 属性。Tensor 的Shape 属性要么只有部分已知,要么全部未知。详见【tf.TensroShapehref】

在C++中,Shape 类用来表示 Tensor 的维度。【tensorflow::TensorShapehref】。

SparseTensor

在 Python API 中,它用来表示在 TensorFlow 中稀疏散落在任意地方的 Tensor 。SparseTensor 以字典-值格式来储存那些沿着索引的非空值。换言之,m个非空值,就包含一个长度为m的值向量和一个由m列索引(indices)组成的矩阵。为了提升效率,SparseTensor 需要将 indice(索引)按维度的增加来按序存储,比如行主序。如果稀疏值仅沿着第一维度,就用 IndexedSlices。

##实战部分:

Tensor

Tensor是一种特定的多维数组。比如,一个浮点型的四维数组表示一小批由batch,height,width,channel组成的图片。在一个运行的图(graph)中,它是一种流动在节点(node)之间的数据。 在 Python 中,Tensor 类表示添加到图的操作中的输入和输出,见【tf.Tensorhref】,这样的类不持有数据。
在C++中,Tensor是方法【Session::Run( )】的返回值,见tensorflow::Tensor,这样的 Tensor 持有数据。

TensorFlow 相关函数理解

tf.nn.conv2d
 conv2d(
 input,
 filter,
 strides,
 padding,
 use_cudnn_on_gpu=True,
 data_format='NHWC',
 name=None
)

功能说明:
卷积的原理可参考 A guide to convolution arithmetic for deep learning
参数列表:

《深度学习实战实验(一)》

《深度学习实战实验(一)》

《深度学习实战实验(一)》
《深度学习实战实验(一)》

示例代码:

(卷积)

《深度学习实战实验(一)》

import tensorflow as tf   a=tf.constant([1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,1,1,0,0,1,1,0,0],dtype=tf.float32,shape=[1,5,5,1]) 
b=tf.constant([1,0,1,0,1,0,1,0,1],dtype=tf.float32,shape=[3,3,1,1])  
c = tf.nn.conv2d(a,b,strides=[1, 2, 2, 1],padding='VALID') 
d = tf.nn.conv2d(a,b,strides=[1, 2, 2, 1],padding='SAME')
with tf.Session() as sess:
    print ("c shape:")
    print (c.shape)
    print ("c value:")
    print (sess.run(c))
    print ("d shape:")
    print (d.shape)
    print ("d value:")
    print (sess.run(d))

relu

relu(
features,
name=None
)
import tensorflow as tf

a=tf.constant([1,-2,0,4,-5,6])
b=tf.nn.relu(a)
with tf.Session() as sess:
    print (sess.run(b))

max_pool

《深度学习实战实验(一)》

import tensorflow as tf

a = tf.constant([1,3,2,1,2,9,1,1,1,3,2,3,5,6,1,2],dtype=tf.float32,shape=[1,4,4,1])
%
1,3,2,1,
2,9,1,1,
1,3,2,3,
5,6,1,2
-->9 2
    6 3
-->9 2
    6 3
%
b = tf.nn.max_pool(a,ksize=[1, 2, 2, 1],strides=[1, 2, 2, 1],padding='VALID')
c = tf.nn.max_pool(a,ksize=[1, 2, 2, 1],strides=[1, 2, 2, 1],padding='SAME')
with tf.Session() as sess:
    print ("b shape:")
    print (b.shape)
    print ("b value:")
    print (sess.run(b))
    print ("c shape:")
    print (c.shape)
    print ("c value:")
    print (sess.run(c))

tf.nn.dropout

《深度学习实战实验(一)》

dropout(
x,
keep_prob,
noise_shape=None,
seed=None,
name=None
)
**
import tensorflow as tf

a = tf.constant([1,2,3,4,5,6],shape=[2,3],dtype=tf.float32)
b = tf.placeholder(tf.float32)
c = tf.nn.dropout(a,b,[2,1],1)
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print (sess.run(c,feed_dict={b:0.75}))
 output:
[[ 0.          0.          0.        ]
[ 5.33333349  6.66666651  8.        ]]

**

sigmoid default

sigmoid_cross_entropy_with_logits(
_sentinel=None,
labels=None,
logits=None,
name=None
)
import tensorflow as tf
x = tf.constant([1,2,3,4,5,6,7],dtype=tf.float64)
y = tf.constant([1,1,1,0,0,1,0],dtype=tf.float64)
loss = tf.nn.sigmoid_cross_entropy_with_logits(labels = y,logits = x)
with tf.Session() as sess:
    print (sess.run(loss))

tf.truncated_normal

truncated_normal(
shape,
mean=0.0,
stddev=1.0,
dtype=tf.float32,
seed=None,
name=None

)
10*10的正态分布

[[-0.57721621 -0.47329104 0.04972742 -0.3587006 0.24760798 0.56092304
-0.40778556 0.12078779 -0.21640019 -0.1110976 ]
[ 0.21430834 -0.00479233 0.17745139 -0.7297833 0.18494087 0.46794632
0.83741665 0.2931855 0.15578711 -0.51135457]
[ 0.8358987 -0.16179781 -0.52682817 0.04584849 -0.53707278 0.14061995
0.81832695 -0.64965969 -0.23150785 0.10812338]
[-0.65812594 0.1417283 -0.66038197 0.68287295 -0.5732525 -0.92063028
0.1923186 -0.38391048 0.44856831 0.07951569]
[-0.18259935 0.01781969 0.20644705 -0.03307612 0.0104936 0.8435697
0.15285046 0.51017845 0.41139066 0.72952539]
[ 0.10778355 -0.34304479 -0.94025874 0.4668048 0.57449281 -0.36823404
0.71037996 -0.27487686 0.42033112 0.9847371 ]
[-0.92743653 -0.28077936 -0.13894029 -0.46904656 -0.32998389 0.75619799
-0.09417462 -0.06643271 0.09135842 0.1449759 ]
[ 0.04893474 -0.04128959 0.69899082 0.51274896 -0.04217111 0.45291895
0.15494128 -0.67875779 0.3945078 0.31841666]
[-0.26947051 0.5972324 -0.34487987 0.59838986 0.18301846 -0.25960794
0.17257154 0.68578982 0.78473324 0.86361235]
[ 0.18135853 -0.403494 -0.7401762 0.14052914 0.57035226 -0.03657578
0.65621924 0.61467326 -0.53857511 -0.80530447]]

constant(根据value生成张量)

《深度学习实战实验(一)》

constant(
value,
dtype=None,
shape=None,
name='Const',
verify_shape=False
)

import tensorflow as tf
import numpy as np
a = tf.constant([1,2,3,4,5,6],shape=[2,3])
b = tf.constant(-1,shape=[3,2])
c = tf.matmul(a,b)

e = tf.constant(np.arange(1,13,dtype=np.int32),shape=[2,2,3])
f = tf.constant(np.arange(13,25,dtype=np.int32),shape=[2,3,2])
g = tf.matmul(e,f)
with tf.Session() as sess:
    print (sess.run(a))
    print ("##################################")
    print (sess.run(b))
    print ("##################################")
    print (sess.run(c))
    print ("##################################")
    print (sess.run(e))
    print ("##################################")
    print (sess.run(f))
    print ("##################################")
    print (sess.run(g))

placehold

《深度学习实战实验(一)》

#!/usr/bin/python

import tensorflow as tf
import numpy as np

x = tf.placeholder(tf.float32,[None,3])
y = tf.matmul(x,x)
with tf.Session() as sess:
    rand_array = np.random.rand(3,3)
    print(sess.run(y,feed_dict={x:rand_array}))
 output:随机3*3
[ 0.34258151  0.19263473  0.6594885 ]
[ 0.1435397   0.58130354  0.24524102]
[ 0.12907268  0.10433194  0.25301382]]

bias

《深度学习实战实验(一)》

#!/usr/bin/python

import tensorflow as tf
import numpy as np

a = tf.constant([[1.0, 2.0],[1.0, 2.0],[1.0, 2.0]])
b = tf.constant([2.0,1.0])
c = tf.constant([1.0])
sess = tf.Session()
print (sess.run(tf.nn.bias_add(a, b)))
print (sess.run(tf.nn.bias_add(a,c))) error
print ("##################################")
print (sess.run(tf.add(a, b)))
print ("##################################")
print (sess.run(tf.add(a, c)))
[[ 3.  3.]
 [ 3.  3.]
 [ 3.  3.]]
##################################
[[ 3.  3.]
 [ 3.  3.]
[ 3.  3.]]  
##################################
[[ 2.  3.]
 [ 2.  3.]
 [ 2.  3.]]

tf.reduce_mean计算平均值

《深度学习实战实验(一)》

#!/usr/bin/python

import tensorflow as tf
import numpy as np

initial = [[1.,1.],[2.,2.]]
x = tf.Variable(initial,dtype=tf.float32)
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init_op)
    print(sess.run(tf.reduce_mean(x)))
    print(sess.run(tf.reduce_mean(x,0))) #Column
    print(sess.run(tf.reduce_mean(x,1))) #row

square

《深度学习实战实验(一)》

#!/usr/bin/python
import tensorflow as tf
import numpy as np

initial_x = [[1.,1.],[2.,2.]]
x = tf.Variable(initial_x,dtype=tf.float32)
x2 = tf.square(x)
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init_op)
    print(sess.run(x2))

squared_difference

《深度学习实战实验(一)》

#!/usr/bin/python

import tensorflow as tf
import numpy as np

initial_x = [[1.,1.],[2.,2.]]
x = tf.Variable(initial_x,dtype=tf.float32)
initial_y = [[3.,3.],[4.,4.]]
y = tf.Variable(initial_y,dtype=tf.float32)
diff = tf.squared_difference(x,y)
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init_op)
    print(sess.run(diff))
output:[[ 4.  4.] %the first is (3-1)*(3-1)==4
         [ 4.  4.]]

tTensorFlow class

《深度学习实战实验(一)》

__init__(
initial_value=None,
trainable=True,
collections=None,
validate_shape=True,
caching_device=None,
name=None,
variable_def=None,
dtype=None,
expected_shape=None,
import_scope=None
)
#!/usr/bin/python

import tensorflow as tf
initial = tf.truncated_normal(shape=[10,10],mean=0,stddev=1)
W=tf.Variable(initial)
list = [[1.,1.],[2.,2.]]
X = tf.Variable(list,dtype=tf.float32)
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init_op)
    print ("##################(1)################")
    print (sess.run(W))
    print ("##################(2)################")
    print (sess.run(W[:2,:2]))
    op = W[:2,:2].assign(22.*tf.ones((2,2)))
    print ("###################(3)###############")
    print (sess.run(op))
    print ("###################(4)###############")
    print (W.eval(sess)) #computes and returns the value of this variable
    print ("####################(5)##############")
    print (W.eval())  #Usage with the default session
    print ("#####################(6)#############")
    print (W.dtype)
    print (sess.run(W.initial_value))
    print (sess.run(W.op))
    print (W.shape)
    print ("###################(7)###############")
    print (sess.run(X))

结束

体验非常好的在线学习平台,第一次手动搭建每一个部件让我更加清晰的了解了TensorFlow每一个部件的实现,我觉得我最关键的就是要自己多打代码,尝试改进。用实战提升自己对深度学习的理解。

《深度学习实战实验(一)》
《深度学习实战实验(一)》

    原文作者:马卡斯·扬
    原文地址: https://zhuanlan.zhihu.com/p/37878918
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞