Room of Requirment

Less is More


  • Home

  • Tags

  • Categories

  • Archives

Java 数组

Posted on 2019-08-27

基本概念

数组与其他种类容器之间的区别有三方面:效率、类型和保存基本类型的能力。
在Java中,数组是一种效率最高的储存和随机访问对象引用序列的方式。数组就是一个简单的线性序列,这使得元素访问非常快速。但这种速度所付出的代价是数组对象的大小被固定。ArrayList的效率比数组低很多。这两种持有对象的方式都是类型检查型的,并且唯一明显的差异就是数组使用[]来访问元素。而List使用的是add()和get()这样的方法。
length是数组的大小,而不是实际保存的元素个数,所以检查其中的引用是否为null,即可知道数组的某个位置是否存有对象。同样,基本类型的数组如果是数值型的,就被自动初始化为0,如果是字符型(char)的,就被自动初始化为(char)O;如果是布尔型(boolean),就被自动初始化为false。

多维数组

创建多维数组很方便。对于基本类型的多维数组,可以通过使用花括号将每个向量分隔开,每对花括号括起来的集合都会把你带到下一级数组。Java SE5的Arrays.deepToString()方法,它可以将多维数组转换为多个String。数组中构成矩阵的每个向量都可以具有任意的长度(这被称为粗糙数组)。
编写一个方法能够产生二维双精度型数组并加以初始化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static double[][][] creation(int a, int b) {
Random rand = new Random(47);
int c = b - a;
double d[][][] = new double[rand.nextInt(c) + a] [][];
for(int i = 0; i < d.length; i++) {
d[i] = new double[rand.nextInt(c) + a][];
for(int j = 0; j < d[i].length; j++) {
d[i][j] = new double[rand.nextInt(c) + a];
for(int q = 0; q < d[i][j].length; q++) {
d[i][j][q] = rand.nextDouble();
}
}
}
return d;
}

Arrays实用功能

  • Arrays.fill() 只能用同一个值填充各个位置

    1
    2
    3
    4
    int size = 6;
    int[] a = new int[size];
    Arrays.fill(a,19);
    print("a = " + Arrays.toString(a));
  • System.arraycopy() 不属于Arrays但是很有用的方法 static
    它用来复制数组比用for循环复制要快很多

    1
    2
    3
    4
    5
    int[] i = new int[7];
    int[] j = new int[10];
    Arrays.fill(i, 47);
    Arrays.fill(j, 99);
    System.arraycopy(i, 0, j, 0, i.length)

arraycopy()需要的参数有:源数组,表示从源数组中的什么位置开始复制的偏移量,表示从目标数组的什么位置开始的偏移量,以及需要复制的元素个数。对数组的任何越界操作都会导致异常
System.arraycopy()不会执行自动包装和自动拆包,两个数组必须具有相同的确切类型。

  • equals()
    Arrays类提供了重载后的equals()方法,用来比较整个数组
    数组相等的条件是元素个数必须相等,并且对应位置的元素也相等,这可以通过对每一个元素使用equals()作比较来判断。(*对基本类型,需要使用基本类型的包装器类的equals()方法
    deepEquals()用于多维数组

  • sort()用于对数组排序

  • binarySearch()用于在已经排列的数组中查找元素

  • toString()产生数组的String表示

  • hashCode()产生数组的散列码

初识CNN

Posted on 2019-08-22 Edited on 2019-08-27

Convolutional Neural Networks(CNNs)

CNNs的结构

"Figure 1: Convolutional Neural Network for Relation Extraction"

Convolution (卷积)

卷积的数学理解
1、卷积的定义

我们称 $(f*g)(n)$ 为 $f,g$ 的卷积
其连续的定义为:

其离散的定义为:

这两个式子有一个共同特征:都类似于$n = t + n - t$
我们令$x = r, y = n - r$,那么$x + y = n$ 就是下面这些直线
lines

2、离散卷积的例子:丢骰子

将两枚🎲抛出去,两枚🎲点数加起来为4的概率是多少?
我们把🎲各个点数出现的概率表示出来:
相加点数4出现概率为:$f(1)g(3)$ $f(2)g(2)$ $f(3)g(1)$
因此,两枚🎲点数加起来为4的概率为:$f(1)g(3) + f(2)g(2) + f(3)g(1)$
符合卷积的定义,把它写成标准的形式就是:

3、连续卷积的例子:做馒头

假设我们拥有一台可以一天不断生产馒头的机器
假设馒头的生产速度为$f(t)$,那么一天后生产出的馒头总量为:

馒头生产出来后会慢慢腐败,假设腐败函数为$g(t)$,比如,10个馒头,24小时会腐败 $10*g(t)$
如此,我们可以知道,一天后,馒头总共腐败了:

卷积的实际运用

基础CNN所用的卷积是一种2D卷积。Kernel只能在x,y上滑动位移,不能进行深度(跨通道)位移。
对于RGB图像,采用了三个独立的2D kernel,如黄色部分,这个kernel的维度是$X*Y*3$。再基础CNN的不同stage中,kernel的深度都应当一致,等于输入图像的通道数。
卷积需要输入两个参数,实质是二维空间滤波,滤波的性质与kernel选择有关,CNN的卷积是在一个2-D kernel 和输入的 2-D input map 之间,RGB中各图像通道分别完成。
我们假设单一通道输入图像的空间坐标为$(x,y)$ ,卷积核大小是$p * q$ ,kernel权重为$w$ ,图像亮度值是$v$ ,卷积过程就是kernel 所有权重与其在输入图像上对应元素亮度之和,可以表示为:

convolution
并将kernel随(x,y)平移扫描,可以得到输出空间,这时假设输入图像大小是$512*512$,卷积核是$3*3$,在不考虑零填充(zero padding)的情况,输出是(512 - 3 + 1) = 510 *510
卷积层的kernel可能不止一个,扫描步长,方向也有不同,这些进阶方式可以归纳一下:

  • 可以采用多个卷积核,设为n同时扫描,得到的feature map会增加n个维度,通常认为是多抓取n个特征
  • 可以采取不同扫描步长,比如上例子中采用步长为n,输出是(510/n,510/n)
  • padding,上例中,卷积过后的图像维度是缩减的,可以在图像周围填充0来保证feature map与原始图像大小不变
  • 深度升降,例如采用增加一个1*1 kernel来增加深度,相当于复制一层前通道作为feature map
  • 跨层传递feature map,不再局限于输入即输出,例如ResNet跨层传递特征,Faster RCNN 的POI pooling

Activation(激活)

卷积之后,通常会加入偏置(bias), 并引入非线性激活函数(activation function),这里定义bias为b,activation function 是h(),经过激活函数后,得到的结果是,

bias不与元素位置相关,只与层有关
主流的activation function 有:
activation functions
例如采用$277*277$的RGB图像, 采用96个$11*11*3$的kernels同时扫描,很容易得到输出的feature maps是96个$267*267$的二维 feature map, $267*267$是单个图像feature map的x,y轴大小,96是卷积核个数,原本的3通道在积分的时候会被作为一个元素加起来。 如上图,这些feature map可视化之后,可以看到4和35表示边缘特征,23是模糊化的输入,10和16在强调灰度变化,39强调眼睛,45强调红色通道的表现。

Pooling (池化)

池化(pooling),是一种降采样操作(subsampling),主要目标是降低feature maps的特征空间,或者可以认为是降低feature maps的分辨率。因为feature map参数太多,而图像细节不利于高层特征的抽取。
pooling
目前主要的pooling操作有:

  • 最大值池化 Max pooling: $2*2$的max pooling就是取4个像素点中最大值保留
  • 平均值池化 Average pooling, $2*2$的average pooling就是取4个像素点中平均值保留
  • L2池化 L2 pooling: 即取均方值保留
    Pooling操作会降低参数,降低feature maps的分辨率,但是这种暴力降低在计算力足够的情况下是不是必须的,并不确定。目前一些大的CNNs网络只是偶尔使用pooling.

该CNN stage的基本结构是可变的,目前大部分网络都是根据基本结构堆叠调整参数,或跳层连接而成

Github + Hexo (Mac)

Posted on 2019-08-12 Edited on 2019-08-21

安装git配置用户名和邮箱

查看当前电脑是否安装git git --version
初次安装git需要配置用户名和邮箱,否则git会提示:please tell me who you are
运行命令来配置你的用户名和邮箱

1
2
$ git config --global user.name "2AM-official"
$ git config --global user.email "zhaoxinglyu@icloud.com"

此用户名和邮箱是git提交代码时用来显示你身份和联系方式的,并不是github用户名和邮箱,但我在这里为了省事直接使用我本人的github邮箱

git使用ssh密匙

git支持https和git两种传输协议,github分享链接时会有两种协议可选:git协议链接和https协议链接。
git使用https协议,每次pull,push都会提示要输入密码;使用git协议,然后使用ssh密匙,这样可以免去每次都输密码的麻烦

初次使用git的用户要使用git协议大概需要三个步骤:

1、生成密匙对
2、设置远程仓库(本文以github为例)上的公匙
3、把git的remote url修改为git协议
以上两个步骤初次设置过后,以后都不需要再次设置,此步骤视以后项目的remote url而定,如果以后其他项目的协议为https则需要此步骤

生成密匙对

大多数git服务器都会选择使用SSH公匙来进行授权。系统中的每个用户都必须提供一个公匙用于授权,没有的话就要生成一个。
生成公匙的过程在所有操作系统上都差不多,首先要确认一下本机是否已经有一个公匙。
SSH公匙默认储存在账户的主目录下~/.ssh目录

1
2
$ cd ~/.ssh
$ ls

看一下有没有id_rsa和id_rsa.pub(或者是id_dsa和id_dsa.pub之类成对的文件),有.pub后缀的文件就是公匙,另一个文件则是密匙。
假如没有这些文件,甚至连.ssh目录都没有,可以用ssh-keygen来创建。该程序在Linux/Mac系统上由SSH包提供。

1
2
3
4
5
$ ssh-keygen -t rsa -C "your_email@yourmail.com"

Creates a new ssh key using the provided email #Generating public/private rsa key pair.

Enter file in which to save the key (/home/you/.ssh/id_rsa):

直接按Enter就行,然后会提示你输入密码,如下 建议输一个,安全一点;不输也行

1
Enter same passphrase again: [Type passphrase again]

完了之后,大概是这样:

1
2
Your public key has been saved in /home/you/.ssh/id_rsa.pub.
The key fingerprint is: # 01:0f:f4:3b:ca:85:d6:17:a1:7d:f0:68:9d:f0:a2:db your_email@youremail.com

到此为止,你的本地密匙对就生成了

2、添加公匙到你的远程仓库(github)

1)查看你生成的公匙:

1
2
3
$ cat ~/.ssh/id_rsa.pub

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC0X6L1zLL4VHuvGb8aJH3ippTozmReSUzgntvk434aJ/v7kOdJ/MTyBlWXFCR+HAo3FXRitBqxiX1nKhXpHAZsMciLq8vR3c8E7CjZN733f5AL8uEYJA+YZevY5UCvEg+umT7PHghKYaJwaCxV7sjYP7Z6V79OMCEAGDNXC26IBMdMgOluQjp6o6j2KAdtRBdCDS/QIU5THQDxJ9lBXjk1fiq9tITo/aXBvjZeD+gH/Apkh/0GbO8VQLiYYmNfqqAHHeXdltORn8N7C9lOa/UW3KM7QdXo6J0GFlBVQeTE/IGqhMS5PMln3 admin@admin-PC

2)登陆你的github账户。点击你的头像,然后Settings -> 左栏点击 SSH and GPG keys -> 点击 New SSH key
3)复制上面公匙内容,粘贴进“Key”文本域内。 title域,自己随便起个名字。
4)点击Add key。
完成以后,验证下这个key是不是正常工作:

1
2
3
$ ssh -T git@github.com

Attempts to ssh to github

如果看到

1
Hi xxx! You've successfully authenticated, but GitHub does not # provide shell access.

则为设置成功

3、修改git的remote url

使用命令git remote -v查看你当前的remote url

1
2
3
$ git remote -v
origin https://github.com/someaccount/someproject.git (fetch)
origin https://github.com/someaccount/someproject.git (push)

如果是以上的结果那么说明此项目是使用https协议进行访问的,如果地址是git开头则表示是git协议
你可以登陆你的github,就像本文开头的图例,你在上面可以看到你的ssh协议相应的url
复制此ssh链接,然后使用命令 git remote set-url 来调整你的url

1
git remote set-url origin git@github.com:someaccount/someproject.git

然后你可以用命令git remote -v查看一下,url是否已经变成了ssh地址
然后你就可以愉快的使用git fetch, git pull , git push,再也不用输入烦人的密码了

安装Hexo

安装Nodejs

因为hexo是基于nodejs的应用,所以要先安装nodejs才可以,使用以下命令

1
2
$ sudo apt-get install nodejs
$ sudo apt-get install npm

Hexo安装

Hexo 是一个功能强大的静态网站生成系统,快速、简洁、高效。Hexo 支持 GitHub Flavored Markdown 的所有功能,甚至可以整合 Octopress 的大多数插件。可以一键部署到github,还有丰富的插件和主题,还支持热部署哦。执行如下命令进行安装。

1
$ sudo npm install hexo-cli -g

快速开始

安装Hexo成功后,使用如下命令快速新建一个博客系统,然后运行它

1
2
3
4
$ hexo init blog
$ cd blog
$ npm install
$ hexo server

如果npm安装失败,使用sudo安装
运行成功后,访问http://0.0.0.0:4000/ 就可以看到博客的样子

新增文章

使用如下命令新增一篇md格式的文章

1
$ hexo new 'your title'

推送网站

上面只是在本地预览,接下来做的就是推送网站,也就是发布网站。
在blog根目录里的_config.yml文件称为站点配置文件
在根目录里的themes文件夹,里面也有个_config.yml文件,这个称为主题配置文件
下一步将我们的Hexo和github关联起来,打开站点的配置文件_config.yml,翻到最后修改为:

1
2
3
4
deploy:
type: git
repo: 这里填入你之前在GitHub上创建仓库的完整路径,记得加上 .git
branch: master

保存站点配置文件
其实就是给hexo d 这个命令做相应的配置,让hexo知道你要把blog部署在哪个位置,很显然,我们部署在我们GitHub的仓库里。最后安装Git部署插件,输入命令:

1
$ npm install hexo-deployer-git --save

再分别输入三条命令

1
2
3
$ hexo clean
$ hexo g
$ hexo d

其实第三条的hexo d就是部署网站命令,d是deploy的缩写
完成后,打开浏览器,在地址栏输入你的放置个人网站的仓库路径即可

Acknowledge:

https://help.github.com/en/articles/caching-your-github-password-in-git#platform-linux
https://www.tuicool.com/articles/BzUrAvF
https://www.cnblogs.com/zhaoyu1995/p/6239950.html
https://zhuanlan.zhihu.com/p/26625249

Mixcity

Posted on 2019-08-04 Edited on 2019-08-07

with Georgia

后来,我才知道,原来每个夏天都不一样。

以前以为,夏天就是写写作业,打打游戏,和朋友在一起看着天空浪费时间,一起想想暗恋的女孩子。后面却发现夏天变得越来越热,热到不想出门,雪糕也越来越贵,一起看天空发呆的朋友也换了几批,也越来越现实,不再谈论什么梦想,看着老友,嘴臭几句,便心满意足,也再也不用去暗恋其他女孩子了,就连作业也有整整两年没有写过了。这才意识到,记忆深处的夏天,也许永远停留在了记忆深处。

后来,我才觉得,生活,也许是需要记录的。现在记性越来越不大好,和自己不相关的事情过一遍脑子就被自动删除了,读了两年大学,也只是用成果和自己发的朋友圈去保存过去,但如果有人问我这两年都学了啥,我还真一时不知如何回答。不如把一些经历和所学的写下来,多多少少,也算存储记忆的一种方式,于是,就有了搭建博客的想法。

如果说,每段经历都有一个事物让你能够记住它,可能是时间,可能是人物,可能是一个纪念品,也可能是一个吻。那么这个博客的搭建完成,就用万象城去代表,所以这篇文章叫Mixcity。

每个假期如果有机会的话,必找高中同班的学霸Georgia出来闲逛。高中时,他过早形成的审美和世界观对我的个人发展其实也造成了一定的影响,每次便拖他出来,在闲聊的时候定会给予我灵感和让我意识到我的一些不足。这次也恰巧我搭建博客也遇到了不知名的问题,便带着问题去找他,和他在星巴克掐头去尾用了一个小时把这个博客搭了起来,所以这个博客的存在也少不了他对我的帮助,第一篇文章也表达我对他的感谢。用一句具有这个时代气息的话,shout out to Georgia。这是他的github账号: Georgia-STR,希望这个逼以后成功了能在他的公司里给我找个扫地的活。

最后再来介绍一下这个博客,也算一个置顶的简介,博客的名字是Room of Requirement,来自于哈利波特,在翻译版中叫有求必应屋,希望我藏在这里面的东西可以帮助到自己和别人。Less is More则是看到next主题,突然浮现在脑海里的一句话,希望自己在生活中也可以去做实质性的事情,而不是浪费时间的事情。Description里写的则是Rich Brian在歌曲Kids里面的一句歌词’’they said the fruit never gon’ fall far from the tree”,翻译中写的是落叶归根,我一开始则以为是说凡事需要努力才会有成果。这两句的寓意我都很中意,便把这句话留下来了。虽然不知道未来会怎样,但还是最热爱养育我的地方和陪伴着我的朋友。

Thanks for reading my rubbish. Thanks! Georgia!!!

Test test inline code: main() with …

1
2
3
4
5
6
7

#include <cstdio>

int main() {
printf("aaa");
return 0;
}

Reference test: aaaaa

test

ttt

bold, italic

12

2AM

they said the fruit never gon' fall far from the tree
14 posts
1 categories
7 tags
© 2019 2AM
Powered by Hexo v3.9.0
|
Theme – NexT.Muse v7.3.0