文章目录
1 tf.add_to_collection
- tf.add_to_collection(‘list_name’, element):将元素element添加到列表list_name中
- tf.get_collection(‘list_name’):返回名称为list_name的列表
- tf.add_n(list):将列表元素相加并返回
import tensorflow as tf
tf.add_to_collection('losses', tf.constant(2.2))
tf.add_to_collection('losses', tf.constant(3.))
with tf.Session() as sess:
print(sess.run(tf.get_collection('losses')))
print(sess.run(tf.add_n(tf.get_collection('losses'))
结果:
[2.2, 3.0]
5.2
注意:
使用tf.add_n对列表元素进行相加时,列表内元素类型必须一致,否则会报错。
2 集合
函数 | 集合 | 意义 |
---|---|---|
tf.global_variables() | GLOBAL_VARIABLES | 存储和读取checkpoints时,使用其中所有变量跨设备全局变量集合 |
tf.trainable_variables() | TRAINABLE_VARIABLES | 训练时,更新其中所有变量存储需要训练的模型参数的变量集合 |
tf.moving_average_variables() | MOVING_AVERAGE_VARIABLES | ExponentialMovingAverage对象会生成此类变量实用指数移动平均的变量集合 |
tf.local_variables() | LOCAL_VARIABLES | 在global_variables()之外,需要用tf.init_local_variables()初始化进程内本地变量集合 |
tf.model_variables() | MODEL_VARIABLES | Key to collect model variables defined by layers.进程内存储的模型参数的变量集合 |
. | QUEUE_RUNNERS | 并非存储variables,存储处理输入的QueueRunner |
. | SUMMARIES | 并非存储variables,存储日志生成相关张量 |
3 tf.squeeze
该函数返回一个张量,这个张量是将原始input中所有维度为1的那些维都删掉的结果
axis可以用来指定要删掉的为1的维度,此处要注意指定的维度必须确保其是1,否则会报错,axis的参数可以是列表或整数
squeeze(
input,
axis=None,
name=None,
squeeze_dims=None
)
4 tf.meshgrid
meshgrid用于从数组a和b产生网格。生成的网格矩阵A和B大小是相同的。它也可以是更高维的。用法: [A,B]=Meshgrid(a,b),生成size(b)Xsize(a)大小的矩阵A和B。它相当于a从一行重复增加到size(b)行,把b转置成一列再重复增加到size(a)列
注意:生成的矩阵A,B的尺寸是相同的,size(b)xsize(a),同时A,B二者生成的值相互独立
a=[0,5,10]
b=[0,5,15,20,25]
A,B=tf.meshgrid(a,b)
with tf.Session() as sess:
print (A.eval())
print (B.eval())
'''
结果
[[ 0 5 10]
[ 0 5 10]
[ 0 5 10]
[ 0 5 10]
[ 0 5 10]]
[[ 0 0 0]
[ 5 5 5]
[15 15 15]
[20 20 20]
[25 25 25]]
'''
这里的A,B可以是多维的
a = np.arange(4)
b = np.tile(np.expand_dims(a, 0),[4, 1])
aa, bb = np.meshgrid(a,b)
print(aa)
print(bb)
'''
output:
[[0 1 2 3]
[0 1 2 3]
[0 1 2 3]
[0 1 2 3]
[0 1 2 3]
[0 1 2 3]
[0 1 2 3]
[0 1 2 3]
[0 1 2 3]
[0 1 2 3]
[0 1 2 3]
[0 1 2 3]
[0 1 2 3]
[0 1 2 3]
[0 1 2 3]
[0 1 2 3]]
[[0 0 0 0]
[1 1 1 1]
[2 2 2 2]
[3 3 3 3]
[0 0 0 0]
[1 1 1 1]
[2 2 2 2]
[3 3 3 3]
[0 0 0 0]
[1 1 1 1]
[2 2 2 2]
[3 3 3 3]
[0 0 0 0]
[1 1 1 1]
[2 2 2 2]
[3 3 3 3]]
'''
其实原理一样,此时aa.shape=[B元素个数,len(a)] aa.shape==bb.shape
5 tf.slice()
函数:tf.slice(inputs, begin, size, name)
作用:从列表、数组、张量等对象中抽取一部分数据
begin和size是两个多维列表,他们共同决定了要抽取的数据的开始和结束位置
begin表示从inputs的哪几个维度上的哪个元素开始抽取
size表示在inputs的各个维度上抽取的元素个数
若begin[]或size[]中出现-1,表示抽取对应维度上的所有元素
6 tf.where()
tf.where(
condition,
x=None,
y=None,
name=None
)有两种用法
*如果x,y是空,则返回condition中值是TRUE的索引
举个例子:
a = np.array([1, 2, 1, 2, 1, 1, 2])
b = tf.reshape(tf.where(tf.equal(a, 1)), [-1])
with tf.Session() as sess:
print(b.eval())
#output:
#[0 2 4 5]
*如果x,y不是空,则其中x,y均为尺寸一致的tensor,作用是将a中对应input中true的位置的元素值不变,其余元素进行替换,替换成y中对应位置的元素值,下面使用代码来说明:
a=np.array([[1,0,0],[0,1,1]])
a1=np.array([[3,2,3],[4,5,6]])
with tf.Session() as sess:
print(sess.run(tf.equal(a,1)))
print(sess.run(tf.where(tf.equal(a, 1), a1, 1 - a1)))
'''
[[ True False False]
[False True True]]
[[ 3 -1 -2]
[-3 5 6]]
'''
7 输出tensorflow ckpt文件节点名
from tensorflow.python import pywrap_tensorflow import os checkpoint_path = MODEL_FILE_CKPT reader = pywrap_tensorflow.NewCheckpointReader(checkpoint_path) var_to_shape_map = reader.get_variable_to_shape_map() for key in var_to_shape_map: print("tensor_name: ", key)
8 tf.image.crop_and_resize()
tf.image.crop_and_resize(
image,
boxes,
box_ind,
crop_size,
method=‘bilinear’,
extrapolation_value=0,
name=None
)
-
default_image_size: 张量,[batch,w,h,c]必须是下列类型之一:uint8,uint16,int8,int16,int32,int64,half,float32,float64; 注意:每张图片的尺寸必须相同
-
boxes:指需要划分的区域,输入格式为 [[ymin,xmin,ymax,xmax]] (要注意!这是一个二维列表)。官网在这里讲了一大段,看着简直头晕,大概意思是分了两种情况,一种是超出1另一种就是不超出1的。先将输入值范围为0–1的情况,这里其实是这样:
设crop的区域坐标为 [ y1,x1,y2,x2 ],那么想得到相应正确的crop图形就一定要归!一!化!,即图片长度为 [ W,H ],则实际输入的boxes为 [ y1/H,x1/W,y2/H,x2/W ]。
那超出1的范围是个啥意思咧?程序将为你自动补齐的意思,我试了几次都是直接用空白补齐,不知道大家有没有不一样的结果,注意奥!你的范围要是全部超出1,那就稳稳当当是个黑色框了,因为超出1根据归一化截取不到图片任何内容啦! -
box_ind,就是boxes每一个对应的在batch中的标号,比如说,batch=2,len(boxes)是5,则假设一种对应关系,box_ind=[0,1,1,0,1],即是boxes第一个[ymin,xmin,ymax,xmax]属于第一张图片,boxes第二个[ymin,xmin,ymax,xmax]属于第二张图片,boxes第三个属于第二张图片。
-
crop_size:这个参数就可想而知啦,本来这就是我用这个函数的原因,输入一个大小即可,可以忽视通道数量这些
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
import cv2
img = cv2.imread('timg.jpg')
img1 = cv2.resize(img, (224, 224))
imgs = np.array([img1,img1])
shape = img1.shape
a = tf.image.crop_and_resize(imgs,[[0.5,0.5,0.6,0.2],[0.5,0.5,1.3,0.9],[0.5,0.5,1.3,0.9]],
box_ind=[0,1,1],crop_size=(100,100))
sess = tf.Session()
b = a.eval(session = sess)
print(b.shape)
#输出:(3, 100, 100, 3)
9 tensorflow关于"=="的坑
在目标检测的很多代码里都会有这样的代码
max_iou = tf.reduce_max(iou, axis=-1, keep_dims=True)
max_mask = tf.cast(iou>=max_iou, dtype=tf.float32)
max_iou是最后一维度的最大值,max_mask是将最大值位置标记成True例如
iou=[1,2]
max_iou = 2
max_mask = [False,True]
注意:这里的’>=‘不能换成’‘因为在tensorflow中,’‘是比较两个tensor的,而不是比较两个数值,比较数值是否相等要用tf.equal函数,而’>='则是比较两个tensor的数值大小。
例如:
a = tf.constant([1,2])
max = tf.reduce_max(a)
c = (a==max)
print(c) #false
d = (a>=max)
e = tf.equal(a,max)
with tf.Session() as sess:
print(d.eval()) #[True,False]
print(e.eval()) #[True,False]
总而言之,’==‘是用来比较两个tensor是否相同,’>='是用来比较数值大小的,比较两个tensor值是否相同要用tf.equal*
10 tensorflow 常用三种优化器
第一种和第二种需要自行设定learning_decay,否则有可能不会收敛,第三种只需要设定初始learning_rate即可
tf.train.GradientDescentOptimizer
__init__(
learning_rate,
use_locking=False,
name='GradientDescent'
)
- learning_rate: (学习率)张量或者浮点数
- use_locking: 为True时锁定更新
- name: 梯度下降名称,默认为"GradientDescent"
tf.train.MomentumOptimizer
其中, 即momentum,表示要在多大程度上保留原来的更新方向,这个值在0-1之间,在训练开始时,由于梯度可能会很大,所以初始值一般选为0.5;当梯度不那么大时,改为0.9。 是学习率,即当前batch的梯度多大程度上影响最终更新方向,跟普通的SGD含义相同。
__init__(
learning_rate,
momentum,
use_locking=False,
name='Momentum',
use_nesterov=False
)
- learning_rate: (学习率)张量或者浮点数
- momentum: (动量)张量或者浮点数
- use_locking: 为True时锁定更新
- name: 梯度下降名称,默认为 “Momentum”.
- use_nesterov: 为True时,使用 Nesterov
tf.train.AdamOptimizer
__init__(
learning_rate=0.001,
beta1=0.9,
beta2=0.999,
epsilon=1e-08,
use_locking=False,
name='Adam'
)