Keras中关于模型的trainable状态的问题
提出问题在看GAN的实现代码的时候,发现了这么一个地方: 123456789101112131415161718192021222324252627282930313233class GAN(): def __init__(self): self.img_rows = 28 self.img_cols = 28 self.channels = 1 self.img_shape = (self.img_rows, self.img_cols, self.channels) self.latent_dim = 100 optimizer = Adam(0.0002, 0.5) # Build and compile the discriminator self.discriminator = self.build_discriminator() ...
CDCGAN
和CGAN一样,只是采用了卷积层替换全连接层的方法来搭建生成器和判别器的网络 导入所需函数12345678910import tensorflow as tffrom tensorflow import kerasfrom tensorflow.keras import layersfrom tensorflow.keras.layers import Input,multiply,Flatten,Embeddingfrom tensorflow.keras.models import Modelimport matplotlib.pyplot as pltimport numpy as npimport globimport osfrom tensorflow.keras.utils import to_categorical 准备数据1(train_images,train_labels),(_,_)=tf.keras.datasets.mnist.load_data() 1train_images.shape (60000, 28,...
CGAN
什么是CGAN所谓CGAN,就是在GAN的基础上,多施加了一些条件信息,比如图像的标签等,使得生成器可以按照我们指定的标签去生成所对应的图像。 普通GAN的目标函数为: 而CGAN的目标函数为: CGAN的网络结构如下: 如何构建CGAN本文在普通GAN(全连接层搭建)的基础上,将生成器的输入由“噪声”改为“噪声+对应该批次图像的真实标签”,将判别器的输入由”图像”改为”图像+对应该批次图像的真实标签”,最后在测试生成器的生成能力时,人为构建了0到9这10个数字作为标签(因为训练数据是mnist数据集),和随机噪声一起喂入生成器以产生新的图片。 Tensorflow2.0 实现CGAN导入所需函数12345678910import tensorflow as tffrom tensorflow import kerasfrom tensorflow.keras import layersfrom tensorflow.keras.layers import Input,multiply,Flatten,Embeddingfrom...
tf.keras.layers.Embedding
函数原型1tf.keras.layers.Embedding(input_dim, output_dim, embeddings_initializer='uniform', embeddings_regularizer=None, activity_regularizer=None, embeddings_constraint=None, mask_zero=False, input_length=None, **kwargs) 举个图像数据的例子这里的input_shape是(10),output_shape是np.prod((28, 28, 1)) 1234567from tensorflow.keras.layers import multiply,Flatten,Embeddingimg=tf.ones((2,28,28,1))#两张图片label=np.array([1,2])#两个标签label_embedding = Flatten()(Embedding(10, np.prod((28, 28,...
FrechetInceptionDistance
什么是FIDFréchet Inception Distance (FID) 度量了真实图片和生成图片在 feature 层面的距离 FID越小,则图像多样性越好,质量也越好 众所周知,预训练好的神经网络顶层可以提取图片的高级信息,一定程度能反映图片的本质。因此,FID 的提出者通过预训练的 Inception V3 来提取全连接层之前的 2048 维向量,作为图片的特征。 具体的做法是:去掉最后的输出层( 最后一层是一个pooling层,原来的网络通过该pooling层可以输出一张图像的类别 ),然后得到一个2048维的高层特征,这个高层特征是一个长向量形式。 FID的计算公式如下: 在这里,将每一张图片输入分类器中,都会得到一个2048维的长向量,对所有图片得到的长向量求平均值,求协方差矩阵,就得到了公式中的四个部分的值。 FID 只把 Inception V3 作为特征提取器,并不依赖它判断图片的具体类别,因此不必担心 Inception V3...
InceptionScore
IS使用两个标准来衡量GAN的性能: The quality of the generated images, and their diversity. 熵可以看作是对随机性的度量。如果随机变量x的值是高度可预测的,则其熵较低。相反,如果它是高度不可预测的,那么熵就很高。例如,在下图中,我们有两个概率分布p(x)。p2具有比p1更高的熵,因为p2具有更均匀的分布,所以更难以预测x。 质量在GAN中,我们希望条件概率P(y | x)具有高度可预测性(低熵),比如红色线表示的分布。 (Images that are classified strongly as one class over all other classes indicate a high quality. As such, the conditional probability of all generated images in the collection should have a low entropy....
WGAN
网络结构在基础GAN或DCGAN(本文)的基础上,使用推土机距离衡量真实样本分布与生成样本分布之间的距离,此时,即使两个分布没有重合部分(这经常发生,容易导致梯度突变),也能准确的衡量分布的差异。 从上图可以看出,WGAN的梯度永远不会为0,而普通GAN会出现梯度为0的情况。 根据 可以确定判别器和生成器的损失为: 其中,1-Lipscgitz是指$||f(x_1)-f(x_2)||\le1*||x_1-x_2||$ 也就是导数要≤1 这一点,可以通过对权值进行clip的方式,使得权值固定在某个区间内,从而也使得导数固定在某一区间内(比如≤1) 下面的代码在DCGAN的基础上,修改了判别器和生成器的损失函数,并在每次权值更新后做了权值裁剪,其余未变。 导入相关函数12345import tensorflow as tffrom tensorflow import kerasfrom tensorflow.keras import layersimport matplotlib.pyplot as pltimport numpy as...
LSGAN
网络结构在DCGAN(本文)或者普通GAN的基础上,将交叉熵损失改为均方误差损失,就得到了LSGAN LSGAN是对之前两种GAN的优化,因为当生成器生成的数据分布$P_G$与数据的真实分布$P_{data}$不重叠时,JS散度永远都是log2,从而导致生成器难以更新,见下图 导入相关函数12345import tensorflow as tffrom tensorflow import kerasfrom tensorflow.keras import layersimport matplotlib.pyplot as pltimport numpy as np 准备数据1(train_images,_),(_,_)=tf.keras.datasets.mnist.load_data() 1train_images.shape (60000, 28,...
DCGAN
网络结构同普通GAN ,只是将生成器与判别器网络中的Dense层换为了卷积层与转置卷积层,故整体代码只需改动生成器和判别器的网络搭建函数即可。 导入相关函数12345import tensorflow as tffrom tensorflow import kerasfrom tensorflow.keras import layersimport matplotlib.pyplot as pltimport numpy as np 准备数据1(train_images,_),(_,_)=tf.keras.datasets.mnist.load_data() 1train_images.shape (60000, 28,...
基础GAN
网络结构 导入相关函数12345import tensorflow as tffrom tensorflow import kerasfrom tensorflow.keras import layersimport matplotlib.pyplot as pltimport numpy as np 准备数据1(train_images,_),(_,_)=tf.keras.datasets.mnist.load_data() 1train_images.shape (60000, 28, 28) 1train_images.dtype dtype('uint8') 1train_images=train_images.reshape(train_images.shape[0],28,28,1).astype('float32') 1train_images.shape (60000, 28, 28,...













