首页 > 编程知识 正文

图神经网络gnn入门,geohash算法

时间:2023-05-05 18:07:37 阅读:26674 作者:2279

从奋斗圈的方式理解GAN网络(生成对抗网络),可以看作是假的机器。 做的和真的一样。 以下,对假货的制作方法进行说明。 ()主要是GAN码,代码很简单。 )

先做小狗的假照片吧。

首先需要一个生成小狗照片的模型。 这被称为生成器。 也有判断小狗照片真伪的判断模型discrimator。

首先输入1000维的噪声,发送给生成器。 生成器的具体结构如下。 (不看也可以,看完全篇回去再看也一样。 )

其实比较简单,代码如下。

efgenerator _ model (: model=sequential ) model.add ) dense(input_dim=1000, output_dim=1024 () model.add (活动(' tanh ' ) model.add ) dense(128*8*8) ) ) ) ) model padding='same ' ) (model.add(activation ) tanh ) (model.add ) upsampling2d ) size=(2, 2 ) ) ) ) model.add ) ) size652 padding='same ' ) (model.add ) activation ) )返回模型生成器为1000 输出是照片。 没有必要想得太深。 输入是1000的随机数字,输出是一张图像。

看看判别器代码和结构吧。

代码如下。

def discriminator _ model (: model=sequential ) model.add (conv 2d ) 64,) 5,5 ),padding='same ',input ) ) 3 ) ) model.add (活动(tanh ) ) model.add (max pooling 2d ) pool_size=) 2, 2 ) ) ) ) model.add ) conv2d 5) ) model.add(activation(tanh ) ) model.add (max pooling 2d ) pool_size=) 2

根据代码说明具体操作

把真图和假图。 进行拼接,打上标签。 真图标签为1,假图标签为0,发送到训练网络。

#随机生成的1000维噪声noise=NP.random.uniform (-1,1,size=(batch_size,1000 ) ) # X_train是训练的图像数据。 这里提取batchsize的图像用于训练,这是照片(64张) image _ batch=x _ train (索引* batch_size: ) index1) batch_size )这里是生成器生成的伪图generated _ image。verbose=0) #连接真图和伪图的x=NP.conne 标签为0y=[1] * batch _ size [0] * batch _ size #将真图和伪图拼接训练数据1发送到判别器进行训练判别器的精度d _ loss=discriminator _ motion

在这里训练的话,判别器的精度会不断提高。

方法如下,是GAN网络的中心。

def generator _ containing _ discriminator (g,d ) : mo

del = Sequential() model.add(g) # 判别器参数不进行修改 d.trainable = False model.add(d) return model

他的网络结构如下所示:

这个模型有生成器与判别器组成:看代码,这个模型上半部分是生成网络,下半部分是判别网络,生成网络首先生成假图,然后送入判别网络中进行判断,这里有一个d.trainable=False,意思是,只调整生成器,判别的的参数不做更改。简直巧妙。

 

然后我们来看如何训练生成网络,这一块也是核心区域:

# 训练一个batchsize里面的数据 for index in range(int(X_train.shape[0]/BATCH_SIZE)): # 产生随机噪声 noise = np.random.uniform(-1, 1, size=(BATCH_SIZE, 1000)) # 这里面都是真图片 image_batch = X_train[index*BATCH_SIZE:(index+1)*BATCH_SIZE] # 这里产生假图片 generated_images = g.predict(noise, verbose=0) # 将真图片与假图片拼接在一起 X = np.concatenate((image_batch, generated_images)) # 前64张图片标签为1,即真图,后64张照片为假图 y = [1] * BATCH_SIZE + [0] * BATCH_SIZE # 对于判别器进行训练,不断提高判别器的识别精度 d_loss = d.train_on_batch(X, y) # 再次产生随机噪声 noise = np.random.uniform(-1, 1, (BATCH_SIZE, 1000)) # 设置判别器的参数不可调整 d.trainable = False # ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××× # 在此我们送入噪声,并认为这些噪声是真实的标签 g_loss = generator_containing_discriminator.train_on_batch(noise, [1] * BATCH_SIZE) # ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××× # 此时设置判别器可以被训练,参数可以被修改 d.trainable = True # 打印损失值 print("batch %d d_loss : %s, g_loss : %f" % (index, d_loss, g_loss))

重点在于这句代码

g_loss = generator_containing_discriminator.train_on_batch(noise, [1] * BATCH_SIZE)

首先这个网络模型(定义在上面),先传入生成器中,然后生成器生成图片之后,把图片传入判别器中,标签此刻传入的是1,真实的图片,但实际上是假图,此刻判别器就会判断为假图,然后模型就会不断调整生成器参数,此刻的判别器的参数被设置为为不可调整,d.trainable=False,所以为了不断降低loss值,模型就会一直调整生成器的参数,直到判别器认为这是真图。此刻判别器与生成器达到了一个平衡。也就是说生成器产生的假图,判别器已经分辨不出来了。所以继续迭代,提高判别器精度,如此往复循环,直到生成连人都辨别不了的图片。

最后我训练了大概65轮,实际上生成比较真实的狗的图片我估计可能上千轮了,当然不同的网络结构,所需要的迭代次数也不一样。我这个因为太费时间,就跑了大概,可以看出大概有个狗模样。这个是训练了65轮之后的效果:

以上就是全部的内容了。

https://github.com/jensleeGit/Kaggle_self_use/tree/master/Generative%20Dog%20Images

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。