tensorflow是深度学习领域最受欢迎的框架之一,其内部高度集成的方法为编写深度神经网路算法提供了极大的便利,然而在使用该框架时,必须对内部的方法有一定了解,否则完成一个深度学习的应用还是有一定难度的。本文旨在对tensorflow框架中常见的方法进行简单介绍,希望对新接触tensorflow的小伙伴有一定帮助。
一.tensorflow中生成向量
1.ones(shape, dtype=tf.float32, name=None)
Creates a tensor with all elements set to 1. 按照shape生成一个dtype类型的全1张量
例子: tf.ones([2, 3], tf.int32) # [[1, 1, 1], [1, 1, 1]]
这个方法跟numpy模块中的 ones(shape, dtype=None, order='C')很相似
2.zeros(shape, dtype=tf.float32, name=None)
Creates a tensor with all elements set to zero.按照shape生成一个dtype类型的全0张量
例子: tf.zeros([2, 3], tf.int32) # [[0, 0, 0], [0, 0, 0]]
上述两种方法只能生成全0和全1的张量,tensorflow中同样提供了可以生成任意元素的张量
3.fill(dims, value, name=None)
Creates a tensor filled with a scalar value.按照dims,(同上述方法的shape)生成一个全value张量
例子:fill([2, 3], 9) ==> [[9, 9, 9],[9, 9, 9]]
4.constant(value, dtype=None, shape=None, name='Const', verify_shape=False)
Creates a constant tensor.创建一个常量tensor,按照给出value来赋值,可以用shape来指定其形状。value可以是一个数,也可以是一个list。 如果是一个数,那么这个常量中所有值的按该数来赋值。 如果是list,那么len(value)一定要小于等于shape展开后的长度。赋值时,先将value中的值逐个存入。不够的部分,则全部存入value的最后一个值
例子:a = tf.constant(3,shape=[2])
b = tf.constant(3,shape=[2,2])c = tf.constant([1,2,3],shape=[5])
d = tf.constant([1,2,3],shape=[3,2])
sess = tf.Session()
print(sess.run(a))
#[3 3]
print(sess.run(b))
#[[3 3]
# [3 3]]
print(sess.run(c))
#[1 2 3 3 3]
print(sess.run(d))
#[[1 2]
# [3 3]
# [3 3]]
5.tf.random_normal|tf.truncated_normal|tf.random_uniformrandom_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)random_uniform(shape, minval=0, maxval=None, dtype=tf.float32, seed=None, name=None)这几个都是用于生成随机数tensor的。
random_normal: 正态分布随机数,均值mean,标准差stddev
truncated_normal:截断正态分布随机数,均值mean,标准差stddev,只保留[mean-2*stddev,mean+2*stddev]范围内的随机数
random_uniform:均匀分布随机数,范围为[minval,maxval]
二. 矩阵变换
1.reshape(tensor, shape, name=None)
Given `tensor`, this operation returns a tensor that has the same values
例子:
(1) t1= [1, 2, 3, 4, 5, 6, 7, 8, 9]
reshape(t1, [3, 3]) ==> [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
(2)t2=[[[1, 1], [2, 2]],
[[3, 3], [4, 4]]]
reshape(t2, [2, 4]) ==> [[1, 1, 2, 2],
[3, 3, 4, 4]](3)在reshape函数中,-1使用很灵活,可以用来推断形状
以t3为例 t3=[[[1, 1, 1],
[2, 2, 2]],
[[3, 3, 3],
[4, 4, 4]],
[[5, 5, 5],
[6, 6, 6]]]容易看到t3.shape=(3,2,3) 1)shape参数只给定一个-1,这时会把tensor转化为一维张量
reshape(t3, [-1]) ==> [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6]2)shape参数其中一个位置定为-1,那么reshape方法会自动根据原tensor的shape进行转换 reshape(t, [2, -1]) ==> [[1, 1, 1, 2, 2, 2, 3, 3, 3],
[4, 4, 4, 5, 5, 5, 6, 6, 6]]reshape(t, [3, -1]) ==> [[1, 1, 1, 2, 2, 2], [3, 3, 3, 4, 4, 4],
[5, 5, 5, 6, 6, 6]]
三.卷积神经网络中的相关方法
1.placeholder(dtype,shape=None, name=None)
此函数可以理解为形参,用于定义过程,在执行时再赋具体的值
2.matmul(a, b, transpose_a=False, transpose_b=False, adjoint_a=False,
adjoint_b=False,a_is_sparse=False, b_is_sparse=False, name=None)
计算两个张量乘积,也就是矩阵相乘
3.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=True,
data_format='NHWC',dilations=[1, 1, 1, 1], name=None)
参数:
input:卷积的输入图像,是一个4维的tensor,shape为[batch,in_height,in_width,in_channels]
具体含义[batch_size,图片高度,宽度,通道数],对于灰度图片来讲,通道数维1
filter:CNN的卷积核,也就是卷积核的共享权值,4维tensor,[fil_height,fil_width,in_channels,out_channels]
具体含义:[卷积核高度,宽度,图像通道数,卷积核个数],卷积核个数对应feature的个数
strides:卷积时在图像每一维的步长,这是一个一维的向量,长度4
padding:string类型的量,只能是"SAME","VALID"其中之一
use_cudnn_on_gpu:默认使用gpu加速
max_pool(value, ksize, strides, padding, data_format='NHWC', name=None)
参数:
value:需要池化的输入(也就是卷积之后的到的feature map),格式[batch, height, width, channels]
ksize:池化窗口的大小,一般为[1,height,width,1],因为不希望在batch和channel上做池化,因此定为1
strides:窗口在每个维度上滑动的步长,一般为[1,stride,stride,1]
tf.nn.dropout是tensorflow里面为了防止过拟合而使用的函数,它一般用在全连接层。
Dropout就是在不同的训练过程中随机扔掉部分神经元。也就是让某个神经元的激活值以一定的概率p,让其停止工作,这次训练过程中不更新权值,也不参加神经网络的计算。
tf.nn.dropout(x, keep_prob, noise_shape=None, seed=None,name=None)
第一个参数x:指输入
第二个参数keep_prob: 设置神经元被选中的概率,在初始化时keep_prob是一个占位符,
keep_prob = tf.placeholder(tf.float32) 。
tensorflow在run时设置keep_prob具体的值,例如keep_prob: 0.5