日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

现代黑科技版“指鹿为马:使用CycleGAN实现男女“无痛变性”

發布時間:2023/12/20 编程问答 69 豆豆
生活随笔 收集整理的這篇文章主要介紹了 现代黑科技版“指鹿为马:使用CycleGAN实现男女“无痛变性” 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在秦朝末期,奸臣趙高一手遮天,為了顯示自己的權勢與力量,他在眾人面前指著一頭鹿說那是馬,大家畏懼趙高的權勢,明知那是鹿卻不得不配合趙高說那是馬,這就是經典成語”指鹿為馬“的出處。

在光天化日之下,罔顧事實強行將A說成B,除非你有權有勢,別人都依附于你,你才有可能做得到,要不然大家都會認為你傻逼。例如像我這樣的平頭百姓在大街上指著一個五大三粗,滿臉胡渣子的大男人說那是個窈窕大美女,你會不會覺得我傻逼呢?在現代人工智能技術的加持下,我還真有指鹿為馬,指男為女的”超能力“。

本節我們介紹一種功能強大的對抗性網絡叫CycleGAN,它的特點是能將物體A平和的轉變為物體B,例如下圖就是CycleGAN的功能實現:

從上圖可以看到,訓練好的網絡能將馬變成斑馬,將蘋果與橘子互換,當然我們要實現更強大的功能,那就是男人與女人互換。CycleGAN的實現比前面介紹的對抗性網絡在結構和算法上要復雜很多,首先它有兩個生成者網絡和鑒別者網絡,因為我們想把物體A變成B,那么網絡必須有識別和生成物體A和B的能力,因此CycleGAN要使用一組生成者和鑒別者網絡來識別和生成物體A,使用第二組生成者和鑒別者網絡識別和生成物體B,這點跟我們前面描述的對抗性網絡一樣,因此CycleGAN有如下結構特點:

不同之處在于兩組網絡要把自己掌握的信息與對方溝通,這樣兩組網絡能共同掌握物體A和B的特性,這也是Cycle的由來。接下來是CycleGAN的算法關鍵所在,如下圖所示:

從上圖可見,兩個生成者網絡互相交互形成一個循環。由于第一個生成者網絡Generator_AB用于接收圖片A然后產出圖片B,第二個生成者網絡Generator_BA接收圖片B然后生成圖片A,如果第一個網絡生成的圖片B質量足夠好,那么將它偽造的圖片B輸出給第二個生成者網絡,后者生偽造的圖片A就應該能獲得好質量,因此判斷第一個網絡生成結果好壞的標準之一就是將它生成的結果用于第二個網絡,看看后者能不能得到好結果,因此這就形成一個循環。

同理第二個生成者網絡接收圖片B后偽造圖片A,如果它偽裝出A的質量足夠好,那么將它偽裝的結果輸入到第一個生成者網絡,后者偽裝出的圖片B質量就應該足夠好,于是這又形成一個循環。

這種循環訓練的好處在于兩個生成者網絡能使用各自對相應圖片的識別能力去訓練另一個網絡。例如一開始算法使用大量真實圖片A來訓練Generator_AB,于是它就掌握了物體A的內在特征,當Generator_BA將其偽裝的圖片A輸入到Generator_AB,如此就形成了一條輸入鏈,信息由Generator_BA—>Generator_AB,在訓練時信息會反向傳導變成Generator_AB->Generator_BA,于是前者就把自己對物體A特征的掌握和識別傳導給后者,這樣后者就能改進自己的構造能力,提升它偽造的圖片質量,同理算法也可以形成Generator_AB—>Generator_BA的閉環,讓后者偽裝的圖片A質量越來越好。

網絡還有第二個循環,那就是對于接收圖片B偽裝圖片A的生成者網絡Generator_BA而言,算法要讓它接收圖片A,然后偽造的圖片A質量也要足夠好,其過程如下圖所示:

該循環訓練流程本質上是讓網絡Generator_AB和Generator_BA也學會識別圖片A和B的特征,這樣才有利于網絡去提升他們偽造的圖片質量。接下來我們看看算法代碼的部分實現,首先是對訓練數據的加載:

celeba_train = tfds.load(name="celeb_a", data_dir = '/content/drive/My Drive/tfds_celeba',split="train") #data_dir指向數據存儲路徑 celeba_test = tfds.load(name="celeb_a", data_dir = '/content/drive/My Drive/tfds_celeba',split="test") assert isinstance(celeba_train, tf.data.Dataset) import matplotlib.pyplot as plt for data in celeba_train.take(1): #利用take接口獲取數據print(data) #數據其實是Dict對象,它包含了數據的所有相關屬性print(data["attributes"]["Male"])plt.imshow(data['image'])

首先我們使用Tensorflow提供的數據集接口加載Celeba人臉圖像數據,然后將圖片分為男女兩個類別,上面代碼運行后所得結果如下:

接下來我們看看Generator網絡的代碼實現:

class Generator(tf.keras.Model):def __init__(self):super(Generator, self).__init__()self.downsample_layers = []self.upsample_layers = []self.last_layers = []self.resnet_block_layers = []self.channels = 3self.resnet_block_count = 9self.build_self()def build_self(self):self.down_sample(filters = 64, kernel_size = 7, strides = 1) self.down_sample(filters = 128, kernel_size = 3)self.down_sample(filters = 256, kernel_size = 3)for i in range(self.resnet_block_count):self.resnet_block()self.up_sample(filters = 128, kernel_size = 3) #構造U網絡右邊網絡層self.up_sample(filters = 64, kernel_size = 3)self.last_layers.append(tf.keras.layers.Conv2D(filters = self.channels, kernel_size = 7, strides = 1,padding = 'same', activation = 'tanh'))def down_sample(self, filters, kernel_size = 4, strides = 2): #構造U型網絡的左邊down_sample_layers = []down_sample_layers.append(tf.keras.layers.Conv2D(filters = filters, kernel_size = kernel_size,strides = strides, padding = 'same'))down_sample_layers.append(tfa.layers.InstanceNormalization(axis = -1, center = False, scale = False))down_sample_layers.append(tf.keras.layers.ReLU())self.downsample_layers.append(down_sample_layers)def up_sample(self, filters, kernel_size = 4, strides = 2):up_sample_layers = []up_sample_layers.append(tf.keras.layers.Conv2DTranspose(filters = filters, kernel_size = kernel_size,strides = strides, padding = 'same'))up_sample_layers.append(tfa.layers.InstanceNormalization(axis = -1,center = False,scale = False))up_sample_layers.append(tf.keras.layers.ReLU())self.upsample_layers.append(up_sample_layers)def resnet_block(self):renset_block_layers = []renset_block_layers.append(tf.keras.layers.Conv2D(filters = 256, kernel_size = 3,strides = 1, padding = 'same'))renset_block_layers.append(tfa.layers.InstanceNormalization(axis = -1,center = False,scale = False))renset_block_layers.append(tf.keras.layers.ReLU())renset_block_layers.append(tf.keras.layers.Conv2D(filters = 256, kernel_size = 3,strides = 1, padding = 'same'))renset_block_layers.append(tfa.layers.InstanceNormalization(axis = -1,center = False,scale = False))self.resnet_block_layers.append(renset_block_layers)def call(self, x):x = tf.convert_to_tensor(x, dtype = tf.float32)left_layer_results = []for layers in self.downsample_layers:for layer in layers:x = layer(x)last_layer = xfor layers in self.resnet_block_layers:for layer in layers:#實現殘余網絡層x = layer(x)x = tf.keras.layers.add([last_layer, x])last_layer = xfor layers in self.upsample_layers:for layer in layers:x = layer(x)for layer in self.last_layers:x = layer(x)return xdef create_variables(self, x): #實例化網絡層參數x = np.expand_dims(x, axis = 0)self.call(x)

該網絡使用了一種叫ResNet的結構,其具體原理請參看我的視頻講解,最后我們給出網絡的訓練流程代碼實現:

def train_discriminators(self, imgs_A, imgs_B, valid, fake):'''訓練discriminator_A識別來自數據集A的圖片以及generator_BA偽造的圖片,訓練discriminoatr_B識別來自數據集B的圖片以及generator_AB偽造的圖片訓練的方法是將圖片分成64等分,真實數據每一等分賦值1,偽造數據每一等分賦值0,disriminator接收真實數據后輸出每一等分的概率要盡可能接近1,接收偽造數據時輸出每一等分的概率要接近0,valid和fake是規格為(64,64)的二維數組,元素分別為1和0'''fake_B = self.generator_AB(imgs_A, training = True)#將來自數據集A的圖片偽造成數據集B的圖片fake_A = self.generator_BA(imgs_B, training = True)#將來自數據集B的圖片偽造成數據集A的圖片loss_obj = tf.keras.losses.MSEwith tf.GradientTape(watch_accessed_variables=False) as tape: #訓練discriminator_A識別真實圖片tape.watch(self.discriminator_A.trainable_variables)d_A = self.discriminator_A(imgs_A, training = True)A_valid_loss = loss_obj(tf.ones_like(d_A), d_A)fake_d_A = self.discriminator_A(fake_A, training = True) A_fake_loss = loss_obj(tf.zeros_like(fake_d_A), fake_d_A)total_loss = (A_fake_loss + A_valid_loss) * 0.5grads = tape.gradient(total_loss, self.discriminator_A.trainable_variables)self.discriminator_A_optimizer.apply_gradients(zip(grads, self.discriminator_A.trainable_variables))with tf.GradientTape(watch_accessed_variables=False) as tape:#訓練dicriminator_B識別真實圖片tape.watch(self.discriminator_B.trainable_variables)d_B = self.discriminator_B(imgs_B, training = True)B_valid_loss = loss_obj(tf.ones_like(d_B), d_B)fake_d_B = self.discriminator_B(fake_B, training = True)B_fake_loss = loss_obj(tf.zeros_like(fake_d_B), fake_d_B)total_loss = (B_valid_loss + B_fake_loss) * 0.5grads = tape.gradient(total_loss, self.discriminator_B.trainable_variables)self.discriminator_B_optimizer.apply_gradients(zip(grads, self.discriminator_B.trainable_variables))def train_generators(self, imgs_A, imgs_B, valid):'''generator的訓練要滿足三個層次,1,generator生成的偽造圖片要盡可能通過discrimator的識別;2,先由generator_A將來自數據集A的圖片偽造成數據集B的圖片,然后再將其輸入generator_B,所還原的圖片要與來自數據集A的圖片盡可能相似;3,將來自數據集B的圖片輸入generator_AB后所得結果要與數據集B的圖片盡可能相同,將來自數據集A的圖片輸入generator_BA后所得結果要盡可能與來自數據集A的數據相同'''loss_obj = tf.keras.losses.MSEwith tf.GradientTape(watch_accessed_variables=False) as tape_A,tf.GradientTape(watch_accessed_variables=False) as tape_B:tape_A.watch(self.generator_AB.trainable_variables)tape_B.watch(self.generator_BA.trainable_variables)fake_B = self.generator_AB(imgs_A, training = True) d_B = self.discriminator_B(fake_B, training = True)fake_B_loss = loss_obj(tf.ones_like(d_B), d_B)fake_A = self.generator_BA(imgs_B, training = True)d_A = self.discriminator_A(fake_A, training = True)fake_A_loss = loss_obj(tf.ones_like(d_A), d_A)#這段對應圖17-15所示的運算流程reconstructB = self.generator_AB(fake_A, training = True)#B->A->Breconstruct_B_loss = tf.reduce_mean(tf.abs(reconstructB - imgs_B))reconstructA = self.generator_BA(fake_B, training = True)#A->B->Areconstruct_A_loss = tf.reduce_mean(tf.abs(reconstructA - imgs_A))cycle_loss_BAB = self.reconstruction_weight * reconstruct_B_loss cycle_loss_ABA = self.reconstruction_weight * reconstruct_A_losstotal_cycle_loss = cycle_loss_BAB + cycle_loss_ABA#這里對應圖17-16所示的運算流程img_B_id = self.generator_AB(imgs_B, training = True) #B->Bimg_B_identity_loss = tf.reduce_mean(tf.abs(img_B_id - imgs_B))img_A_id = self.generator_BA(imgs_A, training = True) #A->Aimg_A_identity_loss = tf.reduce_mean(tf.abs(img_A_id - imgs_A))#這段對應圖17-17所示運算流程generator_AB_loss = self.validation_weight * fake_B_loss + total_cycle_loss + self.identification_weight * img_B_identity_lossgernator_BA_loss = self.validation_weight * fake_A_loss + total_cycle_loss + self.identification_weight * img_A_identity_lossgrads_AB = tape_A.gradient(generator_AB_loss, self.generator_AB.trainable_variables)grads_BA = tape_B.gradient(gernator_BA_loss, self.generator_BA.trainable_variables)self.generator_AB_optimizer.apply_gradients(zip(grads_AB, self.generator_AB.trainable_variables))self.generator_BA_optimizer.apply_gradients(zip(grads_BA, self.generator_BA.trainable_variables))def train(self, data_loader, run_folder, epochs, test_A_file, test_B_file, batch_size = 1, sample_interval = 100):dummy = np.zeros((batch_size, self.patch, self.patch, 1))valid = tf.ones_like(dummy, dtype = tf.float32)fake = tf.zeros_like(dummy, dtype = tf.float32)for epoch in range(epochs):start = time.time()self.epoch = epochbatch_count = 0for batch_i, (imgs_A, imgs_B) in enumerate(data_loader.load_batch()):self.train_discriminators(imgs_A, imgs_B, valid, fake)self.train_generators(imgs_A, imgs_B, valid)if batch_i % sample_interval == 0:self.save_model(run_folder) #存儲網絡內部參數display.clear_output(wait=True)info = "[Epoch {}/{}/ batch {}]".format(self.epoch, epochs, batch_count)batch_count += 1self.sample_images(data_loader, batch_i, run_folder, test_A_file, test_B_file, info) #顯示訓練效果

由于篇幅原因,筆者沒有將所有實現細節的代碼都貼出來,感興趣的讀者請參看我的教學課程。

代碼運行后會將大量的男女圖片輸入兩個網絡,于是能讓網絡具備將男人轉換為女人,女人轉換為男人的能力,我們先看網絡將男人變成女人的能力:

其中左邊是男性圖片,右邊是”變性“后的女性圖片,比較發現女性特征是臉部表情更柔和,更具有女性的柔軟,我們再看看將女性變成男性的結果:

上圖效果就更加明顯,可以看到的是右邊男性面孔臉部輪廓曲線與左邊女性基本相同,男性臉部特征就在于皮膚比較粗糙,同時線條比較粗狂和硬朗,從顯示結果看,網絡具備了將男變女,女變男的超能力。

更詳細的講解和完整代碼調試演示過程,請點擊鏈接

更多技術信息,包括操作系統,編譯器,面試算法,機器學習,人工智能,請關照我的公眾號:

總結

以上是生活随笔為你收集整理的现代黑科技版“指鹿为马:使用CycleGAN实现男女“无痛变性”的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: caoporn超碰97 | 国产91热爆ts人妖系列 | 国产精品日日做人人爱 | 国产精品入口a级 | 中文字幕一区二区三区在线视频 | 亚洲 欧美 变态 另类 综合 | 欧美在线精品一区二区三区 | 国产乱码久久久久久 | 色九九视频 | 好看的av网址 | 色播基地| 日韩爱爱视频 | 国产精品久久久久久一区二区三区 | www日本xxx| xxxx视频在线| av手机观看| 欧美一二三区在线观看 | 亚洲视频在线观看网站 | 不卡av在线| av噜噜在线 | www.日韩精品 | 久久888| 国产伦精品一区二区三 | 91国内精品久久久久 | 波多野结衣中文字幕在线播放 | 大奶一区| 国产精品成人在线观看 | 精品在线视频一区二区 | 成人免费a级片 | 手机在线不卡av | 国产精品久久99 | 黄色大片在线看 | 精品在线观看一区 | 91视频免费在线观看 | 久久综合导航 | 日韩理论在线观看 | 久久精品久久99 | 麻豆人妻少妇精品无码专区 | 久久久久久久极品内射 | 四虎永久免费 | 国产网友自拍视频 | 少妇人妻互换不带套 | 男人插女人下面视频 | 丝袜一区二区三区四区 | 婷婷六月天在线 | jzzijzzij亚洲成熟少妇在线观看 久久久精品人妻一区二区三区 | 高清18麻豆 | 少妇激情四射 | 日韩亚洲欧美一区 | jizz免费观看| 91久久精品国产91久久性色tv | 在线看片黄 | 日韩欧美国产高清91 | 美女免费视频网站 | 一本大道东京热无码aⅴ | 欧美性天堂 | 精品一区二区三区精华液 | 最新av在线播放 | 男人天堂视频在线 | 白石茉莉奈黑人 | 欧美色炮 | 国产综合一区二区 | 国内自拍偷拍 | 色哟哟在线观看 | 国产精品五区 | 巨骚综合 | 激情图片在线视频 | 毛片在线免费观看网址 | 99青青草| 涩涩视频网址 | 日本美女视频一区 | 两性午夜免费视频 | 精品区在线观看 | 香蕉av在线| 欧洲精品码一区二区三区免费看 | 黄色精品免费 | 久久久久亚洲av片无码v | 亚洲乱码少妇 | 看了下面会湿的视频 | 午夜合集 | 黄色小视频免费网站 | 成都4电影免费高清 | 日本孰妇毛茸茸xxxx | 国产美女一级片 | 日韩精品久久久久 | 亚洲欧美日韩精品一区 | 黄床大片 | 亚洲制服丝袜在线播放 | 久久国产精品视频 | 天天干天天操天天 | 黄色一级免费视频 | 国产女厕一区二区三区在线视 | 中文字幕第一页在线视频 | 男女做事网站 | 男女av | 无码aⅴ精品一区二区三区 精品久久在线 | 麻豆视频免费入口 | 国产午夜大地久久 | 黄色片网站视频 |