多态: 定义:一个对象变量(对象引用)可以指向多个实际类型的现象称为多态。
例如:父类引用指向子类对象,父类引用可以指向父类对象。但是子类引用不能指向父类对象 对象引用调用的方法究竟属于哪一个对象(实际类型)是在运行期间动态确定的,这称为动态绑定。
当父类引用指向子类对象。如果子类重写了父类的方法,真正执行的是子类覆盖的方法,如果子类没有覆盖父类的方法,执行的是父类的方法。 例:
son的实际类型是Son,它是Father的子类。如果Son定义了方法(重写)method1,则调用Son中的method1,否则调用Father中的method1。这是在运行期间动态决定的。
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 public class test01 { public static void main(String[] args) { Son son=new Son(); son.method1(); } } class Father{ public void method1(){ System.
参考
假设我们要计算一个函数:$f(n)=n*f(n-1)$
递归三要素 递归的定义:接受什么参数,返回什么值,代表什么意思 。当函数直接或者间接调⽤⾃⼰时,则发⽣了递归
递归的拆解:每次递归都是为了让问题规模变⼩
**递归的出⼝:**必须有⼀个明确的结束条件。因为递归就是有“递”有“归”,所以必须又有一个明确的点,到了这个点,就不用“递下去”,而是开始“归来”。
1 2 return表示开始返回,即“归” 递归的结束条件十分的重要,在Java中即return回来的的条件 我调用了这个函数,函数需要给我返回一个值,而这个值又取决于我这个函数,只不过函数的变量发生了变化
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 /* * 请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。 * https://leetcode-cn.com/problems/dui-cheng-de-er-cha-shu-lcof/ * * 思路: * 对于两个对称的结点 * 如果L.value==R.value &&L.left.value==R.right.value && L.right.value==R.left.value * * 算法流程: * 如果root==null ,直接返回true * 否则调用recur(root.left,root.right) * * recur中的逻辑: * 递归终止条件:如果L.
参考
虚拟机与Java虚拟机 虚拟机 所谓虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。
大名鼎鼎的Visual Box,Mware就属于系统虚拟机,它们完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台。 程序虚拟机的典型代表就是Java虚拟机,它专门为执行单个计算机程序而设计,在Java虚拟机中执行的指令我们称为Java字节码指令。 无论是系统虚拟机还是程序虚拟机,在上面运行的软件都被限制于虚拟机提供的资源中。
Java虚拟机 Java虚拟机是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成。
JVM平台的各种语言可以共享Java虚拟机带来的跨平台性、优秀的垃圾回器,以及可靠的即时编译器。
Java技术的核心就是Java虚拟机(JVM,Java Virtual Machine),因为所有的Java程序都运行在Java虚拟机内部。
Java虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。每一条Java指令,Java虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪里。
特点:
一次编译,到处运行 自动内存管理 自动垃圾回收功能 JVM的位置 JVM是运行在操作系统之上的,它与硬件没有直接的交互
Java的体系结构 java代码执行流程 JVM内存区域 Java虚拟机所管理的内存包括以下几个运行时数据区
程序计数器 当前线程所执行的字节码的行号指示器,每条线程都有一个独立的程序计数器。如果一个线程正在执行一个Java方法,则计数器记录的是字节码的指令的地址,如果执行的一个Native方法,则计数器的记录为空。此内存区域是唯一一个没有规定任何OutOfMemoryError的区域。
虚拟机栈 虚拟机栈描述的是Java方法执行的线程内存模型: 每个方法被执行的时候, Java虚拟机都会同步创建一个栈帧,用于存储局部变量表、 操作数栈、 动态连接、 方法出口等信息。 方法的执行过程就是栈帧在JVM中出栈和入栈的过程。
方法只有在调用的时候才会在栈中分配空间,并且调用时是在压栈,方法执行结束后,该方法所需要的空间就会被释放了。
栈帧(Frame)是用来存储数据和部分过程结果的数据结构,同时也被用来处理动态链接(Dynamic Linking)、方法返回值和异常分派(Dispatch Exception)。
局部变量表中存放的是各种基本数据类型,如boolean、byte、char、等8种,及引用类型(存放的是指向各个对象的内存地址),因此,它有一个特点:内存空间可以在编译期间就确定,运行期不在改变。
对于虚拟机栈这个内存区域规定了两种异常情况;如果线程请求的栈的深度大于虚拟机所允许的区域,将抛出StackOverflowError。
如果java虚拟机栈的容量可以动态拓展,当栈拓展时无法申请到足够的内存会抛出OutOfMenoryError
栈不会有垃圾回收
本地方法栈 与虚拟机栈所发挥的作用是非常相似的,其区别只是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务, 而本地方法栈则是为虚拟机使用到的本地方法服务。
堆 Java堆是虚拟机所管理的内存中最大的一块。 Java堆是被所有线程共享的一块内存区域, 在虚拟机启动时创建。 此内存区域的唯一目的就是存放对象实例, Java世界里“几乎”所有的对象实例都在这里分配内存。 Java堆是垃圾收集器管理的内存区域, 因此一些资料中它也被称作“GC堆”。
由于现代 JVM 采用分代收集算法, 因此 Java 堆从 GC 的角度还可以细分为: 新生代(Eden 区、 From Survivor 区和 To Survivor 区)和老年代。
2020-11-15创建了我的个人博客,并上传了之前做的一些笔记。
希望能够养成坚持做笔记,坚持更新博客的习惯。
最重要的是始终坚持独立思考,每天进步一点点!
本文是基于ubuntu16.04进行搭建 注意:本文是基于ubuntu16.04进行搭建
下载安装hugo 1 2 下载地址:https://github.com/gohugoio/hugo/releases/download/v0.56.0/hugo_0.56.0_Linux-64bit.deb 安装:sudo dpkg -i hugo_0.56.0_Linux-64bit.deb 注意如果直接使用
1 sudo apt install hugo 进行安装,安装的版本可能过低,导致一些主题不能够使用。要尽可能下载新版本!
安装完成后可以使用
1 hugo version 来检查是否安装成功。
生成站点 1 hugo new site /path /path站点表示路径,我这里设为了‘myblog’ , myblog中的结构
archetypes config.toml content data layouts static themes 创建文章 1 hugo new post/about.md 这是会在content/post文件夹下生成一个about.md文件
安装皮肤 1 2 cd theme //将下载的主题文件夹存放在这里 hugo提供的皮肤可以在这里找到
参考:
参考1
参考2
该文章基于GAN设计风格迁移模型。该模型能够自动学习,无监督的分离高层属性(例如 pose,identity)以及能对生成图像进行随机变化(例如雀斑,头发)并且 能够对生成图像的分辨率进行控制。
StyleGAN中的style借用自图像风格迁移,这篇文章是PG-GAN之后的,主要改变了生成器的结构实现无监督地生成可控性强的图像。
PG-GAN中是通过一层层地给生成器和判别器增添卷积层同时提高分辨率的方法来生成高质量图像的。StyleGAN的motivation就是发现这种渐进的方法其实能控制图像的不同特性,低分辨率也就是coarse层主要影响图像的姿态,脸型等高级特征,高分辨率主要影响背景发色等低级特征(结合感受野的概念理解,低分辨率的特征获取更多全局信息并加以处理,比如特征从线条经过多次卷积一步步会组合出形状,会更加抽象,具有更高级的语义信息)。但PG-GAN这种结构在递进添加层的时候没有任何控制条件,导致整体的特征和细微的特征间存在耦合,耦合就导致了图像可控性差,没办法对单个特征进行调节。StyleGAN于是寻找了一种无监督但又可控性强的方法:对不同level的卷积层进行操作。
ProGAN的网络框架:
在之前的传统的生成网络中,有一个问题存在,就是特征耦合,那么这个是什么呢?如上图左边,传统的生成网络,我们可以看到,其输入一个latent Z
Z,一般为512的一个向量。假设这个向量代表一个人的脸,那么该向量就会存在特征耦合。因为一个脸是有很多特征的,并不是一个512维的向量就能完全表示的,如果非要表示,只能是这种方式,如下:
假设:维度1代表头发粗细,维度2代表皮肤颜色,维度3代表鼻子大小…,当512个维度全部是用完之后,其只能通过多个维度再去表示其他的特征,如:维度1与维度2综合起来表示了头发的颜色。这样,通过两个或者多个组合,512的向量,就能表示出接近无数的特征。
但是这样就很明显出现了一个问题,那就是我们怎么去控制我们想要图片的单个特征呢?如,我只想改变头发的粗细,但是又不能直接去修改第一个维度,因为第一个维度会影响其他的维度,可能会影响到皮肤的颜色,但是有的时候,我偏偏需要该表他头发的颜色,不修改皮肤的颜色。不同的特征是互相关联的(特征耦合)。
1 Introduction GAN能够生成高分辨率和高质量的图像,但是生成器仍然被视为一个黑箱子。尽管最近已经有了一些工作,但是对图像生成过程中变化因素的理解,例如随机特征的起源,仍然是缺乏的。latent space的性质也没有很好的被理解。
该文设计了一个能够设计了一个能够控制生成过程的生成器模型。生成器的输入为一个learned constant,根据latent code在每一个卷积层调整图像的style,从而直接控制不同尺度下图像特征的强度。通过将noise直接送入网络中,来实现从随机变化()中进行高层属性()的自动、无监督分离,并实现直观的特定尺度的混合和插值操作。
生成器首先将input latent code映射到intermediate latent space,这对于factors of variation在网络中是如何表达到有很重要的影响。input latent code的分布(input latent space)是符合training data的概率密度的,这会导致某种程度上信息的耦合。而intermediate latent space是没有这一限制的,因此可以进行信息的解耦。该文提出了两种新的评估latent space解耦程度的方法:感知路径长度和线性可分离性。该文的方法具有更高的线性度和更少的耦合度。
并且提出了了一个新的dataset of human faces(Flickr-Faces-HQ, FFHQ)。
2 style-based generator 传统的方法是将input code通过input layer送入生成器。该文抛弃了这个设计,完全忽略了输入层,而是从一个learned constant开始。给定latent space $\mathcal{Z}$ 中的一个latent code $z$,非线性映射网络 $f:\mathcal{Z \rightarrow W }$, 将$z$映射为$w$:$w=f(z)$.其中$f$ 为8层的MLP。随后将$w$变换为styles:$y=(y_s,y_b)$来作为AdaIN的仿射参数: $$ AdaIN(x_i,y)=y_{(s,i)}{\large(}\frac{x_i-\mu(x_i)}{\sigma(x_i)}{\large)}+y_{(b,i)} $$
$$ z\rightarrow w \rightarrow y (仿射参数)\rightarrow style\