Closed NarcissusInMirror closed 4 years ago
撰写毕业论文,现已达到字数要求,差背景介绍部分、部分图表、和排版工作
[ ] 梯度弥散&梯度消失&梯度爆炸? Tex
https://github.com/sqyx008/BUPTBachelorThesis/issues/17#issuecomment-392757819
Format → Paragraph
进行修改\begin{table}[htbp]
\center
\caption{ Example}
\resizebox{\textwidth}{12mm}{ %12可随机设置,调整到适合自己的大小为止
\begin{tabular}{lll}
\hline
Example& Example& Example\\
\hline
S1& Example&Example \\
S2& Example&ExampleExampleExampleExampleExample \\
\hline
\end{tabular}}%注意这里还有一个半括号
\end{table}
即在begin tabular上套上\resizebox{\textwidth}{12mm}{ }
,其中12是可调的参数,可以调到50~60的样子
CUDA是英伟达开发的用于自家GPU的并行计算框架
a general purpose parallel computing platform and programming model that leverages the parallel compute engine in NVIDIA GPUs to solve many complex computational problems in a more efficient way than on a CPU.
而cuDNN是CUDA Deep Neural Network library,是英伟达打造的针对深度神经网络的加速库,是一个用于深层神经网络的GPU加速库
nvcc -V
查询CUDA的版本和博客中所示查出来的版本可能不同,原因是服务器上装了多个版本的CUDA,而nvcc -V
查出来的版本是正在使用的版本。
concatenate只能连接维度数相同的数组,如果想将一个二维数组接到三维数组上,需先将二维数组reshape到三维
>>> a = np.array([[1,2],[3,4]])
>>> b = np.array([[5,6],[7,8]])
>>> np.concatenate((a,b)) # 直接连接得到的仍然是二维的数组
array([[1, 2],
[3, 4],
[5, 6],
[7, 8]])
>>> a = a.reshape([1, 2, 2]) # 将a reshape为三维数组
array([[[1, 2],
[3, 4]]])
>>> a.concatenate((a,b)) # 将二维数组和三维数组进行连接会报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: all the input arrays must have same number of dimensions
>>> a = np.concatenate((a,b))
>>> a
array([[[1, 2],
[3, 4]],
[[5, 6],
[7, 8]]])
cv2.error: OpenCV(3.4.2) /opt/concourse/worker/volumes/live/9523d527-1b9e-48e0-7ed0-a36adde286f0/volume/opencv-suite_1535558719691/work/modules/videoio/src/cap_ffmpeg.cpp:296: error: (-215:Assertion failed) image.depth() == 0 in function 'write'
ls -lh filename
,也可以使用ls -lht
查看当前目录下所有文件的大小du -hs filename
,其中h
代表human-readable
即输出带有KB、MB、GB单位的大小,否则输出一个没有单位的数字。注意参数顺序,如果先打s再打h则会忽略h。CV_FOURCC('P','I','M','1') = MPEG-1 codec CV_FOURCC('M','J','P','G') = motion-jpeg codec CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec CV_FOURCC('U', '2', '6', '3') = H263 codec CV_FOURCC('I', '2', '6', '3') = H263I codec CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec
其实就是将每行数据写入列表中,按行写入表格
from openpyxl import Workbook
wb = Workbook()
ws = wb.create_sheet("aaa")
buffer = [0, 1, 2, 3, 4]
ws.append(buffer) # 在sheet中写入一行
wb.save("data.xlsx") # 保存表格
这里要注意,如果从文本中截取数字并写入文件,写入之前最好将数字部分强制转换为int型,否则导入excel中表面上看着没有问题,但无法作图。将错误数据复制到sublime中可以看到,每个数字还带了两个引号。
如果要向已有表格中添加sheet则需要使用如下语句
from openpyxl import load_workbook
wb = load_workbook("data.xlsx")
ws = wb.create_sheet("bbb") # 将在原有表格内创建新的sheet
···
wb.save("data.xlsx")
下表为struct.pack
的第一个参数的可选项
python写.dat文件
import struct # 使用struct模块
data = 0x00000000
with open('sample_struct.dat', 'wb') as f: # 打开要写的文件,打开方式为'wb',write binary
sn=struct.pack('B', data) # 写入的关键语句,第一个参数为存储类型,具体见上表;第二个参数为存储数据
f.write(sn)
with open('sample_struct.dat', 'rb') as f: # 打开要写的文件,打开方式为'rb',read binary
sn = f.read(1) # 这里的数字代表读出数据要预留的buffer大小,根据二进制文件中存储的数据类型对应相应的大小,可在上表中查出
data = struct.unpack('B', sn)
h,w,depth=img.shape
img=cv2.resize(img,(int(w/2),int(h/2)),interpolation=cv2.INTER_AREA) # 交换height和width的顺序
其中,interpolation参数代表所使用的插值方法,其选项如图所示
f.close()
,使用os.path.getsize()
得到的文件大小不是最终的文件大小。例如预期得到的文件大小为72000byte,如果在关掉句柄之前就读文件,得到的大小会小于72000.open
函数设定相关参数。out.write()
函数,参数的意义在下面代码的注释中#include <iostream>
#include <fstream> //读写文件要包含的头部
using namespace std;
int main()
{
unsigned char a[8] = {0, 255, 52, 53, 54, 55, 56, 57}; //写文件的buffer
unsigned char b[8]; //读文件的buffer
// 写文件
ofstream ouF;
ouF.open("./me.dat", std::ofstream::binary); //第二个参数是读写二进制文件的关键
ouF.write(reinterpret_cast<const char*>(a), sizeof(int) * 2);
// 第一个参数是将指针强制转换成char型的,我的理解是读取二进制数据时需要每次读一个字节,
// 指针自加时每次增加一个字节。
// 第二个参数是读出的字节数,填数字即可,这里sizeof(int)*2和8是等价的,即读出八个字节
ouF.close();
// 读出文件
ifstream inF;
inF.open("./me.dat", std::ifstream::binary);
int counter = 0;
char * c = reinterpret_cast<char*>(b); // 将指针转换为char型
// 下方的条件用以判断是否读到文件末尾。使用!inF.eof()会导致多读一个字节,原因不明。
while(inF.peek() != EOF)
{
inF.read(c, sizeof(unsigned char) * 1); //每次读出一个字节到数组b中
cout<<counter<<endl;
cout<<c<<endl; //打印出指针所指地址的值,即当前读出的字节
counter ++;
c ++ ; //指针自加
}
inF.close();
return 0;
}
下面是参考这篇博客的方法进行的一次实践
//测试发现,如果不加入wraper,在python程序中只能找到主函数int main()且不能有任何参数
//楷神说这就是接口标准之类的一系列问题导致的,main函数可以找到是因为这是程序的入口,所以有一个标准的规定,其他函数就不一定了(大概是这意思,回头再改)
extern "C"
{
void compress_data(char * read_path, char * write_path);//需要在python中调用的函数的声明
}
.so
文件调用
# 在mac上可以使用以下两行代码,在linux上好像参数W1得改成Wl(小写的l)这个实在是有点扯,1和l也太像了,怎么会挑这么两个相似的参数
$ g++ -c -fPIC foo.cpp -o foo.o
$ g++ -shared -W1, -soname, foo.so -o foo.so foo.o
# 或者使用如下命令
$ g++ foo.cpp -shared -o foo.so
# 也有可能要添加一个参数
$ g++ -fPIC foo.cpp -shared -o foo.so
import ctypes
lib = ctypes.cdll.LoadLibrary("./foo.so") lib.compress_data.argtypes = [ctypes.c_char_p, ctypes.c_char_p] //这里把调用的C++函数的参数列表的类型改成ctype的相关类型,具体对应关系见官方文档 lib.compress_data(ctypes.c_char_p('./original/sample_struct_0.dat'.encode("ASCII")), ctypes.c_char_p('./simple.dat'.encode("ASCII"))) //调用函数,这里需要使用相应的函数包裹一下参数才行,不然会有typeerror;.encode("ASCII")没有也可以正常运行
nn.functional.xxx是函数接口,而nn.Xxx是nn.functional.xxx的类封装,并且nn.Xxx都继承于一个共同祖先nn.Module。这一点导致nn.Xxx除了具有nn.functional.xxx功能之外,内部附带了nn.Module相关的属性和方法,例如train(), eval(),load_state_dict, state_dict 等。
example.py
,如果在模块内定义了__all__
则当example.py
被其他文件使用from example import *
导入时,只导入__all__
中定义的对象。from example import *
时有影响,不影响使用其他导入语句正常导入
//
操作符Python3中/
直接是浮点运算,//
代表整型运算,即对结果进行flooring操作。而在Python2/
中默认是整型运算,除非其中的一个操作数为浮点数
[ ] view在计算机领域的意思?
输入数据维度:(sample_size, 25)
标签:(sample_size)
可以看到,要求的输入维度形状,即
output = model.forward(input_data)
中output
的形状为(批大小,分类个数 )
,维度为2;输入的标签维度应为(批大小,)
,维度为1,且以0~N-1
代表N
个类别,不接受二维的one-hot编码,这些需要在进行数据处理时注意。
1d的batchnorm输入的向量是2维或者3维的,即(批大小,特征维数)
或(批大小,通道数,特征维数)
。当输入为2维时features参数为特征维数;当输入为3维时,features参数为通道数。但实际上都是沿着channel的维度进行的batchnorm。
顺带学习一下2d的batchnorm。batchnorm2d的输入必须是4维的,(批大小,通道数,图像高度,图像宽度)
,num_features为通道数。
以np.mean(nparray, axis)为例
>>> a = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9], [10, 11, 12])
>>> a
array([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12]])
>>> a.shape
(4, 3)
>>> np.mean(a, axis=0)
array([5.5, 6.5, 7.5])
>>> np.mean(a, axis=1)
array([ 2., 5., 8., 11.])
以axis=0为例,a.shape=[4, 3]
四行三列,当选择axis=0
时,即选中4
,求平均时则求的是4个元素的平均,即按列平均。同理,axis=1时,选中3
,求平均时则求的是三个元素的平均,即按行平均。
torch.max(input, dim, keepdim=False, out=None) -> (Tensor, LongTensor)
>>> a = torch.randn(3,3)
>>> a
-0.7845 -1.7758 -1.5602
1.9941 -1.2037 -0.2332
0.1480 -0.0921 0.4939
[torch.FloatTensor of size 3x3]
>>> torch.max(a)
1.9940658807754517
>>> torch.max(a,0)
(
1.9941
-0.0921
0.4939
[torch.FloatTensor of size 3]
,
1
2
2
[torch.LongTensor of size 3]
)
先占个坑,本次实验中,需要把forward后的向量转成numpy数组进行一些操作,而输入的tensor经过了如下操作,大概是改为gpu向量,具体还需了解,回头补上。
data, label = data.cuda(), label.cuda()
data, label = Variable(data), Variable(label)
optimizer.zero_grad()
output = model.forward(data)
因此进行操作前需要先detach出来并且放到cpu中output = output.detach().cpu()
from scipy.special import softmax
output = softmax(output, axis=1)
存储:
torch.save(model, PATH),model为定义过的nn.Module的子类模块
加载:
model = torch.load(PATH)
model.eval()
Lniux tee 命令
遇到如下场景:
在调试神经网络代码过程中,需要打印出网络中各处的向量形状,但是由于每个epoch都会重复打印,会占据屏幕大量位置,使得训练结果被隐藏。使用如下命令,将形状信息写入
result.txt
中,同时将含有关键字epoch
的行打印在屏幕上。
python test.py | tee result.txt | grep epoch
Resnet源码里有两个类,分别是BasicBlock
和Bottleneck
类,其中BasicBlock
对应着图中Resnet-18和Resnet-34中的含有两个卷积层的模块;Bottleneck
类对应着图中Resnet-50、Resnet-101和Resnet152中的含有三个卷积层的模块。
任务描述如下:共有50个包含不同图片数量的文件夹,目标是大致将文件夹均分为5份,并且移动到五个文件夹内。拆分后任务可分为
任务1 使用os模块中的相应函数即可
num_list = os.listdir(PATH)
file_num = len(num_list)
任务2 使用如下算法进行均分 Python List sort()方法
num_list = [...] # 所有文件夹内包含的数目,共50个元素
num_list.sort(reverse=True)
gourps = 5 # 分为5组
load_balance_groups = [[] for grp in range(groups)] # 构建一个有五个空列表元素的列表
for v in num_list:
load_balance_groups.sort(key=lambda x: sum(x)) # 分别计算五个列表内元素的和并进行排序
load_balance_groups[0].append(v) # 向最小的列表中加入目前最大的元素
for per in load_balance_groups:
print(sum(per))
任务3 要实现通过代码进行文件夹的移动,则需要使用字典进行对数值和文件夹名的映射,并且要解决一对多的问题,即若干个文件有相同的大小,一个键(文件数目)对应了多个值(文件夹)。这里使用如下方法进行了解决,参考:Python 字典的一键多值,即一个键对应多个值, Python 字典(Dictionary) setdefault()方法
# 首先获得文件数目-文件夹名称的字典
for file in file_list:
num = len(img_list)
file_dict = {}
# 字典的setdefault()方法dict.setdefault(key, default=None),给定key,返回该键对应的值,如果该键不存在则返回default设置的值,并添加键值对key-default,在这里即通过这一方法进行键值对的添加,并且应对了一对多的问题
file_dict.setdefault(num, []).append(file)
# 接下来将load_balance_groups中五个列表里的数目替换成对应的文件夹名称
for index, i in enumerate(load_balance_groups):
for x in i:
file_name = file_dict[x][0] # 字典里的每一个值都是列表,取列表中的第一个值
del file_dict[x][0] # 删除掉已经被检索到的文件夹名,防止出现重复
print(file_name)
rep_groups[index].append(file_name)
图中的空间是系统栈空间,代码空间则是存储代码的内存段,对应着下面参考链接中的text段
栈帧:一个函数执行时在栈中开辟的空间 函数内的局部变量存在在该函数的栈帧中,在函数调用结束后就会释放。
>>> a = 10
>>> b = a
>>> b += 10
>>> a
10
>>> b
20
而对于数组等对象则是在堆中开辟内存空间,在栈中存放相应的堆地址。
>>> a = []
>>> b = []
>>> b.append('a')
>>> b
['a']
>>> a
['a']
VNC中删除的文件都没有被真正删除,而是被放在了目录~/.local/share/Trash/files
下
进入目录后通过正则表达式匹配需要恢复的文件,例如今天误删了开头为C0102153
的若干张图片,使用命令mv C0102153* /home/qiushuhao/recover
即可将当前目录下所有开头为C0102153
的文件移动到/home/qiushuhao/recover
目录下。
YOLO分割中得到的四元数组是(boundbox中心x坐标,boundbox中心y坐标,boundbox x轴上长度,boundingbox y轴上长度) 假设boundbox中心的位置是(100,200),即矩阵的100行,200列,这里要注意的是,100对应的是y坐标,而200对应的是横坐标,而非反过来,因为100在前面认为100是横坐标。
PIL中的矩形框的表示
(left, top, right, bottom) 这里不能按照数组的方式进行理解,例如(left, top)这一点中,left是x轴坐标,top是y轴坐标,但如果对应到数组索引中,则这一点对应的则是[top行, left列]
使用mv a.jpg b.jpg
将a.jpg
改名为b.jpg
使用mv a.jpg ./images/b
如果images目录下存在b目录,则命令表示将a.jpg移动到b目录下,如果不存在b目录,或b为一个文件,则将a移动到images且改名为b,替换掉原来的b文件。
This module offers classes representing filesystem paths with semantics appropriate for different operating systems.
可以通过/
运算符进行路径的拼接
>>> from pathlib import Path
>>> father_path = Path('data')
>>> sub_path = 'image'
>>> father_path / sub_path
PosixPath('data/image')
>>> father_path
PosixPath('data')
def eval(self):
"""Sets the module in evaluation mode.
This has any effect only on modules such as Dropout or BatchNorm.
"""
return self.train(False)
输入命令:$ jupyter notebook --no-browser --port=9999 --ip='*' [--allow-root]
会返回一个地址http://localhost:10000/?token=255f60f4ab56f391b40fdda50ac1970736e091d86fd7f97a
将http://localhost
改为服务器的ip即可,例如10.106.128.96:10000/?token=255f60f4ab56f391b40fdda50ac1970736e091d86fd7f97a
即不想保存jupyter日志,又需要看一下token,可以使用tee命令:
nohup jupyter notebook --no-browser --port=9999 --ip='*' | tee /dev/null &
参考1
参考2
参考3
运行find . -name “kernel.json”
会得到以下结果
/home/lixie/.local/share/jupyter/kernels/python3/kernel.json
/home/lixie/anaconda3/envs/py35_1/share/jupyter/kernels/python3/kernel.json
/home/lixie/anaconda3/pkgs/ipykernel-5.1.1-py37h39e3cac_0/share/jupyter/kernels/python3/kernel.json
/home/lixie/anaconda3/pkgs/ipykernel-5.1.1-py37h39e3cac_0/share/jupyter/kernels/py35/kernel.json
/home/lixie/anaconda3/share/jupyter/kernels/python3/kernel.json
/home/lixie/anaconda3/share/jupyter/kernels/py35/kernel.json
其中最后两行是关键部分,在/home/lixie/anaconda3/share/jupyter/kernels/
中创建虚拟环境对应的文件夹,在其中创建kernel.json
文件,文件内容为,
{
"argv": [
"/home/lixie/anaconda3/envs/py35/bin/python", #python路径
"-m",
"ipykernel_launcher",
"-f",
"{connection_file}"
],
"display_name": "py35", # 在notebook显示的名字
"language": "python"
}
编辑完成后打开jupyter notebook可以看到新增的kernel,但是无法连接,因为虚拟环境下没有安装ipython kernel,运行命令
$ conda activate lcyVenv
$ pip install ipykernel
$ ipython kernel install --user
如果是系统自带的python,运行上面最后一条命令会报错,应选择下述命令
$ python2 -m pip install ipykernel
$ python2 -m ipykernel install --use
即可。 注意:
/usr/bin/python2
centos需要打开防火墙,打开特定端口,否则通过上述网址无法访问。(本机可以访问本机的端口,其他机器是不能随意访问端口的,也就是说,如果是在服务器上打开浏览器是可以访问上述地址的,但是远程登录访问主机,如果没有提前将端口开放,是无法访问的)
firewall-cmd --zone=public --add-port=9999/tcp --permanent
firewall-cmd --reload
运行以下两条命令即可:
跑YOLO网络生成标注视频的时候出现了报错: cannot connect to X server
,这是源于代码中有以下两行:
cv2.imshow('Demo', image)
cv2.waitKey(3)
由于服务器没有可视化界面,会出现这样的问题,注释掉即可
在darknet_video.py
中修改源文件即可跑通
出现报错Input type (torch.cuda.FloatTensor) and weight type (torch.FloatTensor) should be the same
是由于权重被放在cpu中,未被加载进GPU,解决方法是在相应的向量后追加.cuda()
具体代码如下,可以看到,权重是
.npy
,加载后追加.cuda()
将权重加载进GPU
出现报错 TypeError: can’t convert CUDA tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first
可以看到源代码中,需要将网络的输出转换为numpy类型,但是网络的输出是在GPU上的tensor,需要需要先将tensor复制到内存中才能进行操作
解决办法是在
offsets = output[0].data.numpy()
中加入.cpu()
import tensorflow as tf
from keras.backend.tensorflow_backend import set_session
config = tf.ConfigProto()
config.gpu_options.allow_growth=True # 按需占用GPU,否则会一下把gpu的显存占满
config.gpu_options.per_process_gpu_memory_fraction = 0.5 # 设置占用比例,但如有需要仍会超过此比例
set_session(tf.Session(config=config)) # 加上这一句话才会生效
opencv没有视频
PIL画矩形框(left, top, right, buttom)
PIL添加文字
.textsize
方法会返回一个元组(x轴上长度,y轴上长度),对应到数组中索引则是[y轴长度,x轴长度]
字体
Mac上会报错ImageFont IO error: cannot open resource
需要将font = ImageFont.truetype(font='font/FiraMono-Medium.otf', size=13)
中font参数的值改为/Library/Fonts//Library/Fonts/Songti.ttc
并添加参数encoding='unic'
font = ImageFont.truetype(font='/Library/Fonts/Songti.ttc', size=13, encoding='unic')
opencv读进来的图片是BGR,使用matplotlib.pyplot画图是按RGB画的,所以直接显示会有色差,需要做如下处理
img = cv2.imread('file_name')
img = img[:,:,[2,1,0]]
plt.imshow(img_2)
yolo v2 之车牌检测 yolo v2之车牌检测后续识别字符(一) yolo v2之车牌检测后续识别字符(二) face recognition[翻译][深度人脸识别:综述]
从RCNN到SSD,这应该是最全的一份目标检测算法盘点(机器之心) bounding box的loss求法(L2 loss和Smooth L1 loss)
FPN(feature pyramid networks)算法讲解
目标检测 YOLO v3 训练 人脸检测模型(有代码的,效果不好的人脸识别代码博客,csdn)
史上最详细的Yolov3边框预测分析(知乎) yolo系列之yolo v3【深度解析】(CSDN 彩色的YOLOv3结构示意图 内含YOLOv1和YOLOv2讲解链接) YOLO v3网络结构分析(上面一个链接之前找到的一篇csdn)
CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
To initialize your shell, run
$ conda init
Currently supported shells are:
See 'conda init --help' for more information and options.
IMPORTANT: You may need to close and restart your shell after running 'conda init'.
对于bash shell,此时输入命令`conda init bash`即可
* #### autosub的使用
cd /mnt/nfs/public/mnist/ && tar -cf ~/mnist-code.tar mnist-code && cd ~
yarn jar /mnt/nfs/public/distributedshell.jar \
-queue default \
-jar /mnt/nfs/public/distributedshell.jar \
-shell_env YARN_CONTAINER_RUNTIME_TYPE=docker \
-shell_env YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=docker.local/airl/tensorflow:1.13.0-cuda10.0-gpu-py3 \ # 合适的镜像
-shell_env YARN_CONTAINER_RUNTIME_DOCKER_CONTAINER_NETWORK=swarm \
-shell_env YARN_CONTAINER_RUNTIME_DOCKER_MOUNTS=/mnt/dfs/public-data/mnist:/data:ro \ # 输入输出目录
-shell_command "python mnist-code/mnist-train.py" \ # 入口命令
-shell_args --data_dir=/data/mnist.npz \ # 运行参数
-tar mnist-code.tar \ # 代码包
-container_resources memory-mb=4096,vcores=2,yarn.io/gpu=1 # 运行需要的资源
mnist-train.py
这个python文件中接受data_dir
这个参数,读取数据。因此在运行其他代码的时候只需要将一些需要的地址改为参数形式在运行代码时传入即可。将权重加载到模型中,keras中,model.fit_generator
接口中有参数epoch
和initial_epoch
,加入最初一共想要训练50个epoch,则epoch=50, initial_epoch-0
;假设训练在第25个epcoh中断了(权重存到了25个epoch的权重),想要继续训练,则设定epoch =50, initial_epoch=25
即可。这里需要制定initial_epoch的原因见此回答What does initial_epoch in Keras mean?
Hierarchical Data Formats - What is HDF5?
The HDF5 format can be thought of as a file system contained and described within one single file.
基于Anaconda的Caffe安装,python
2019.10.15 更新
在anaconda中创建python3.5的虚拟环境,编译成功,但无法调用Python接口。报错如下:
undefined symbol: _ZN5boost6python6detail11init_moduleER11PyModuleDefPFvvE
在链接中提到,要将Makefile.config文件中的一行代码取消注释。
取消后重新编译,编译无法通过,报错如下
/usr/bin/ld: cannot find -lboost_python-py35
collect2: error: ld returned 1 exit status
make: *** [.build_release/lib/libcaffe.so.1.0.0] Error 1
解决方法见如下链接
发现在之前教程里也提到了这一点,
Solve the problem: "cannot find -lboost_python3" when using Python3 Ubuntu16.04 #4843
但随后发现在系统中并没有libboost_python3.so的库文件,这是boost版本所导致的,个人理解为,编译caffe的时候需要用python3的库进行编译,但是实际使用的时候用的是anaconda里的python
由于需要使用caffe环境,不敢贸然安装另一个版本的boost库
boost python3依赖安装
CMake、make gcc,make,cmake傻傻分不清楚? CMake 入门实战
你或许听过好几种 Make 工具,例如 GNU Make ,QT 的 qmake ,微软的 MS nmake,BSD Make(pmake),Makepp,等等。这些 Make 工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别。这样就带来了一个严峻的问题:如果软件想跨平台,必须要保证能够在不同平台编译。而如果使用上面的 Make 工具,就得为每一种标准写一次 Makefile ,这将是一件让人抓狂的工作。 就是针对上面问题所设计的工具:它首先允许开发者编写一种平台无关的 CMakeList.txt 文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。从而做到“Write once, run everywhere”。显然,CMake 是一个比上述几种 make 更高级的编译配置工具。一些使用 CMake 作为项目架构系统的知名开源项目有 VTK、ITK、KDE、OpenCV、OSG 等 [1]。
LFW:Labeled Faces in the Wild CALFW:Cross Age LFW CPLFW:Cross Pose LFW CFP: Celebrities in Frontal Profile AgeDB: Age Database
宽广集群 宽广平台:
所有数据存放在/root
下,/root
目录是映射到一块硬盘下的,不同的镜像会共享这个硬盘,如果将数据存到了根目录/
的其他文件夹下,每次打包镜像的时候会将数据一起打包,导致镜像文件很大
一个镜像相当于是一个操作系统,每次新建一个镜像就重装一遍系统
模版镜像几乎什么都没有,需要自己配
点击左上角的加号,会有容器的详细信息, 可以看到宿主机端口到容器机端口的映射,由于ssh连接的是22号端口,因此
ssh -p 19937 root@10.106.128.107
,注意这里的p为小写。scp -P 19937 -r dir_name/ root@10.106.128.107:/root
,这里P为大写
sshfs配置
在mac上安装sshfs的过程中,会出现类似
The linking step did not complete successfully
The formula built, but is not symlinked into /usr/local
的问题,解决方法如下链接
Homebrew Symlink Error
chown
命令的全拼是change owner,这里sudo chown -R $(whoami) /usr/local
命令是将/usr/local
目录权限给到当前用户,其中R
代表递归,将改目录下所有文件权限给到当前用户。
使用命令
sshfs -p 22 root@antagus2:/var/www/vhosts ~/amazingweb -o auto_cache,reconnect,defer_permissions,noappledouble,volname=amazingweb
$ pgrep -lf sshfs # 查看进程
$ pkill -9 sshfs # 杀死进程
# 如果上面两条之后还是不行
$ umount /Volume/96
其中,-p指定端口,-o后跟了三个参数,意义如下
网址如下:Mac OS X: use SSHFS to mount a remote directory as a volume
rpm: Red hat Package Manager 是给centos用的!!!!
apt install 是给ubuntu用的
nohup python -u python_file.py &
会默认在当前目录下生成一个nohup.out
文件
使用tail -f filename
实时显示文件
os.environ["CUDA_VISIBLE_DEVICES"] = "0, 1, 2"
这句话只是设置了最多可以用的GPU数,要想实现多GPU并行还是需要写出相应的代码的。
配置鼎桥的服务器
centos 7 网络配置( 网关、dns、ip地址配置)
服务器有两块网卡 对应的主机上有两个接口 网线插在那个接口上就配置那块网卡
添加 nameserver 114.114.114.114 DNS服务器,否则无法解析域名,只能识别IP地址(只能pingIP地址)
9.12更新: 发现修改配置文件不起作用,需要手动给网卡设置ip地址
$ ip address add 10.106.130.66/21 dev eno2 # 设置网卡eno2的ip地址为10.106.130.66,子网掩码21位
$ ip route add default via 10.106.129.1 dev eno2# 设置默认网关为10.106.129.1
$ ip route del default via 10.106.129.1 # 删除默认设置
$ ip route add default via 10.106.130.1 # 设置默认网关为10.106.130.1
$ ip route del default via 10.106.130.1 # 删除默认设置
$ ip route add 10.0.0.0/8 via 10.106.128.1 dev eno2
以上的命令中运行完前两条就可以上网并且使用ssh了
$ ip address add 10.106.130.66/21 dev eno2 # 设置网卡eno2的ip地址为10.106.130.66,子网掩码21位
$ ip route add default via 10.106.129.1 dev eno2# 设置默认网关为10.106.129.1
$ ip route add 10.0.0.0/8 via 10.106.128.1 dev eno2 # 访问10.0.0.0网段的地址走10.106.128.1路由
如果后两句颠倒会出现network unreachable的情况
CUDA、cuDNN、tensoflow版本对照
sudo yum install epel-release -y
sudo yum update -y
sudo shutdown -r now # 重启生效
sudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
sudo yum install ffmpeg ffmpeg-devel -y
cmake ../ -DCMAKE_BUILD_TYPE=RELEASE \
-DCMAKE_INSTALL_PREFIX=/usr/local \
-DBUILD_TIFF=ON \
-DWITH_CUDA=ON \
-DENABLE_FAST_MATH=1 \
-DCUDA_FAST_MATH=1 \
-DWITH_CUBLAS=1 \
-DWITH_FFMPEG=1 \
-DINSTALL_C_EXAMPLES=OFF \
-DCUDA_GENERATION=Kepler \
-DBUILD_opencv_cudacodec=OFF \
-DENABLE_PRECOMPILED_HEADERS=OFF
解决办法:修改FindCUDA.cmake, OpenCVDetectCUDA.cmake, common.hpp
文件中的内容
下图中的内容可以不用改,由于版本原因在文件里可能找不到对应的语句
按照以上方法,cmake可以通过,但是make会报错nvcc fatal unsupported gpu architecture 'compute_20' opencv
解决办法:清空build文件夹,重新cmake,添加参数-DCUDA_GENERATION=Kepler
在68%左右出现fatal error: dynlink_nvcuvid.h: No such file or directory
解决方法
make: protoc: Command not found
在Makefile.config文件中,将这一段代码
CUDA_ARCH := -gencode arch=compute_20,code=sm_20 \
-gencode arch=compute_20,code=sm_21 \
-gencode arch=compute_30,code=sm_30 \
-gencode arch=compute_35,code=sm_35 \
-gencode arch=compute_50,code=sm_50 \
-gencode arch=compute_52,code=sm_52 \
-gencode arch=compute_61,code=sm_61
替换为如下代码
CUDA_ARCH := -gencode arch=compute_30,code=sm_30 \
-gencode arch=compute_35,code=sm_35 \
-gencode arch=compute_50,code=sm_50 \
-gencode arch=compute_52,code=sm_52 \
-gencode arch=compute_60,code=sm_60 \
-gencode arch=compute_61,code=sm_61 \
-gencode arch=compute_61,code=compute_61
运行pip uninstall numpy
,报错Cannot uninstall 'numpy'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
解决方法:从/usr/lib64/python2.7/site-packages
中将包含numpy的文件夹全部删除即可
在anaconda中配置python2.7的虚拟环境,可以直接import caffe,除了以下问题:
ImportError: No module named google.protobuf.internal
解决方法见网址
此处的
/home/username/anaconda3/bin/pip
是指定pip命令的位置
2019.5.3工作日志
Batch Normalization introduction