0%

2019年5月29日 下午9:44

Avoiding and Identifying False Sharing Among Threads | Intel® Software
网页( https://software.intel.com/en-us/articles/avoiding-and-identifying-false-sharing-among-threads ) 是intel的官网重点讲解了cache line的问题。本质来说就是由于cache的引入导致了数据的不唯一化,那么多数据时间的同步就会让并行的效率有所下降。解决方案就是使用线程的局部数组,_不再操作同一片内存区域,而不是不同的线程操作不同的区域_。正如代码中所描述的:Note that this program avoids the false sharing problem by storing partial sums into a private scalar.

2019年5月29日 下午9:39

无循环的距离公式推导:两种表示

  1. 【实验小结】cs231n assignment1 knn 部分 - zhyh1435589631的专栏 - CSDN博客
  2. 欢迎来到实力至上主义的CS231n教室(一) 机器学习基础 - 知乎

python 代码

  1. 先搭建起整个1-3步的框架
    1
    dists = np.sqrt(self.getNormMatrix(X, num_train).T + self.getNormMatrix(self.X_train, num_test) - 2 * np.dot(X, self.X_train.T))
  2. 将第一(二)步模块化:这里在np.sum的时候也使用了向量化的思想
    1
    2
    3
    4
    5
    def getNormMatrix(self, x, lines_num):
    """
    Get a lines_num x size(x, 1) matrix
    """
    return np.ones((lines_num, 1)) * np.sum(np.square(x), axis = 1)

2019年5月29日 下午2:56

  1. 代码中硬编码
    1. 使用全局变量
      1. 最大的问题是:
        1. 当你要使用一个函数,这个函数操作的输入输入输出变量不全部在函数参数和返回位置声明
        2. 那么,这样的函数对于以后的再次使用时,
          1. 使用者还得琢磨与这个函数相关的全局变量,担心会不会对已有的功能产生影响,或者自己需要的功能能不能实现。
        3. 这样,使用者的工作量就不仅仅是看懂这个函数了,反而大大降低了工作效率
    2. 使用绝对路径
      1. 代码中输入输出使用绝对路径
        1. 代码运行的时候一定会报错,找不到文件,或者写入不成功
      2. 配置项中使用绝对路径
    3. 将带有特定版本指定的依赖库名直接写到代码中
      1. 这个我就在Polyfit中遇见过一次,相对来说比较少
  2. 配置里硬编码
    1. 配置项中不要使用绝对路径,这也是为什么系统要有自己的环境配置项,就是为了能让环境配置不在使用绝对路径

2019年5月28日 上午9:58

我主要使用静态编译库

  1. 编译源文件openmp_bin -c -o test.o test.cpp
  2. 生成静态库ar -rcs libtest.a test.o
  3. 链接静态库openmp_bin -o main main.cpp -L. -ltest
    1. openmp_bin -o main main.cpp ./libtest.a
  4. ./main

主要参考:

C++静态库与动态库 - 吴秦 - 博客园

  1. 讲解原理
  2. 在windows的vs下实践
  3. 在linux在实践

次要参考:

  1. 动态链接库与静态链接库—函数篇 - 简书
    1. 简要操作看这里
  2. 静态链接库、动态链接库和动态加载库 - ITtecman - 博客园
    1. 在linux下实践

2019年5月28日 下午7:23

分一下几个角度进行考虑:

  1. 显示机制
    1. QT显示机制
    2. PCL显示机制
    3. OpenGL显示机制
  2. 工程管理
    1. git
    2. 包管理
  3. 错误排查
    1. 环境、编码错:
      1. vs报错-自己的总结
    2. 算法参数使用数据本身的问题
      1. 超参数的大小
      2. 数据(大、小、NUN、不完整,残留)
    3. 不是所有的错误都有所以然,所以这时候git版本控制的作用就凸现出来了
  4. 工程开发
    1. 大部分的工作集中在
      1. 数据读入读出
      2. 不同算法输入输出的转换
      3. 显示
      4. 解决各个模块之间相互之间的影响(返工的主要因素)
  5. 算法开发
    1. 虽然使用的核心算法是别人写的,但是你也要知道一下几点,这对你进行各个模块之间的整合是必须的
      1. 这个算法依赖的数据结构(定义的结构体)是啥,每个成员是啥意思,这个算法哪里要用到这个成员
      2. 算法的超参数有哪些,如果不知道这些,你都不知道如何调参数
      3. 算法的核心思想是啥,也就一句话的事,这是你记忆和以后遇到问题尝试解决的一个最好的出发点。

2019年5月28日 下午7:14

源码添加属性页之后报错

  1. 源码中直接将gurobi75硬编码到了代码中,需要我们改成自己的版本
  2. 未声明
    1. 不是未声明,而是声明了两份编译器不知道选哪个了某个变量定义了两份,一份是Polyfit自己的,一份是GL库中的
    2. 解决方法是在报错的文件直接引用Polyfit自己的glew.h

Graphite

2019年5月26日 下午2:51

主页

Weka 3 - Data Mining with Open Source Machine Learning Software in Java

weka的几个突出特点:

  1. 能够对训练数据进行解剖,具体到每一个数据我们都是可以可视化的看到

Documentation

Weka 3 - Data Mining with Open Source Machine Learning Software in Java

  1. Wiki
    1. Learning resources - Weka Wiki
  2. package
    1. Waikato Environment for Knowledge Analysis (WEKA)
  3. API
    1. Generated Documentation (Untitled)
  4. book
    1. https://www.cs.waikato.ac.nz/ml/weka/Witten_et_al_2016_appendix.pdf
  5. Video
    1. Data Mining with Weka
    2. More Data Mining with Weka
    3. Advanced Data Mining with Weka

具体的使用:

均值 最大小值 标准差

属性值的统计分布

属性间的相关性


2019年5月25日 下午10:17

重要知识点

1
2
3
4
5
6
6.PyTorch.pdf
7.Tensorflow.pdf
8.Static_Dynamic_Graph.pdf
10.Weight_Initialization.pdf
11.Batch_Normalization.pdf
12.Optimization.pdf
  1. Static_Dynamic_Graph
    1. 我终于理解这个概念从哪来的的:【图】来源于求解梯度的反向传播算法,而PyTorch和Tensorflow只是实现了这种概念而已。
  2. Weight_Initialization
    1. 权重的初始化,我一直理解不深,觉得随便初始化效果都一样
    2. 这里的关键是他们是用什么衡量初始化的好坏?
      1. 他们将每层的输出(通过激活函数之后)的结果直方图画出来。
      2. 这个直方图不能全部集中在0、1、-1这些地方,而是应该有分布的分布在-1~1之间
    3. 如何找到好的初始化权重?
      1. 我认为他们就是试出来的
  3. Batch_Normalization
    1. 主要思想:
      1. 目的:和Weight_Initialization的目的相同,都是要让每层的输出满足合理的分布
      2. 方法:既然找到一个好的初始化权重很难,那么,我们就让每层不太好的输出,强行的转化为较好的分布
  4. Optimization
    1. SGD:就是简单的负梯度大小 * 步长(学习率)
    2. SGD+momentum:
      1. 理解:要尽可能的维持上一步的速度,上下步之间有了关系
    3. Adam
      1. 理解:有一定的自适应性
        1. 猫咬自己的尾巴,有点类似于迭代运算
        2. 自己(x)影响下一轮的自己