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]; ...
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:...
不变风险最小化
Invariant Risk Minimization
不变风险最小化
论文链接
https://arxiv.org/abs/1907.02893
基本介绍
现有机器学习是通过不断减小训练误差,来实现复杂的预测模型,但计算机是不加选择的提取训练数据的相关性,
correlation-versus-causation【相关性和因果性】有时并不一样,此论文是在研究利用因果关系拓展不变相关性的问题。
文中例子
文中提到一个例子,是对奶牛和骆驼分类。但由于数据集中,大多数奶牛照片是在牧场拍摄的,背景色为绿色,骆驼是在沙漠中。因此神经网络在训练时,不断降低loss值,最终其实是将绿色背景归类为奶牛,米色背景归为骆驼。所以训练出来的结果是不具有泛化性的。
IRM
不变风险最小化 (IRM)
是从多次训练中估计非线性、不变、因果预测因子来实现分布外泛化。
重点:为训练引入约束,将约束表述为惩罚。IRM的目标是构建泛化分布外的预测器。
视觉域泛化
Domain Generalization
in Vision: A Survey
视觉域泛化
论文地址
https://arxiv.org/abs/2103.02503
简介
大多数统计学习算法强烈依赖过于简化的假设,即源数据和目标数据是独立的同分布,而忽略了实践中常见的分布外(OOD)场景。为了克服域转移问题以及目标数据的缺失,引入了域泛化(DG)问题,DG
的目标是使用来自单个或多个相关但不同的源域的数据来学习模型,以便该模型可以很好地泛化到任何
OOD 目标域。
研究 DG
的最初动机是利用多源数据来学习对不同边际分布具有不变性的表示,使用多个域允许模型发现跨源域的稳定模式,从而更好地泛化到看不见的域。然而,单源
DG 方法不需要用于学习的领域标签,因此它们也适用于多源场景。
给定标记的源域 S,DG 的目标是使用来自 S 的数据学习模型
f,以便该模型可以很好地泛化到一个看不见的域 T。
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...