Tensorflow中各种小trick和知识点。从版本对应,到模型生成等都有:(个人记录,快查表)
版本问题
tensorflow 1.13以上 要用CUDA10 对应CuDNN 7.4
1.5-1.12 CUDA9
凸(艹皿艹 )了。
查看cuda 版本
cat /usr/local/cuda/version.txt
cudnn 版本
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
显存查看
nvidia-smi
Pwr:Usage/Cap:能耗表示
Memory-Usage:显存使用率
Volatile GPU-Util:浮动的GPU利用率
anaconda换源
常见换源很简单
channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
ssl_verify: true
注意如果需要pytorch, 还需要添加pytorch的镜像:
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
将以上配置文件写在~/.condarc
中vim ~/.condarc
网上找了个很快的
channels:
- https://mirrors.ustc.edu.cn/anaconda/pkgs/main/
- https://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
- defaults
show_channel_urls: true
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pandas
共用的服务器看是谁在用显卡
pip install gpustat
gpustat
查看目录下所有文件大小
du -B G --max-depth=1 /home/DATA/
简单说下,-B G是说我要看的单位是G,别给我整KB
--max-depth=1 是说我只看本层的子文件夹,子文件夹的子文件夹别给我显示出来,眼晕
更多参数查看 du --help
运行模型时控制显存
使用模型时默认占满所有显存,想控制显存,只使用需要的显存量时
sess_config = tf.ConfigProto(allow_soft_placement=False)
sess_config .gpu_options.allow_growth = True
sess = tf.Session( config = sess_config )
sess.run(init)
打印模型中所有的节点
for op in self.graph.get_operations():
print(op.name)
# or
for ts in [n.name for n in tf.get_default_graph().as_graph_def().node]:
print(ts)
将checkpoint模型固化为pb文件
获得模型中节点之后,确定模型的输入输出节点名
self.tensor_image = self.graph.get_tensor_by_name('TfPoseEstimator/image:0')
self.tensor_heatMat = self.graph.get_tensor_by_name('TfPoseEstimator/Mconv7_stage3_l2/BiasAdd:0')
self.tensor_pafMat = self.graph.get_tensor_by_name('TfPoseEstimator/Mconv7_stage3_l1/BiasAdd:0')
自己定义也行
self.tensor_pafMat_up = tf.image.resize_area(self.tensor_pafMat,
(184,328),align_corners=False,name='upsample_pafmat')
然后模型初始化,确定一些batch等的维度,最好运行一次,毕竟模型定义时有些维度是空着的
peaks,heatMat_up,pafMat_up = self.persistent_sess.run(
[self.tensor_peaks, self.tensor_heatMat_up, self.tensor_pafMat_up],feed_dict={
self.tensor_image:[img]
} )
固化模型
output_graph_def = tf.graph_util.convert_variables_to_constants(self.persistent_sess,self.persistent_sess.graph_def,["Select","upsample_heatmat","upsample_pafmat"])
with tf.gfile.GFile('freeze_pose.pb' , 'wb') as f:
f.write(output_graph_def.SerializeToString())
# 这个是OpenPose模型,Select节点是输出peaks,打印所有节点才可看到peak节点名为Select
当然,使用Object Detection API时,运行inference.py可以自动得到pb文件和cpkt模型
eval定时进行
model.lib文件中
tf.estimator.EvalSpec结构体中,加入一个参数
throttle_secs=10800
定时三小时进行一次eval
张量相关的数值操作
tf.fill(shape,value, name="")
为制定形状填充,例如tf.fill([2,3],1) -> [[1 1 1][1 1 1]]
tf.constant(value,shape)
生成常量例如 tf.constant(1, [2,3]) -> [[1 1 1][1 1 1]]
更详细的参数其实是下面这和
tf.constant(
value,
dtype=None,
shape=None,
name='Constant',
vertify_shape=False
)
都是填充,二者区别?
tf.fill只能填充标量,而tf.constant可以填充多种类型
tf.constant(value="demo")
print(sess.run(hello1))后返回 demo
hello2 = tf.constant(value=["demo","1","2"],dtype=tf.string,shape=[2,3])
返回
[['demo' '1' '2']
['2' '2' '2']]
区别则在此。
tf.slice(input,begin,size,name=None)数据切片
begin指的是切片起点,size分别是各个维度分别取几个数据,有-1是该维度都取
因而begin、size是list类型,每位一一对应,0 <= begin每位 <= size对应
x=[[1,2,3],[4,5,6]]
with tf.Session() as sess:
begin = [0,1] # 从x[0,1],即元素2开始抽取
size = [1,2]
# 从x[0,1]开始,size[1,2]中 ”1“是 对x的第一个维度(行)抽取1个元素,即只取[1,2,3]
# “2”是 在对x的第二个维度(列)抽取2个元素,即[2,3]
print sess.run(tf.slice(x,begin,size)) # 输出[[2 3]]
tf.argmax()最大值的位置
test = np.array([[1, 2, 3], [2, 3, 4], [5, 4, 3], [8, 7, 2]])
np.argmax(test, 0) #输出:array([3, 3, 1]
np.argmax(test, 1) #输出:array([2, 2, 0, 0]
怎么解释呢。test中维度是4x3。第二个参数是决定最大值是什么范围里的最大值:
0:比较不同元素中最大的值,一个元素是3维,因而输出三维结果,每个位置3,3,1代表最大值分别在3,3,1号元素中
1:比较每个元素中最大的值,4个元素,输出4维结果,2,2,0,0代表每个元素中最大值的位置
tf.equal的使用
tf.equal(A,B)
相等返回true, 不等返回false , 维度和A 一样
A = [[1,3,4,5,6]]
B = [[1,3,4,3,2]]
with tf.Session() as sess:
print(sess.run(tf.equal(A, B)))
返回[[ True True True False False]]
tf.reduce_mean的使用
求平均值
reduce_mean(input_tensor,
axis=None,
keep_dims=False,# false是降维
name=None,
reduction_indices=None)
np.array格式写到txt中
np.set_printoptions(threshold=np.inf)
然后f.write(str(my_variables))
Keras
Keras的applications模块中就提供了带有预训练权重的深度学习模型。
该模块会根据参数设置,自动检查本地的~/.keras/models/目录下是否含有所需要的权重,没有时会自动下载,在notebook上下载会占用notebook线程资源,不太方便,因此也可以手动下载后放入该目录。
这段简单的数据处理的代码教程实在看起来费劲,敲了一遍囫囵吞枣还是不太懂。先记下来看以后能不能懂吧。
Pytorch
精简入门中文教程
http://pytorch123.com/ThirdSection/DataLoding/
Tips
1 任何使张量会发生变化的操作都有一个前缀 '_'。例如:x.copy_(y)
2. import torchvision.transforms as transforms
torchvision 数据集的输出是范围在[0,1]之间的 PILImage,我们将他们转换成归一化范围为[-1,1]之间的张量 Tensors。