cycleGAN
模型属于 GAN
模型的一个变形,在很多情况下,我们无法获得或者很难获得成对的训练数据,cycleGAN
要解决的问题是: seek an algorithm that can learn to translate between domains without paired input-output examples
,如下图:
其中,cycleGAN
的网络结构如下图所示:
cycleGAN
模型属于 GAN
模型的一个变形,在很多情况下,我们无法获得或者很难获得成对的训练数据,cycleGAN
要解决的问题是: seek an algorithm that can learn to translate between domains without paired input-output examples
,如下图:
其中,cycleGAN
的网络结构如下图所示:
该篇博文使用 cGAN
实现了 image to image translation
,由于 cGAN
可以通过添加条件来指导图像的生成,因此用此图像翻译技术,可以很好的实现诸如图片着色等任务,具体模型参考 此篇论文 。
pix2pix
模型使用输入图像(x)
作为条件(这里没有噪声输入 z
, 可以把 G
的输入 x
看做是噪声 z
),学习从输入图像到输出图像的映射,从而得到指定的输出图像。具体过程如下图:
传统图像转换过程中都是针对具体问题采用特定算法去解决,而这些过程的本质都是根据像素点(输入信息)对像素点做出预测(predict from pixels to pixels)
,pix2pix
的目标就是建立一个通用的架构去解决图像翻译问题,使得我们不必要为每个特定任务都重新设计一个损失函数。但是该模型也有一定的缺点,pix2pix
在训练时需要成对的图像(x和y)
,模型学到的是 x 到 y 之间的一对一映射。也就说,pix2pix
就是对ground truth
的重建:输入轮廓—>经过Unet
编码解码成对应的向量—>解码成真实图。这种一对一映射的应用范围十分有限,当我们输入的数据与训练集中的数据差距较大时,生成的结果很可能就没有意义,这就要求我们的训练数据集要尽量涵盖各种类型。以轮廓图到服装为例,我们在自己的数据集上训练好模型,当输入与训练集中类似的轮廓图时得到以下结果:
接上一篇DCGAN手写数字生成
,虽然它能够生成效果不错的手写数字图片,但它有一个缺点就是不能生成指定数值的数字,好在有一种 GAN
模型叫 cGAN
,即 Conditional Generative Adversarial Nets
, 出自 此篇论文,它能够生成指定数值的数字图片。
模型结构如下图:
其损失函数定义:
最近忙里偷闲,补一发之前落下的关于一些GAN
的tensorflow2.0
实现代码。
首先,GAN
,即生成对抗网络Generative Adversarial Network
,由一个生成器Generator
和一个判别器Discriminator
组成,两者属于 零和博弈 的双方,不是你死就是我亡的状态。
其损失函数一般定义如下:
判别器 D
对来自真实数据集的样本 $x\sim p_{data}$ 要输出大概率,越接近 1
越好;对来自生成器生成的样本$z\sim p_z$ 要输出小概率,越接近 0
越好。当然,这是一个零和博弈,对于生成器G
来说,其目标与D
截然相反,他想使自己生成的样本不能被D
识别出来。这么不断的你来我往,双方各自不断调优,最后达成一个平衡状态。
当然,这其中的损失函数也不只这一种,比如说,生成器的损失函数可以定义为:生成样本分布与真实样本分布的 KL
散度值等。
KL 散度用来衡量两个分布之间的相似性。
天朝 qiang
越垒越高,买的境外的服务器用时间长了经常会出现 IP
被 ban
的情况,本教程通过 v2ray+websocket(ws)+TLS
将流量伪装成 TLS
流量,即将自己的境外转发服务器伪装成一个网站,并通过 cloudflare
中转,网络流量流经图如下:
这样的话,防火墙就只知道你和 CDN
之间建立了连接,不知道你的 vps
实际的 IP
地址,这样就可以有效的防止你的 IP
被 ban
,并且 CDN
会有很多 IP
地址,防火墙也不会随意去 ban
他们的 IP
,毕竟也有很多正规的网站在使用,所以基本上可以确保你的 IP
的安全。
1、source
命令
1 | source filename |
在当前 bash
环境下读取并执行 filename
中的命令。
2、环境变量分为 永久环境变量
和 临时环境变量
永久环境变量:修改配置文件,/etc/profile, /etc/.bashrc, ~/.profile, ~/.bashrc
等,
临时环境变量:使用 export
命令声明即可,变量在关闭shell
时失效。
1、Go
语言更高效的利用计算机CPU
上的所有核心,更高效的复用代码。
2、Go
语言自带垃圾回收器,不需要用户自己管理内存。
3、使用 goroutine
并发,使用 通道
避免其他语言中的共享内存访问
的问题,减少了锁
或者 同步机制
。
4、Go
语言的每个代码文件都属于一个包,一个包定义一组编译过的代码,包的名字类似于命名空间。处在同一个文件夹里的代码文件,必须使用同一个包名,按照惯例,包和文件夹同名。
5、Go
编译器为了让程序的可读性更强,不允许声名导入某个包却不使用。解决方法: 在导入的路径前加一个 下划线
,这样它会调用对应包内的所有代码文件里定义的 init
函数,进行初始化操作。
二分搜索,注意第 34
行的 L = L + 1
的条件判断,在最坏情况下,会使得该二分搜索退化为 O(N)
的时间复杂度。
1 | class Solution { |
模拟题
1 | class Solution { |
模拟题,线上代码铁定不能这么写,内存泄露有木有!
1 | class Solution { |
一个很自然的想法是,以当前柱子为高,向两边遍历,时间复杂度为 $O(n^2)$。降低复杂度的关键是,如何快速找到以当前柱子为高的左右边界left_index 和 right_index
,维护一个单调的递增栈 >=
,即可快速找到 left_index 和 right_index
。具体如代码第 14 行所示,整体时间复杂度为 $O(n)$ 。
1 | class Solution { |
使用两个指针即可。
1 | class Solution { |
一个小的 trick
是从后往前遍历,时间复杂度 $O(n+m)$, 空间复杂度 $O(1)$ 。
1 | class Solution { |
闲来没事苟着,顺手读读之前买的已经落灰的书《Docker实战》。
1、daemon
(守护进程),运行中的 docker
由守护进程(服务端)和客户端组成(通过unix域间套接字通信),比如说,执行:docker ps -a
命令,是客户端将命令传送给守护进程,由守护进程发送对应的响应给前端,前端解析并显示。可以通过如下操作查看docker
守护进程和客户端的通信过程:1
2
3
4sudo socat -v UNIX-LISTEN:/tmp/dockerapi.sock UNIX-CONNECT:/var/run/docker.sock
## 其中 socat 是 netcat(nc) 命令的升级版,-v 参数有助于人阅读 address1 address2 可以是 tcp、udp或 socket等
docker -H unix:///tmp/dockerapi.sock ps -a
## -H 参数指定 docker daemon socket(s) to connect to.
模拟题1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33class Solution {
public:
string simplifyPath(string path) {
for(int i=1; i<path.length(); i++){
if(path[i-1]=='/' && path[i]=='/')
path.erase(i--,1);
}
if(path[path.length()-1]=='/')
path.erase(path.length()-1);
vector<string> fenduan;
int pos = 0, index;
while(pos>=0 && pos<path.length()){
index = path.find('/', pos+1);
fenduan.push_back(path.substr(pos, index-pos));
pos = index;
}
string ans = "";
for(auto i : fenduan){
if(i=="/.")
continue;
else if(i=="/.."){
index = ans.find_last_of('/');
if(index>=0 && index<ans.size())
ans.erase(index);
}
else
ans += i;
}
if(ans.size()==0)
ans = "/";
return ans;
}
};