1. Docker: 是一个开源的应用容器引擎,可以让开发者打包自己的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全适用沙箱机制,相互之间不会有任何接口。中文名是应用容器引擎,类别是操作系统层虚拟化,所使用的编程语言是Go语言。
2. Go语言:是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。类似于C语言,但对变量的声明有所不同,与Java不同的是Go内嵌了关联数组(哈希表或字典),就像字符串类型一样。
3. Go语言的特性:拥有C语言的简洁和性能,还很好的提供了21世纪互联网环境下服务端开发的各种使用特性,让开发者在语言级别就可以方便得到自己想要的东西。Go语言的关键特性:
a. 并发与协程;
b. 基于消息传递的通信方式;
c. 丰富使用的内置数据类型;
d. 函数多返回值;
e. defer机制;
f. 反射(reflect);
g. 高性能HTTP Server;
h. 工程管理;
i. 编程规范。
4. Go语言的优势:Tec采用的scala语言,在spark上进行开发。Go语言的优势包括:性能,语言性能,开发者效率,并发性和多通道,快速的编译时间,打造团队的能力,强大的生态系统,GOFMT,强制代码格式,gRPC和Protocol Buffers,Go语言的缺点有:缺少框架,错误处理不太好,和软件包管理不太好。
5. Scala和Python语言的比较:Scala速度更快,使用方便但上手难,而Python则较慢,但很容易使用。
6. Jupyter Notebook(之前称为IPython notebook):是一个交互式笔记本,支持运行40多种编程语言。其本质是一个web应用程序,便于创建和贡献文学化程序文档,支持实时代码,数学方程,可视化和markdown。用途包括:数据清理和转换,数值模拟,统计建模,机器学习。
7. Jupyter Notebook的安装,转载自:
https://blog.csdn.net/jenyzhang/article/details/73275232
Jupyter Notebook是一个Web应用程序,允许创建和共享包含实时代码,方程,可视化和说明文本的文档。是Ipython的升级版,而Ipython是一个加强版的交互式Shell,比在terminal里运行python更加方便,界面更友好。
步骤:
a. sudo apt-get updatesudo apt-get upgradesudo apt-get install python-pipsudo pip install --upgrade pipsudo pip install jupyter
b. 在终端运行:jupyter notebook。
c. 在Web界面右上角New按键里面就有Terminal等交互式窗口,还可以创建python文件,然后在Web界面上运行自己的代码。
需要注意的是:在windows下jupter不能使用jupyter。
8. Lua语言:是一种脚本语言,用C语言编写,源码开放,设计目的是为了嵌入程序应用,为应用程序提供便利的扩展功能,提供灵活的定制功能,主要应用于游戏编程领域,除此之外还应用于独立应用脚本,web应用脚本,扩展和数据库插件等。特点是简洁,非常小,性能高,不限制编程范式,Table是Lua里最基本的、最常用且唯一的几乎万能的数据结构。
9. AxiDraw是Evil Mad Scientist团队研发出来的可以代替人手写字的机器手,产品看着很新颖,挺有意思的。
10. 在调用“import tensorflow as tf”时出现:libcublas.so.9.0: cannot open shared object file: No such file or directory问题的解决方法:
sudo ldconfig /usr/local/cuda-9.0/lib64
如果有多个路径需要添加,路径之间只需要加上空格就行,例如:sudo ldconfig /usr/local/cuda-9.0/lib64 /home/vipadm3/softwares/cuda/cudnn/cuda/lib64.
11. ldconfig介绍:ldconfig是一个动态链接库管理命令,为了动态链接库为系统所共享,还需要运行动态链接库的管理命令,ldconfig,ldconfig的主要用途是在默认搜索目录以及动态库配置文件内所列的目录下搜索出可以共享的动态链接库,linux的共享库采用了类似告诉缓存的方式,首先是从/etc/ld.so.cache里面寻找,然后从ld.so.conf中的路径寻找。
12. python中os.walk介绍: 其是一个简单易用的文件、目录遍历器。使用方法:
import osfrom os import walk
函数声明:walk(top,topdown=True,οnerrοr=None,followlinks=False)
其中top是需要遍历的目录,topdown则优先遍历top目录,否则优先遍历子目录,默认topdown为真。
13. backbone: 骨干,脊梁骨,脊椎,分水岭,决心,毅力;duplicate:重复,复制,复印。
14. shuffle:洗牌,打乱,重新开始;meta:元数据的,meta-information: 元信息,元素可提供相关页面的元信息,比如针对搜索引擎和更新频度的描述和关键词。
15. python中random.choice的用法:random.choice(给定数组),用途:从给定数组中随机选择一个元素返回。
16. RAID:磁盘阵列,redundant arrays of independent drives, raid, 意思是独立磁盘构成的具有冗余能力的阵列。磁盘阵列是由很多价格较便宜的磁盘,组合成一个容量巨大的磁盘组,利用个别磁盘提供数据所产生加成效果提升整个磁盘系统效能。利用这项技术,将数据切割成许多区段,分贝存放在各个硬盘上。
磁盘阵列还能利用同为检查过的观念,在数组中任意一个硬盘故障时,认可读出数据,在数据重构时,将数据经过计算后重新置入新硬盘中。
17. 在使用了raid后,磁盘的速度和容量会有所不同。今天在安装175.94的机器时,发现总共有(4*2T),但是实际上只能用4T容量,大小缩减了一半。记得当时徐博坤也提过这件事情。
Raid0: 速度N倍,容量N倍,安全性较差;
Raid1: 速度N的半数,容量只有一半,安全性最好;
Raid2-3: 不用考虑;
Raid5:速度N-1,容量N-1,读盘速度稍微快一些,写入相对效率低一些,但是综合安全性和硬盘利用率最好;
Raid6: 类似5,速度低于N-2,容量N-2,成本高了不少,但更安全;
Raid10: 即Raid0+Raid1,既安全,又能提高速度,但硬盘容量只有一半,速度达到N的一半。
一般常用的方案是将系统装在固态硬盘里,将数据放在磁盘里,这样磁盘就可以全部用上。
18. pycharm中报错“python package tools not found”问题的解决:
在终端输入:在终端中输入:sudo apt install python3-pip;如果有提示要安装-f软件,输入指令安装即可;
19. 阿里云服务器使用步骤:在打开主机后采用XShell远程连接软件进行访问,就如同采用XShell访问自己的远程服务器一样。
20. 在ubuntu中查看自己安装的scipy,numpy,matplotlib等软件的版本方法:
a. 打开终端,输入:python,进入python编辑环境;
b. 依次输入下列指令:
import scipyscipy.__version__
c. 显示的结果就是scipy的版本,其他软件也一样。
21. keras中训练时出现“generator_output=next(output_generator) StopIteration”问题的解决:
问题原因:model.fit_generator函数中,steps_per_epoch*epochs的值大于或者等于训练样本的数目,此时样本已经遍历完成了,但是由于还要抽取数据而迭代器已经停止因此导致冲突。
解决方法:steps_per_epoch*epochs的值小于训练样本的数目,或者将抽取训练样本的语句设置为无限循环的模式,例如下面的代码:
def subtract_mean_gen(x_source,y_source,avg_image,batch):while True:batch_list_x=[]batch_list_y=[]for line,y in zip(x_source,y_source):x=line.astype('float32')x=x-avg_imagebatch_list_x.append(x)batch_list_y.append(y)if len(batch_list_x) == batch:yield (np.array(batch_list_x),np.array(batch_list_y))batch_list_x=[]batch_list_y=[]
总之,一句话就是:“Generators for keras must be infinite”。改进前的代码如下:
def subtract_mean_gen(x_source,y_source,avg_image,batch):batch_list_x=[]batch_list_y=[]for line,y in zip(x_source,y_source):x=line.astype('float32')x=x-avg_imagebatch_list_x.append(x)batch_list_y.append(y)if len(batch_list_x) == batch:yield (np.array(batch_list_x),np.array(batch_list_y))batch_list_x=[]batch_list_y=[]
22. predict_generator函数介绍:
原型: predict_generator(generator, steps=None, callbacks=None, max_queue_size=10, workers=1, use_multiprocessing=False, verbose=0)
输出: Numpy array(s) of predictions.
23. Win10系统往右键新建菜单中添加新程序的方法:
在上面的Classes中添加新的.***即可。
24. PL用的绘图软件:origin。
25. 关于滤波器中filter:权重共享:一个卷积层(Wx+b=>ReLU=>maxpooling)可以有多个不同的卷积核,而每一个卷积核都对应一个滤波后映射出的新图像,同一个新图像中的每一个像素都来自完全相同的卷积核,这就是卷积核的权值共享。
26. 卷积核中的内容:卷积核里面每个元素的具体值不是人工定义的,而是通过网络学习到的,通常是随机初始化再用BP算梯度做训练,如果数据少或者没有labeled data的话也可以考虑用K-means中的K个中心点,逐层做初始化。
27. python fit中的verbose:
verbose: 日志显示;
verbose=0: 为不在标准输出流输出日志信息;
verbose=1: 为输出进度条记录;
verbose=2: 为每个epoch输出一条记录。
28. 在神经网络的训练中,epochs表示网络中所有图像的训练次数,steps_per_epoch是通过用所有训练图像的数量除以批次大小得到,例如共有100张图像,批大小batch_size=50,则steps_per_epoch的值为2,参数batchsize表示每次训练时在训练集中所取的训练样本的数量。iteration表示的是使用batchsize个样本训练一次,1个epoch等于使用训练集中的全部样本训练一次,一个epoch=所有训练样本的一个正向传递和一个反向传递。
29. fit_generator中的validation_steps参数意义:设置验证多少次数据后取平均值作为此epoch训练后的效果,val_loss, val_acc的值直接受这个参数的影响;
30. python中常用的两种读图方式:io.imread(),cv2.imread(),两者读出的图片格式都是uint8,numpy array类型,cv2.resize()裁剪后的图片还是以numpy array的方式保存,数值范围为(0-255),transform.resize()裁剪后的图片是以float64的格式存储的,数值的取值范围为(0,1)。
31. 实验中发现导入matplotlib.pyplot和matplotlib的次序应如下,否则就有可能显示不出来图像:
import matplotlib.pyplot as pltimport matplotlibmatplotlib.use(‘Agg’)
如果上面的import matplotlib.pyplot as plt被放在了最后一句,那么语句执行将显示不出来图像。
32. scores = model.evaluate(test_data,one_hot_test_label),返回的是损失值和选定的指标值(例如accuracy),原始英文文档中的解释为:Returns the loss value & metrics values for the model in test mode。
33. 2019年6月2日,发现采用原3D-UNet中的optimizer效果很差,原始3D-UNet中的optimizer设置为:
optimizer = Adam(lr=initial_learning_rate)
后来改为: optimizer = “adam”。
34. keras中optimizer的选择,使用方法有两种:
a. 可以先初始化然后再用名字调用,例如下面;
sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='mean_squared_error', optimizer=sgd)
b. 直接调用名字:model.compile(loss='mean_squared_error', optimizer='sgd');
在使用的时候需要导入的库的语句为: from keras import optimizers;
常用的优化器有以下几个:
a. SGD;
b. RMSprop;
c. Adagrad;
d. Adadelta;
e. Adam;
f. Adamax;
g. Nadam.
35. 在深度学习中,打乱数据可以使训练集,验证集,测试集的数据分布相同,例如,制作minibatch的时候,每经过一次epoch都要打乱一次数据,是每次输入的minibatch分布都不相同,可见打乱数据的重要性。
一、打乱数据的代码
二、keras自定义generator
需要注意的是,注意,在函数中需要用while写成死循环,因为每个epoch不会重新调用方法。当函数以yield关键词返回,那么这个函数则是个生成器,生成器指的是当它返回数据之后再次执行时再从这个地方继续执行。
35. keras中采用fit_generator构建一个generator的方法:
a. 使用fit_generator的原因:深度学习中的数据通常会很大,即使在使用GPU的情况下,如果一次性将所有数据(图像)读入CPU内存,有可能导致内存崩溃,因此常采用fit_generator这个函数来解决。产生train_generator的例子如下:
产生validate_generator的示例代码:
对上面代码的解释:
a. 函数中使用yield返回数据;
b. 函数中使用while true来进行循环,这个函数不停地在while函数中进行循环,需要在while循环中进行初始化设置,不需要在while循环外进行初始化;
36. 当一个完整的数据集通过了神经网络一次并且返回了一次,这个过程称为一次epoch,例如,有一个2000个训练样本的数据集,将2000个样本分成大小为500的batch,那么完成一个epoch需要4个iteration。
37. 激活最新版win10的方法:
1. 首先输入产品秘钥:如下:
Windows 10 Professional W269N-WFGWX-YVC9B-4J6C9-T83GX
Windows 10 Professional N (N代表欧洲市场定制版) MH37W-N47XK-V7XM9-C7227-GCQG9
Windows 10 Enterprise NPPR9-FWDCX-D2C8J-H872K-2YT43
Windows 10 Enterprise N DPH2V-TTNVB-4X9Q3-TJR4H-KHJW4
Windows 10 Education NW6C2-QMPVW-D7KKK-3GKT6-VCFB2
Windows 10 Education N 2WH4N-8QGBV-H22JP-CT43Q-MDWWJ
Windows 10 Enterprise 2015 LTSB (长期服务分支) WNMTR-4C88C-JK8YV-HQ7T2-76DF9
Windows 10 Enterprise 2015 LTSB N 2F77B-TNFGY-69QQF-B8YKP-D69TJ
2. 然后启用KMS软件,找到安装路径,然后运行即可启动(如果开始菜单没有的话)。
38. Keras中的Conv2D函数,原型:
keras.layers.Conv2D(filters, kernel_size, strides=(1,1), padding=’valid’, data_format=None, dilation_rate=(1,1), activation=None, use_bias=True, kernel_initializer=’glorot_uniform’, bias_initializer=’zeros’, kernel_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constant=None).
其中,filters是输出空间的维度,即在卷积中输出的滤波器的数目;
Kernel_size: 卷积核的形状大小;
Strides:卷积时的步长;
Padding,选择valide或者same其中之一。
39. 仿射变换:Affine Transformation,是一种二维坐标到二维坐标之间的线性变换,保持二维图形的平直性和平行性;平直性是指变换后直线还是直线不会打弯,圆弧还是圆弧;平行性是指二维图形之间的相对位置关系不变,平行线还是平行线,相交直线的交角不变。
40. 仿射变换包括以下一系列的变换:
a. 平移,Translation;
b. 缩放,Scale;
c. 翻转,Flip;
d. 旋转,Rotation;
e. 剪切:Shear;
总共上述5种变换。
41. 从大类上来讲,物体的变换主要有三种:(a). 刚体变换;(b)仿射变换;(c)投影变换。
刚体变换可用该式来表示:g(v) = R*v+t;
投影变换:perspective transformation, 是将图片投影到一个新的视平面(viewing plane),也称为投影映射,projective mapping;
通用的图像变换公式如下:
u,v是原始图片坐标,对应得到变换后的图像坐标,x’,y’,变换矩阵可以拆解成四部分, 表示线性变换,比如scaling,shearing,rotation; 用于平移, 产生透视变换,所以放射变换可以视为透视变换的一种特殊形式,经过透视变换之后的图片通常不是平行四边形,除非映射视平面和原来平面平行。
42. 图像中点(x,y)在(tx,ty)为中心旋转theta角度后缩放a(a>0)的坐标值(xr,yr)算法是:
二维Unet中的数据生成字典中所拥有的操作:
- Rotation_range = 0.2;
- Width_shift_range = 0.05;
- Height_shift_range = 0.05;
- Shear_range = 0.05;
- Zoom_range = 0.05;
- Horizontal_flip = True;
- Fill_mode = ‘nearest’。
上面包括了旋转,平移,剪切,翻转,缩放,5种,刚好和仿射变换中的五种变换模式一样。
43. keras中卷积层的activation函数汇总:
默认激活函数为linear,即输入和输出一样。
44. keras中两层相当于一层:
from keras.layers.core import Activation, Dense model.add(Dense(64)) model.add(Activation('tanh'))
相当于:
model.add(Dense(64, activation='tanh')) #此处’tanh’是一个字符串
也可以自定义一个函数如下:
def tanh(x): return theano.tensor.tanh(x) model.add(Dense(64, activation=tanh)) #此处tanh是函数 model.add(Activation(tanh))
45. sparse_categorical_crossentropy和categorical_crossentropy的区别,前者用于标签编码为0,1,2等,后者用于标签编码为one-hot编码时。
46. fit_generator函数的第一个参数为generator,其为一个生成器或者Sequence对象的实例,以避免在使用多进程时出现重复数据,生成器的输出应该为以下之一:
a. 一个(inputs, targets)元组;
b. 一个(inputs, targets, sample_weight)元组,这个元组(生成器的单个输出)表示一个独立批次,因此,此元素中的所有数组必须具有相同的长度,等于此批次的大小,不同的批次可能具有不同的大小,例如,如果数据集的大小不能被批量大小整除,则最后一批时期通常小于其他批次,生成器将无限地在数据集上循环,当运行到steps_per_epoch时,记为一个epoch结束。
47. Fine-Grained:同一大类的不同子类划分,称为细粒度分类。
48. keras的中文文档好像已经停止更新,但是英文文档仍在继续更新。
49. ModelCheckpoint的原型如下:
keras.callbacks.ModelCheckpoint(filepath, monitor='val_loss', verbose=0, save_best_only=False, save_weights_only=False, mode='auto', period=1)
在上式中,monitor的值是原型中已经给了的,固定为‘val_loss’,实验中发现即使改变其值,结果没什么影响。
50. keras中BatchNormalization的工作原理:
根据上图中的解释,也就不难理解,为什么keras中文文档中说在“data_format=channels_first”的2D卷积时,axis=1了,因为,第一维是图片的数目,当axis=1时也就是指的第二维度,是对通道这个维度进行归一化,也就是上面蓝色字的第一行:BatchNorm作用于CNN时,是针对一个图片,由不同的filter生成的特征图所对应的点的归一化。
52. 新版本的pycharm安装后左上角菜单other里面没有快捷启动方式的解决方法:按照网上说的那样首先创建一个desktop的快捷启动文件,然后将该文件移动到/usr/share/applications中,这样就能显示出来了,desktop文件中的内容是:
[Desktop Entry]Version=1.0Type=ApplicationName=PycharmExec=pycharm 的sh文件路径,一般在安装包中的bin文件夹中Icon=pycharm的png图标文件所在地址,一般也在安装包的bin文件夹中
53. functools中的partial函数用法:当需要简化目标函数只需要输入部分参数时,可用partial函数简化原来的函数,使得输入变得简洁。
54. pycharm中加入不了中文注释的解决方法:
打开管理员账户中安装pycharm的文件pycharm.sh,然后再其中加入以下语句:
注意是加在“Run the IDE”这句之前。
55. np.mean和np.std,分别计算矩阵的均值和标准差,函数原型为:
Numpy.mean(a,axis,dtype,out,keepdims),axis不设置时是对整体m*n个数求取均值,返回一个实数,axis=0时对各列求平均值,axis=1时对各行求平均值。
56. python归一化的几种形式:
形式1([0,1]标准化): x_normalization=(x-Min)/(Max-Min)
形式2(Z-score): x_normalization=(x-miu)/sigma
形式3(sigmoid): x_normalization=1/(1+e^(-x))
57. 2019年7月22日遇到pycharm往环境变量一栏中添加变量添加不上的问题,解决方法是:最新版本的pycharm会自动检查所输入的值的正确性,应该去掉路径的最后一个分号。
58. variational auto encoding: 简称VAE,中文称为变分自编码器。是一个可以和GAN相媲美的生成网络,可以输入一个低维空间的Z,映射到高维空间的正式数据,比如生成不同样子的数字、人脸、卡通图像等。
59. GAN网络的优点:a. 并不总是需要带标签的样本来训练;b. 更容易训练依赖于蒙特卡洛近似的对数分割函数梯度生成的模型,由于蒙特卡洛方法在高维空间中不能很好地工作,这样的生成模型不能很好地执行像使用ImageNet进行训练的现实任务;c. 没有引入任何确定性偏差,像变分自动编码器这样的某些生成方法会引入确定性偏差,因为它们优化了对数似然的下界,而不是似然本身。
GAN的缺点: a. 特别难训练,这些网络试图优化的函数是一个本质上没有封闭形式的损失函数,因此,优化这一损失函数是非常困难的,需要在网络结构和训练协议方面进行大量的反复试验; b. 对于图像生成,没有适当的措施来评估准确性,由于合成图像可以通过计算机本身来实现,因此实际结果是一个非常主观的主题,并且取决于人类观察者,相反,我们有起始分数和Frechet初始距离等功能来衡量他们的表现。
比较有名的GAN网络:a. TAC-GAN网络,文本图像转换网络;
b. CGAN网络,条件生成对抗网络,用于Domain Transfer;
c. 用于Image Inpainting(图像修复)/Image Outpainting(图像拓
展),人脸合成,改变面部运动的网络(GANimation);
d. CycleGAN:绘画-照片转换,将绘画转换为照片。
60. 最安全纯净的制作U盘启动盘的方法是采用UltroISO将ubuntu或者其他软件(Win10等)镜像写入U盘中,然后再从U盘进行启动。
61. 采用DAEMON Tools也可以加载或者写ISO文件到U盘,但是要收费,其可以实现和UltraISO同样的功能,但是UltraISO免费。
62. 四种kill某个用户所有进程的方法:
在linux系统管理中,我们有时候需要kill掉某个用户的所有进程,初学者一般先查询出用户的所有pid,然后一条条kill掉,或者写好一个脚本,实际上方法都有现成的,这边有4种方法,我们以kill用户zyc为例.
1. pkill方式
# pkill -u zyc
2. killall方式
# killall -u zyc
3. ps方式
ps列出zyc的pid,然后依次kill掉,比较繁琐.
# ps -ef | grep zyc | awk '{ print $2 }' | sudo xargs kill -9
4. pgrep方式
pgrep -u参数查出用户的所有pid,然后依次kill
# pgrep -u zyc| sudo xargs kill -9
63. xfce4,GNOME和KDE三种都是典型的Linux桌面,只需要安装其中一个即可。
64. ubuntu刚进去后没有菜单栏的解决方法:
右键面板->面板首选项->backup and restore -> apply configuration图标
65. 数据增广的方法除了keras中自带的ImageDataGenerator之外,采用opencv中自带的方法可以自己实现数据扩充。
66. ubuntu在永久挂载机械硬盘时,需要下面的一句:
UUID=904C23B64C23964E /media/aborn/data ntfs defaults 0 2
其中ntfs为移动硬盘的系统文件类型,如果ntfs类型不对,应该先查看系统盘(也就是系统挂载的那么移动硬盘)的文件类型,比如查看后系统盘的文件类型Ext4,那么其他盘也应该设置为Ext4类型,即将上面的ntfs更换为ext4,这样就能挂载。
67. ubuntu 删除用户: sudo userdel -r name,加上r参数表示连文件夹一起删除。
68. ubuntu查看内存使用大小指令:free -m,其中后面的参数m表示以M(兆)为单位。
69. Thinclient_drives: 瘦客户机,采用高效的嵌入式高效CPU,利用嵌入式开发工具开发的独立嵌入式操作系统,具有稳定可靠,完全兼容PC应用,使用方便,体积小巧,安静节能的优点。
70. 删除thinclient_drives的指令:
# umount thinclient_drives# ls# thinclient_drives# rm thinclient_drives -rf # 后面加个rf参数就能删除整个路径# ls
71. 安装ubuntu软件时应该使用完整路径,否则安装不了。
72. 2019年7月26日,通过sudo nautilus进入到root环境下后,通过umount thinclient_drives使得右键可以打开终端,棒!
72-1. Ubuntu中右键打不开桌面上的terminal方法:
在 Settings Manager -> Preferred Applications 中重新设置默认终端
或重新安装 xubuntu-default-settings
73. 在ubuntu中激活matlab后,创建快捷启动方式之后,启动时发现出现崩溃的问题,提示:no writting permission on directory: home/h205b/.matlab,解决该问题的方法是删除掉该文件夹后再次启动即可:
删除该文件夹的命令:sudo rm -rf /home/h205b/.matlab
74. ubuntu中创建新用户的正确方法应该是:sudo adduser,而不是:sudo useradd,否则创建的用户没有主文件夹。对应的删除用户的方法是:deluser和userdel。
75. 如果需要创建的快捷方式出现在左上角的菜单栏other里面,只需要将创建的快捷方式复制到/usr/share/applications中。
76. 知乎上看到的去处thinclient_drives的方法:
77. 出现thinclient_drives这个驱动的原因和安装网上要求安装网上要求给ubuntu18.01 安装xrdp有关,后续再研究如何去处这个驱动,不让其默认启动。
78. 下载cuda的网址:
https://developer.nvidia.com/rdp/cudnn-archive#a-collapse51b
安装cuda和cudnn英文网上教程:https://docs.nvidia.com/deeplearning/sdk/cudnn-install/index.html#install-windows
79. 安装完cuda10.1后的提示:
a. Please make sure that:-PATH includes /usr/local/cuda-10.1/bin-LD_LIBRARY_PATH includes /usr/local/cuda-10.1/lib64, or, add /usr/local/cuda-10.1/lib64 to /etc/ld.so.conf and run ldconfig as root卸载cuda和NVIDIA驱动的指令:Run cuda-uninstaller in /usr/local/cuda-10.1/binRun nvidia-uninstall日志文件保存在: /var/log/cuda-installer.log
80. 2019年7月27日,发现将机械硬盘当做系统盘会拖慢远程访问速度。
81. 2019年7月27日,远程桌面右键点击terminal打不开的解决方法:
application-settings-settingsmanager-preferred applications中改成xfce或者gnome
82. 解决xrdp连接ubuntu18.04需要的指令:
a. sudo apt-get install xorgxrdp;b. sudo apt-get install xserver-xorg-corec. sudo apt-get install xrdpd. sudo apt-get install xserver-xorg-input-all
83. hardware enablement stack(HWE)硬件支持堆栈。在ubuntu18.04.2中,xrdp软件包好像是broken的,所以不能安装xorgxrdp,除非将系统降级到18.04,也就是没有HWE。所以要在ubuntu18.04.2上安装xrdp的整个代码集合如下:
Sudo apt autoremove xrdpSudo apt-get-repository ppa:martinx/xrdp-hwe-18.04 # 替换路径Sudo apt-get update # 更新后设置有效Sudo apt-get install xrdp xorgSudo adduser xrdp ssl-certSudo reboot
84. 复杂的数据扩充方法:Fancy PCA,监督式抠取,GAN生成。
85. 常用的数据扩展方法:
a. Flip: 水平和垂直翻转;
b. Rotation: 旋转;
c. Scale: 缩放;
d. Crop: 随机裁剪;
e. 平移;
f. Gaussian Noise: 加入高斯噪声;
h. 图像模糊,比如高斯blur;
i. 对比度变化,直方图均衡化等;
高级的图像增强技术可以采用Fancy PCA, 主动学习,半监督学习,监督学习,GAN网络来实现。
86. tf.image.random_flip_up_down,tf.image.random_flip_left_right和tf.image.flip_up_down,tf.image.flip_left_right的区别,前两者为随机翻转,也就是有50%的概率不翻转,后两者是绝对翻转。
87. opencv中旋转等仿射变换的几种边界填充模式如下:
Opencv中图像变换的主要函数:
其中warpAffine是仿射变换,warpPerspective是投射变换。
使用方法是:cv2.BORDER_CONSTANT等。
以上各种边界填补的定义值如下:
上述两个枚举定义都在base.hpp文件中。需要注意的是以后查找函数的时候尽量在对应版本的搜索页面上查找。
88. opencv中的边界填充函数:copyMakeBorder,matlab中的空洞填充函数:imfill. CopyMakeBorder函数的原型:
void cv::copyMakeBorder ( InputArray src, OutputArray dst, int top, int bottom, int left, int right, int borderType, const Scalar & value = Scalar() )
89. opencv中在图像上画框的函数,cv2.rectangle(image,(p1_x,p1_y),(p2_x,p2_y),(0,255,2),2): 参数依次是:输入图像,左上角点坐标,右下角点坐标,颜色RGB值,框线粗细大小。
90. 对于cv2.warpAffine函数,需要注意的是,其第三个参数是:(width, height),也就是宽度在前,高度在后,而不是高度在前,这个test=img.shape[:2],不一样,后者是高度在前,宽度在后。
91. 采用opencv实现图像平移的代码:
tx=-20;ty=-20;trans_M=np.float32([[1,0,tx],[0,1,ty]]);height,width=img.shape[:2];translated_img = cv2.warpAffine(img,trans_M,(width,height),borderMode=1)plt.imshow(translated_img)plt.show()
需要注意的是,上面输出图像的大小是宽度在前,高度在后,这与上面第四行得到图像形状的维度次序相反。
92. BCE loss是pytorch中一种内置的loss,其计算公式为:
93. 常用的简单图像增强技术:对比度拉伸,直方图均衡,自适应直方图均衡,效果分别如下图所示:
94. 基于变换的几种图像增强技术:
a. 基于直方图均衡化的图像增强;
b. 基于拉普拉斯算子的图像增强;
c. 基于对数log变换的图像增强;
d. 基于伽马变换的图像增强。
95. matplotlib.pyplot.imshow中的参数cmap取值:
a. plt.imshow(img, cmap=plt.cm.gray); # 灰度显示b. plt.imshow(img, cmap=plt.cm.gray_r); # 反灰度显示c. plt.imshow(img, cmap=’gray’); # 灰度显示d. plt.imshow(img, cmap=’gray_r’); # 灰度显示
96. numpy中扁平化函数ravel()和flatten()函数的相同点:都是高维数组变成低维向量或者扁平化的数组或者向量。两者不同点在于:flatten开辟了新的地址,相当于复制了一份,改变其元素值并不影响原始数组的元素,但是ravel相当于引用,并且开辟了新地址,改变其值会影响原始矩阵或数组的元素值。示例如下:
97. 计算图像直方图的方法:
Numpy中带的函数:a. np.histogram(img.ravel(), 256, [0,256]);
Opencv中带的函数:b. cv2.calHist([img],[0],None,[ 256],[256]); 原型为:
cv2:calcHist(images; channels; mask; histSize; ranges[; hist[; accumulate]]),channels是通道索引,mask是掩码图像,用于统计图像的一部分直方图时使用,histSize是BINS的数目;
plt中带的函数:c. plt.hist (img.ravel(),255,[0,256]);
98. skimage中的图像直方图均衡化:skimage中用于图像直方图均衡化的函数有两个:equalize_hist和equalize_adapthist函数,用法分别为:
a. equalize_hist(image, nbins=256, mask=None),是skimage.exposure模块中的函数,返回直方图均衡化之后的图像;
b. equalize_adapthist(image, *args, **kwargs),是skimage.exposure._adapthist模块中的函数,有限对比度自适应直方图均衡(CLAHE,contrast limited adaptive histogram equalization),一种局部对比度增强的算法,该算法使用在图像的不同平铺区域上计算的直方图,因此,及时在比大多数图像更暗或更轻的区域中,局部细节也可以得到增强。
Equalize_adapthist的计算过程:
- 将图像转换到HSV颜色空间;
- CLAHE算法在V信道上运行;
- 图像被转换回RGB空间并返回;
- 对于RGBA图像,移除原始alpha通道。
99. 直方图均衡化的三种情况:
a. 灰度图像直方图均衡化:
b. 彩色图像直方图均衡化:
c. YUV 直方图均衡化:
100. CLAHE,对比度有限的自适应直方图均衡,Contrast Limited Adaptive Histogram Equalization,原理是在一个点上,图像被划分为几个小块,称为tiles,然后每一个方块都是像平常一样的直方图,直方图被限制在一个小区域,如果噪声在哪里,就会被放大,为了避免这一情况,需要对对比度进行限制,就是如果任何直方图bin超出指定的对比度限制,则在应用直方图均衡前,这些像素被裁剪并均匀地分布到其他bin,均衡后,删除边界中的工件,采用双线性插值,具体代码如下:
101. Fancy PCA: Fancy, 想要,想做,爱慕,自负,自命不凡,想象的事物,想象力,想要,爱好。Fancy PCA的原理就是对原始训练数据的像素值进行主成分分析,根据得到的特征向量和特征值计算一组随机值,然后作为扰动加入到原像素值中去。
102. 研究新的损失函数.
103. one class classfication和二分类的区别,在二分类问题中,训练集就是由两个类的样本组成,训练集中就有两个类的样本组成,训练出的模型是一个二分类模型,而one class classification中的样本只有一类,训练出的分类器将不属于该类的素有其他样本判别为不是,而不是由于属于另一类而返回“不是”这个结果。实际的例子比如:异常值检测,查寻用户信息等等。如果采用二分类器来解决这种问题就会由于正负样本的数量差别过大而产生bias(偏差),这时可以采用one class classification这种方法来解决。
104. zero-shot learning: 0样本学习; one-shot learning:单样本学习,是指的目标样本只有一个,然后根据这单个样本进行学习,然后在进行查找或者分类。
105. LearningRateScheduler的用法:作为回调函数的一员,LearningRateScheduler可以按照epoch的次数自动调整学习率:
def step_decay(epoch):initial_lrate = 0.01drop = 0.5epochs_drop = 10.0lrate = initial_lrate * math.pow(drop,math.floor((1+epoch)/epochs_drop))return lratelrate = LearningRateScheduler(step_decay)sgd = SGD(lr=0.0, momentum=0.9, decay=0.0, nesterov=False)model.fit(train_set_x, train_set_y, validation_split=0.1, nb_epoch=200, batch_size=256, callbacks=[lrate])
106. keras中的神经网络模型主要包括两种,一种是顺序模型,一种是函数模型。即Sequential形式和Convolutional()(para1,para2,…,para_n)两种形式。
107. DenseNet和Inception中更多采用的是concatenate操作,而ResNet更多采用的add操作,这两个操作有什么异同呢?
concatenate操作:网络结构设计中很重要的一种操作,经常用于将特征联合,多个卷积特征提取框架提取的特征融合或者是将输出层的信息进行融合。DenseNet是做通道的合并。而concatenate是通道数的合并,也就是说描述图像本身的特征增加了,而每一特征下的信息是没有增加。
add操作:是信息之间的叠加。Resnet是做值的叠加,通道数是不变的。add是描述图像的特征下的信息量增多了,但是描述图像的维度本身并没有增加,只是每一维下的信息量在增加。
在代码层面就是ResNet使用的都是add操作,而DenseNet使用的是concatenate。
108. Keras中的Merge层提供了一系列用于融合两个层或者两个张量的层对象和方法,以大写首字母开头的是Layer类,以小写字母开头的是张量的函数,小写字母开头的张量函数在内部实际上是调用了大写字母开头的层。其中包括有Add,Substract, Multiply, Average, Maximum, Concatenate等。
109. 1*1卷积的主要作用:可以用来降维,升维,和减少参数。
降维和升维的原理示意图:
降低参数量的原理示意图:
110. Keras中的MaxPooling3D函数:
keras.layers.MaxPooling3D(pool_size=(2, 2, 2), strides=None, padding='valid', data_format=None),其中padding参数的取值为’valid’或者’same’,应该表示是保持缩小或者形状不变。
111. maxpooling中的参数padding参数的选择,
Padding的取值可以为valid或者same,两者不同如下:
112. Inception 模块:
通过1*1卷积来减少参数量的原理图:
上图中原始需要120M的参数储存,而通过1*1卷积,参数量可以降为下图所示的参数量:
Inception V2的结构,主要是通过两个连续的3*3卷积层组成的小网络来代替单个5*5卷积层,在保持感受野范围的同时又减少了参数量。
113. SPPNet专项学习,SPPNet,简称Spatial pyramid pooling,Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition,作者:Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun.
SppNet提出的初衷是为了解决CNN对输入图片尺寸的限制。由于全连接层的存在,与之相连的最后一个卷积层的输出特征需要固定尺寸,从而要求输入图片尺寸也要固定,spp-net之前的做法是将图片裁剪或变形,如下图所示:
Crop/warp的一个问题是导致图片的信息缺失或变形,影响识别精度。对此,文章中在最后一层卷积特征图的基础上又进一步进行处理,提出了spatial pyramid pooling,如下图所示:
空间金字塔池化(spatial pyramid pooling)的网络结构如下图:
简而言之,就是将任意尺寸的feature map用三个尺度的金字塔层分别池化,将池化后的结果拼接得到固定长度的特征向量(图中的256是filter的个数),送入全连接层进行后续操作。
后来的fast RCNN网络即借鉴了spp的思想,其中的ROI Pooling可理解为但尺度的SPP层。
114. CNN网络需要固定尺寸的图像输入,SPPNet将任意大小的图像池化生成固定长度的图像表示,提升R-CNN检测速度24-102倍,固定图像尺寸输入带来的问题就是截取的区域未涵盖整个目标或者缩放带来的图像的扭曲。CNN 卷积层不需要固定尺寸的图像,全连接层是需要固定大小输入的,因此提出SPP层放到卷积层的后面。SPP是BOW的扩展,将图像从精细空间划分到粗糙空间,之后将局部特征聚集,在CNN成为主流之前,SPP在检测和分类的应用比较广泛。
SPP的优点:
- 任意尺寸输入,固定大小输出;
- 层数多;
- 可对任意尺度提取的特征进行池化。
115. SPP的结构是将紧跟最后一个卷积层的池化层使用SPP代替,输出向量为kM,其中k是滤波器个数,M=bins,作为全连接层的输入,网络不仅可以对任意长宽比的图像进行处理,还可以对任意尺度的图像进行处理。尺度在深层网络学习中也很重要。结构如下图:
116. BoW全称为Bag of Words,SPM全称为Spatial Pyramid Matching。