Linux下模仿实现readelf部分功能
模仿实现Linux下 \(readelf\) 工具部分功能 完整实现: https://github.com/JiaZhengJingXianSheng/ReadELF ELF 目标文件格式的最前部是 ELF文件头 (ELF Header) ,它包含了描述整个文件的基本属性,比如 ELF 文件版本、目标机器型号、程序入口地址等。紧接是 ELF 文件各个段。其中ELF 文件中与段有关的重要结构就是 段表 (Section Header Table) ,该表描述了ELF 文件包含的所有段的信息,比如每个段的段名、段的长度、在文件中的偏移、读写权限及段的其他属性。 在 linux 下elf的定义存放在 \(/usr/include\) 下, 我们可以用 \(readelf -h\) 命令加上文件来查看ELF头文件。 1vim /usr/include/elf.h ELF 的文件头中定义了...
Java简单策略模式
Java策略模式 参考书目 《大话设计模式》 程杰 清华大学出版社 代码链接 https://github.com/JiaZhengJingXianSheng/Calculate_By_Java_Version2 本文是对上篇 Java简单工厂模式 的重写,以达到代码更易于维护的目的。 一、 定义接口 与上篇不同,这篇我们选择定义接口,并在后续功能实现中, \(implement\) 我们的接口。 接口定义加上参数,方便后期调用,定义如下 123public interface OperationInterface { double getResult(double A, double B) throws Exception;} 二、 定义运算 接下来定义各种方法,来实现我们的接口。 123456public class OperationAdd implements OperationInterface { @Override public double getResult(double A, double B)...
Java简单工厂模式
Java简单工厂模式 参考书目 《大话设计模式》 程杰 清华大学出版社 代码链接 https://github.com/JiaZhengJingXianSheng/Calculator_By_Java 我们在编写程序时为了容易修改,通常会用 封装、继承、多态 来降低程序的耦合度。 比如我们要实现一个简单的计算器功能,具体功能为传入两个数值和一个操作符,返回计算结果。 一、 抽象类创建 通常我们会在一个抽象类内部定义主要的信息,比如输出输出等。 1234567891011121314151617181920212223public abstract class Operation { private double _numberA = 0; private double _numberB = 0; public double get_numberA() { return _numberA; } public void set_numberA(double _numberA) { ...
排序
C++常用排序 代码链接 https://github.com/JiaZhengJingXianSheng/SortByCPlusPlus 选择排序 选择排序可以将序列看作有序序列和无序序列的结合。如何理解这句话,我们拿第一个值当作标定,和后面所有值对比,找出小于标定的结果并进行交换。那么一轮交换就可以选出一个最小值,当我们标定不断后移就可实现排序。当然,标定应该在倒数第二个值终止,因为最后一个值并无后续。 1234567891011void selectSort(int* &arr, int len) { for (int i = 0; i < len - 1; i++) { for (int j = i + 1; j < len; j++) { if (arr[i] > arr[j]) { int temp = arr[i]; arr[i] = arr[j]; arr[j] =...
Seq2Seq
Seq2Seq 以往的循环神经网络,输入的是不定长的序列,输出确是定长的,我们选取最长词并通过对短的词扩充来实现输出定长。但有些问题的输出不是定长的,以机器翻译为例,输入一段英语,输出对应法文,输入和输出大概率不定长,比如 英文:Beat it. 法文:Dégage ! 英文:Call me. 法文:Appelle-moi ! 当输入输出序列不定长时,我们可以采用编码器-解码器(encoder-decoder)或Seq2Seq实现。 论文参考:https://arxiv.org/abs/1409.3215 编码器-解码器 编码器和解码器分别对应输入序列和输出序列的两个循环神经网络。 编码器 编码器将长度可变的输入序列转换成形状固定的上下文变量,并且将输入序列的信息在该上下文变量中进行编码。 假设输入序列是\(x_1,x_2,x_3...x_T\) ,其中\(x_t\)是输入文本序列中第t个词原,用\(h_t\) 来表示上一时间的隐藏状态,用函数\(f\)来描述为 \[ h_t=f(x_t,h_t−1) \] 编码器的背景向量 \[ c =...
AutoEncoder
AutoEncoder 自编码 AutoEncoder 是一种无监督学习的算法,他利用反向传播算法,让目标值等于输入值。 比如对于一个神经网络,输入一张图片,通过一个 Encoder 神经网络,输出一个比较 "浓缩的"feature map。之后将这个 feature map 通过一个 Decoder 网络,结果又将这张图片恢复。 如果说我们的数据集特别大,对于直接训练而言性能肯定较低。但如果我们对数据特征进行提取,缩减输入信息量,学习起来就相对轻松。 简单模型 下面是一个AutoEncoder的三层模型,其中 \(W^* = W^T\) 2010年,Vincent 在论文中表明,只用单组W就可以,所以W*没有必要去训练。 http://jmlr.org/papers/volume11/vincent10a/vincent10a.pdf 如果实数作为输入,损失函数为 \(L(f(x)) = {1\over2}\sum_{k}(\hat x_k - x_k)^2\) PCA 和...
Linux CMake工程目录结构
Linux CMake工程目录结构 主文件目录 1234./lib/./src/./build./CMakeLists.txt ./CMakeLists.txt 12345678CMAKE_MINIMUM_REQUIRED( VERSION 3.10 )PROJECT(MAIN)ADD_SUBDIRECTORY(./lib )ADD_SUBDIRECTORY(./src) ./lib/CMakeLists.txt 12345AUX_SOURCE_DIRECTORY(. DIR_LIB_SRCS)SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)ADD_LIBRARY(LIB STATIC ${DIR_LIB_SRCS}) ./src/CMakeLists.txt 12345678910INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/lib) SET(EXECUTABLE_OUTPUT_PATH...
C++主存层面数据交换
C++ 互换指针指向内存结果 1. 互换指针指向内存结果 将命令参数前两个值在主存中互换并输出。 1234567891011121314#include <iostream>#include "mySwap.hpp"int main(int argc, char** argv){ std::cout<<"Origin info is: "<<std::endl; std::cout<<"a: "<<argv[1]<<" \tb: "<<argv[2]<<std::endl; mySwap(argv[1],argv[2]); std::cout<<"Has been swaped info is: "<<std::endl; std::cout<<"a:...
Sentiment Analysis For RNN
Sentiment Analysis For RNN 循环神经网络进行情感分析 引言: 对于情感分析,如果简化来看可以分为正向情绪和负向情绪,我们可以将情感分析视为文本分类任务,因此我们可以将预训练的词向量应用于情感分析。我们可以用预训练的GloVe模型表示每个标记,并反馈到RNN中。 RNN表征文本 在文本分类任务中,要将可变长度的文本序列转为固定长度。可以通过nn.Embedding()函数获得单独的预训练GloVe,再去通过双向LSTM,最后在去通过一个全连接层做一个二分类,即可实现RNN表征文本。 123self.embedding = nn.Embedding(vocab_size, embed_size)self.encoder = nn.LSTM(embed_size, num_hiddens, num_layers=num_layers,bidirectional=True)self.decoder = nn.Linear(4 * num_hiddens, 2) 1234embeddings =...
VGG16实现分类任务
VGG16实现分类任务 VGG是2014年由牛津大学著名研究组VGG(Visual Geometry Group)提出,斩获当年ImageNet竞赛中定位任务第一名和分类任务第二名。 原理图 20211107_1 原理简述 例如有张224x224的RGB图片,我们让他通过两个卷积核为3的卷积层,再通过最大池化层(核尺寸为2,步距为2)。至于卷积层的输入输出维度,参考下图,我们一般常用VGG16模型,最终用多个FC实现分类,也可将FC换成卷积核为1的卷积层。 数据集 同样选用本人常用的海贼王数据集来测试,可以根据个人需求修改。 下面提供一个简单数据集。 Kaggle的鸟儿分类数据集,共315个分类 https://www.kaggle.com/gpiosenka/100-bird-species 可以用kaggle命令选择下载 1kaggle datasets download -d...