这里整理一下tensorflow变成过程中遇到的一些常见的函数,会不会不知道,用就完了。/(ㄒoㄒ)/~~
1.tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None)
这个函数主要使用在filter的卷积操作。
input:输入tensor(不知道tensor是啥的请看我的另一篇文章,tensorflow初识。--有可能现在还是一片草稿),这个tensor要有固定shape[
batch, in_height, in_width, in_channels],分别对应训练时一个batch的图像数量,图像高度,图像宽度,和图像的通道数。
filter:卷积核的tensor,同样要有固定的shape[filter_height, filter_width, in_channels, out_channels],具体和input的差不多,特殊说明一下,其中的in_channels与input的in_channels要对应,通道数是一样的。
strides:步长,不做解释,不懂得自行度娘卷积运算。这是一个一维的向量。
padding:只能从“SAME”和“VAILD”中选择,前者表示卷积核可以停留在图像边缘,若卷积核大小定为3*3,input为5*5即第一次乘卷积核的中心对应的是input的1,1,其他卷积核露出来的地方一般是0补全,卷积之后的大小是5×*5,后者表示不可以停留在图像边缘,即第一次乘的时候,卷积核的中心对应的是input的3,3,卷积之后的大小是3*3,会降维。
use_cudnn_on_gpu:是否使用GPU加速,一般是TRUE
返回值是一个tensor,格式为[batch, height, weight, channel]
具体详见:
https://www.cnblogs.com/qggg/p/6832342.html(这里表示感谢,O(∩_∩)O蟹蟹)
2.tf.nn.max_pool(value, ksize, strides, padding, name=none)
这个函数执行最大池化功能。
value:需要池化的输入,一般是feature map, 依然需要[batch, height, weight, channels]这样的shape
ksize:池化窗口的大小,取一个四维的向量,一般是[1, height, weight, 1],因为我们不想在batch,和channel上做池化,所以一般这两个参数设置为1.
stride:步长,一般设置为[1, stride, stride, 1]原因同ksize。
padding:和卷积类似,取“SAME”或者“VALID”
返回值是一个tensor,依旧是[batch, height, weight, channel]的格式
3.tf.split(value, num_or_size_splits, axis=0, nume=None, name='spilt')
这个函数执行将一个tensor划分为几个子tensor
value:需要被划分的tensor。
num_or_size_spilts:可以有两种形式。第一种:整形,就直接在axis=D的维度上把tensor平均分成int份。第二种,传递的是一个向量,但是这个向量的内和,要与原始的tensor的维度上的数值相等。那么就根据这个向量将原有的tensor对应划分。简单点说就是前者是平均的划分,后者是不平均的划分。
axis:准备在第几个维度上进行切割。
# 张量为(5, 30)
# 这个时候5是axis=0, 30是axis=1,如果要在axis=1这个维度上把这个张量拆分成三个子张量
#传入向量时
split0, split1, split2 = tf.split(value, [4, 15, 11], 1)
tf.shape(split0) # [5, 4]
tf.shape(split1) # [5, 15]
tf.shape(split2) # [5, 11]
# 传入整数时
split0, split1, split2 = tf.split(value, num_or_size_splits=3, axis=1)
tf.shape(split0) # [5, 10]
具体详见:
https://blog.csdn.net/mls0311/article/details/82052472(这里表示感谢,O(∩_∩)O蟹蟹)
4.tf.concat(values, concat_dim, name='concat')
这个函数主要实现tensor的拼接。
values:是一个列表,列表里是需要连接的矩阵或者数组。
concat_dim:表示你所要连接的维度。
t1 = [[1, 2, 3], [4, 5, 6]]
t2 = [[7, 8, 9], [10, 11, 12]]
tf.concat([t1, t2], 0) # [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
tf.concat([t1, t2], 1) # [[1, 2, 3, 7, 8, 9], [4, 5, 6, 10, 11, 12]]
# tensor t3 with shape [2, 3]
# tensor t4 with shape [2, 3]
tf.shape(tf.concat([t3, t4], 0)) # [4, 3]
tf.shape(tf.concat([t3, t4], 1)) # [2, 6]
以上代码举例说明了在第0维度和在第1维度分别进行拼接。
5.tf.resahpe(tensor, shape, name='None')
函数的作用是将tensor转换为shape的格式。
tensor:代转换的tensor。
shape:转换之后的shape。特殊说明的是,其中的-1参数,在shape中有且只能有一个,代表那一维度不用我们指定大小,系统会自动计算。
6.tf.nn.dropout(x, keep_prob, noise_shape=None, seed=None, name=None)
函数的作用是执行dropout操作。
dropout函数会以一个概率为keep_prob来决定神经元是否被抑制。如果被抑制,该神经元输出为0,如果不被抑制则该神经元的输出为输入的1/keep_probbe倍
x:输入
keep_prob:设置神经元被选中的概率,在初始化时该参数是一个占位符,keep_prob=tf.palceholder(tf.float32)。在run时设置keep_prob的值,例如keep_prob=0.5
noise_shape:一个int32的一维tensor,表示随机保留丢弃的形状。可以不指定,表示每个元素独立安排保留或者丢弃。若设定,x的形状必须是可以广播的。当noise_shape[i] == shape(x)[i],x中的元素是相互独立的。如果shape(x)=[k,l,m,n](k表示数据的个数,l表示数据的行数,m表示数据的列,n表示通道),当noise_shape=[k,1,1,n],表示数据的个数与通道是相互独立的,但是与数据的行和列是有关联的,即要么都为0,要么都为输入的1/keep_prob倍。
下面举个栗子:
import tensorflow as tf
dropout = tf.placeholder(tf.float32)
x = tf.Variable(tf.ones([10, 10]))
y = tf.nn.dropout(x, dropout)
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
a = sess.run(y, feed_dict = {dropout: 0.5})
print(a)
结果:
[[0. 2. 0. 2. 2. 2. 0. 2. 2. 2.]
[2. 0. 0. 0. 2. 2. 0. 2. 0. 2.]
[0. 0. 2. 2. 2. 0. 2. 2. 2. 2.]
[0. 0. 2. 2. 0. 0. 2. 2. 0. 2.]
[0. 2. 0. 0. 2. 0. 0. 0. 0. 0.]
[2. 0. 0. 0. 0. 2. 0. 0. 0. 0.]
[0. 2. 0. 0. 2. 2. 2. 0. 2. 0.]
[0. 2. 2. 2. 0. 0. 0. 2. 0. 2.]
[0. 0. 2. 0. 2. 2. 0. 2. 0. 0.]
[0. 2. 2. 2. 2. 0. 2. 0. 2. 2.]]
Process finished with exit code 0
7.convert_to_tensor(values, dtype, name=None, preferred_dtype=None)
此函数实现将python对象转化为Tensor对象。他接受Numpy数组,python列表,和python标量。
value:待转化的对象
dtype:返回的Tensor可选元素类型,若改值为空,,则将从值的类型中判断。
name:创建的新Tensor使用的名称。
preferred_dtype:返回Tensor的可选元素类型。在某些情况下,调用方在转换为张量时可能没有 dtype,因此 preferred_dtype 可以作为软首选项使用。如果转换为 preferred_dtype 是不可行的,则此参数无效。
注意:
- TypeError:如果没有为值注册转换函数。
- RuntimeError:如果注册的转换函数返回无效值
举个栗子:
import numpy as np
def my_func(arg):
arg = tf.convert_to_tensor(arg, dtype=tf.float32)
return tf.matmul(arg, arg) + arg
# The following calls are equivalent.
value_1 = my_func(tf.constant([[1.0, 2.0], [3.0, 4.0]]))
value_2 = my_func([[1.0, 2.0], [3.0, 4.0]])
value_3 = my_func(np.array([[1.0, 2.0], [3.0, 4.0]], dtype=np.float32))