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;
}
};