太強(qiáng)了!深度學(xué)習(xí)的Top10模型!
共 25380字,需瀏覽 51分鐘
·
2024-07-03 17:00
本文約10000字,建議閱讀15分鐘 本文分享了深度學(xué)習(xí)top10模型,它們?cè)趧?chuàng)新性、應(yīng)用價(jià)值和影響力方面都具有重要的地位。
import tensorflow as tffrom tensorflow.keras.datasets import irisfrom tensorflow.keras.models import Sequentialfrom tensorflow.keras.layers import Dense# 加載鳶尾花數(shù)據(jù)集(x_train, y_train), (x_test, y_test) = iris.load_data()# 對(duì)數(shù)據(jù)進(jìn)行預(yù)處理y_train = tf.keras.utils.to_categorical(y_train) # 將標(biāo)簽轉(zhuǎn)換為one-hot編碼y_test = tf.keras.utils.to_categorical(y_test)# 創(chuàng)建神經(jīng)網(wǎng)絡(luò)模型model = Sequential([Dense(64, activation='relu', input_shape=(4,)), # 輸入層,有4個(gè)輸入節(jié)點(diǎn)Dense(32, activation='relu'), # 隱藏層,有32個(gè)節(jié)點(diǎn)Dense(3, activation='softmax') # 輸出層,有3個(gè)節(jié)點(diǎn)(對(duì)應(yīng)3種鳶尾花)])# 編譯模型model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])# 訓(xùn)練模型model.fit(x_train, y_train, epochs=10, batch_size=32)# 測(cè)試模型test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2)print('Test accuracy:', test_acc)
import tensorflow as tffrom tensorflow.keras.models import Sequentialfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense# 設(shè)置超參數(shù)input_shape = (28, 28, 1)num_classes = 10# 創(chuàng)建CNN模型model = Sequential()# 添加卷積層,32個(gè)3x3的卷積核,使用ReLU激活函數(shù)model.add(Conv2D(32, (3, 3), activation='relu', input_shape=input_shape))# 添加卷積層,64個(gè)3x3的卷積核,使用ReLU激活函數(shù)model.add(Conv2D(64, (3, 3), activation='relu'))# 添加最大池化層,池化窗口為2x2model.add(MaxPooling2D(pool_size=(2, 2)))# 將多維輸入展平為一維,以便輸入全連接層model.add(Flatten())# 添加全連接層,128個(gè)神經(jīng)元,使用ReLU激活函數(shù)model.add(Dense(128, activation='relu'))# 添加輸出層,10個(gè)神經(jīng)元,使用softmax激活函數(shù)進(jìn)行多分類model.add(Dense(num_classes, activation='softmax'))# 編譯模型,使用交叉熵作為損失函數(shù),使用Adam優(yōu)化器model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])# 打印模型結(jié)構(gòu)model.summary()
-
突破梯度消失與模型退化:憑借殘差塊與跳躍連接的引入,ResNet成功解決了深度網(wǎng)絡(luò)的訓(xùn)練難題,有效避免了梯度消失與模型退化現(xiàn)象。 -
構(gòu)建深層網(wǎng)絡(luò)結(jié)構(gòu):由于克服了梯度消失與模型退化問(wèn)題,ResNet得以構(gòu)建更深層的網(wǎng)絡(luò)結(jié)構(gòu),顯著提升了模型的性能。 -
多任務(wù)卓越表現(xiàn):得益于其強(qiáng)大的特征學(xué)習(xí)和表示能力,ResNet在圖像分類、目標(biāo)檢測(cè)等多種任務(wù)中均展現(xiàn)出卓越的性能。
-
計(jì)算資源需求高:由于ResNet通常需要構(gòu)建深層的網(wǎng)絡(luò)結(jié)構(gòu),導(dǎo)致計(jì)算量龐大,對(duì)計(jì)算資源和訓(xùn)練時(shí)間有著較高的要求。 -
參數(shù)調(diào)優(yōu)難度大:ResNet的參數(shù)數(shù)量眾多,需要投入大量的時(shí)間和精力進(jìn)行參數(shù)調(diào)優(yōu)和超參數(shù)選擇。 -
對(duì)初始化權(quán)重敏感:ResNet對(duì)初始化權(quán)重的選擇十分敏感,不合適的初始化可能導(dǎo)致訓(xùn)練不穩(wěn)定或過(guò)擬合等問(wèn)題。
from keras.models import Sequentialfrom keras.layers import Conv2D, Add, Activation, BatchNormalization, Shortcutdef residual_block(input, filters):x = Conv2D(filters=filters, kernel_size=(3, 3), padding='same')(input)x = BatchNormalization()(x)x = Activation('relu')(x)x = Conv2D(filters=filters, kernel_size=(3, 3), padding='same')(x)x = BatchNormalization()(x)x = Activation('relu')(x)return Add()([x, input]) # Add shortcut connection# 構(gòu)建ResNet模型model = Sequential()# 添加輸入層和其他必要的層# ...# 添加殘差塊model.add(residual_block(previous_layer, filters=64))# 繼續(xù)添加更多的殘差塊和其他層# ...# 添加輸出層# ...# 編譯和訓(xùn)練模型# model.compile(...)# model.fit(...)
-
攻克梯度消失和模型退化:通過(guò)引入門(mén)控機(jī)制,LSTM在解決長(zhǎng)期依賴問(wèn)題上表現(xiàn)卓越,有效避免了梯度消失和模型退化的問(wèn)題。 -
構(gòu)建深邃網(wǎng)絡(luò)結(jié)構(gòu):得益于對(duì)梯度消失和模型退化的處理,LSTM能夠構(gòu)建深度龐大的網(wǎng)絡(luò)結(jié)構(gòu),從而充分發(fā)掘數(shù)據(jù)的內(nèi)在規(guī)律,提升模型性能。 -
多任務(wù)表現(xiàn)出色:LSTM在文本生成、語(yǔ)音識(shí)別、機(jī)器翻譯等多個(gè)任務(wù)中均展現(xiàn)了出色的性能,證明了其強(qiáng)大的特征學(xué)習(xí)和表示能力。
-
參數(shù)調(diào)優(yōu)挑戰(zhàn)大:LSTM涉及大量參數(shù),調(diào)優(yōu)過(guò)程繁瑣,需要投入大量時(shí)間和精力進(jìn)行超參數(shù)選擇和調(diào)整。 -
對(duì)初始化敏感:LSTM對(duì)權(quán)重的初始化極為敏感,不合適的初始化可能導(dǎo)致訓(xùn)練不穩(wěn)定或出現(xiàn)過(guò)擬合問(wèn)題。 -
計(jì)算量大:由于LSTM通常構(gòu)建深度網(wǎng)絡(luò)結(jié)構(gòu),計(jì)算量龐大,對(duì)計(jì)算資源和訓(xùn)練時(shí)間要求較高。
Python
from keras.models import Sequentialfrom keras.layers import LSTM, Densedef lstm_model(input_shape, num_classes):model = Sequential()model.add(LSTM(units=128, input_shape=input_shape)) # 添加一個(gè)LSTM層model.add(Dense(units=num_classes, activation='softmax')) # 添加一個(gè)全連接層return model
模型原理
模型訓(xùn)練
優(yōu)點(diǎn)概覽
-
語(yǔ)義相似性:Word2Vec能夠精準(zhǔn)捕捉詞與詞之間的語(yǔ)義關(guān)聯(lián),使得在向量空間中,意義相近的詞靠得更近。 -
訓(xùn)練效率:Word2Vec訓(xùn)練過(guò)程高效,輕松應(yīng)對(duì)大規(guī)模文本數(shù)據(jù)的處理需求。 -
可解釋性:Word2Vec生成的詞向量具有實(shí)際應(yīng)用價(jià)值,可用于諸如聚類、分類、語(yǔ)義相似性計(jì)算等多種任務(wù)。
潛在不足
-
數(shù)據(jù)稀疏性:對(duì)于未在訓(xùn)練數(shù)據(jù)中出現(xiàn)的詞,Word2Vec可能無(wú)法生成精準(zhǔn)的向量表示。 -
上下文窗口限制:Word2Vec的上下文窗口固定,可能會(huì)忽略遠(yuǎn)距離的詞與詞之間的依賴關(guān)系。 -
計(jì)算資源需求:Word2Vec的訓(xùn)練和推理過(guò)程對(duì)計(jì)算資源有一定要求。 -
參數(shù)調(diào)整挑戰(zhàn):Word2Vec的性能表現(xiàn)高度依賴于超參數(shù)(如向量維度、窗口大小、學(xué)習(xí)率等)的細(xì)致調(diào)整。
應(yīng)用領(lǐng)域
Python示例代碼
Python
from gensim.models import Word2Vecfrom nltk.tokenize import word_tokenizeimport nltk# 下載punkt分詞模型nltk.download('punkt')# 假設(shè)我們有一些文本數(shù)據(jù)sentences = ["我喜歡吃蘋(píng)果","蘋(píng)果是我的最愛(ài)","我不喜歡吃香蕉","香蕉太甜了","我喜歡讀書(shū)","讀書(shū)讓我快樂(lè)"]# 對(duì)文本數(shù)據(jù)進(jìn)行分詞處理sentences = [word_tokenize(sentence) for sentence in sentences]# 創(chuàng)建 Word2Vec 模型# 這里的參數(shù)可以根據(jù)需要進(jìn)行調(diào)整model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, workers=4)# 訓(xùn)練模型model.train(sentences, total_examples=model.corpus_count, epochs=10)# 獲取詞向量vector = model.wv['蘋(píng)果']# 找出與“蘋(píng)果”最相似的詞similar_words = model.wv.most_similar('蘋(píng)果')print("蘋(píng)果的詞向量:", vector)print("與蘋(píng)果最相似的詞:", similar_words)
-
梯度消失與模型退化之困得以解決:Transformer模型憑借其獨(dú)特的自注意力機(jī)制,能夠游刃有余地捕捉序列中的長(zhǎng)期依賴關(guān)系,從而擺脫了梯度消失和模型退化的桎梏。 -
并行計(jì)算能力卓越:Transformer模型的計(jì)算架構(gòu)具備天然的并行性,使得在GPU上能夠風(fēng)馳電掣地進(jìn)行訓(xùn)練和推斷。 -
多任務(wù)表現(xiàn)出色:憑借強(qiáng)大的特征學(xué)習(xí)和表示能力,Transformer模型在機(jī)器翻譯、文本分類、語(yǔ)音識(shí)別等多項(xiàng)任務(wù)中展現(xiàn)了卓越的性能。
-
計(jì)算資源需求龐大:由于Transformer模型的計(jì)算可并行性,訓(xùn)練和推斷過(guò)程需要龐大的計(jì)算資源支持。 -
對(duì)初始化權(quán)重敏感:Transformer模型對(duì)初始化權(quán)重的選擇極為挑剔,不當(dāng)?shù)某跏蓟赡軐?dǎo)致訓(xùn)練過(guò)程不穩(wěn)定或出現(xiàn)過(guò)擬合問(wèn)題。 -
長(zhǎng)期依賴關(guān)系處理受限:盡管Transformer模型已有效解決梯度消失和模型退化問(wèn)題,但在處理超長(zhǎng)序列時(shí)仍面臨挑戰(zhàn)。
import torchimport torch.nn as nnimport torch.optim as optim#該示例僅用于說(shuō)明Transformer的基本結(jié)構(gòu)和原理。實(shí)際的Transformer模型(如GPT或BERT)要復(fù)雜得多,并且需要更多的預(yù)處理步驟,如分詞、填充、掩碼等。class Transformer(nn.Module):def __init__(self, d_model, nhead, num_encoder_layers, num_decoder_layers, dim_feedforward=2048):super(Transformer, self).__init__()self.model_type = 'Transformer'# encoder layersself.src_mask = Noneself.pos_encoder = PositionalEncoding(d_model, max_len=5000)encoder_layers = nn.TransformerEncoderLayer(d_model, nhead, dim_feedforward)self.transformer_encoder = nn.TransformerEncoder(encoder_layers, num_encoder_layers)# decoder layersdecoder_layers = nn.TransformerDecoderLayer(d_model, nhead, dim_feedforward)self.transformer_decoder = nn.TransformerDecoder(decoder_layers, num_decoder_layers)# decoderself.decoder = nn.Linear(d_model, d_model)self.init_weights()def init_weights(self):initrange = 0.1self.decoder.weight.data.uniform_(-initrange, initrange)def forward(self, src, tgt, teacher_forcing_ratio=0.5):batch_size = tgt.size(0)tgt_len = tgt.size(1)tgt_vocab_size = self.decoder.out_features# forward pass through encodersrc = self.pos_encoder(src)output = self.transformer_encoder(src)# prepare decoder input with teacher forcingtarget_input = tgt[:, :-1].contiguous()target_input = target_input.view(batch_size * tgt_len, -1)target_input = torch.autograd.Variable(target_input)# forward pass through decoderoutput2 = self.transformer_decoder(target_input, output)output2 = output2.view(batch_size, tgt_len, -1)# generate predictionsprediction = self.decoder(output2)prediction = prediction.view(batch_size * tgt_len, tgt_vocab_size)return prediction[:, -1], predictionclass PositionalEncoding(nn.Module):def __init__(self, d_model, max_len=5000):super(PositionalEncoding, self).__init__()# Compute the positional encodings once in log space.pe = torch.zeros(max_len, d_model)position = torch.arange(0, max_len).unsqueeze(1).float()div_term = torch.exp(torch.arange(0, d_model, 2).float() *-(torch.log(torch.tensor(10000.0)) / d_model))pe[:, 0::2] = torch.sin(position * div_term)pe[:, 1::2] = torch.cos(position * div_term)pe = pe.unsqueeze(0)self.register_buffer('pe', pe)def forward(self, x):x = x + self.pe[:, :x.size(1)]return x# 超參數(shù)d_model = 512nhead = 8num_encoder_layers = 6num_decoder_layers = 6dim_feedforward = 2048# 實(shí)例化模型model = Transformer(d_model, nhead, num_encoder_layers, num_decoder_layers, dim_feedforward)# 隨機(jī)生成數(shù)據(jù)src = torch.randn(10, 32, 512)tgt = torch.randn(10, 32, 512)# 前向傳播prediction, predictions = model(src, tgt)print(prediction)
7、生成對(duì)抗網(wǎng)絡(luò)(GAN)
GAN的思想源于博弈論中的零和游戲,其中一個(gè)玩家試圖生成最逼真的假數(shù)據(jù),而另一個(gè)玩家則嘗試區(qū)分真實(shí)數(shù)據(jù)與假數(shù)據(jù)。GAN由蒙提霍爾問(wèn)題(一種生成模型與判別模型組合的問(wèn)題)演變而來(lái),但與蒙提霍爾問(wèn)題不同,GAN不強(qiáng)調(diào)逼近某些概率分布或生成某種樣本,而是直接使用生成模型與判別模型進(jìn)行對(duì)抗。
模型原理:
GAN由兩部分組成:生成器(Generator)和判別器(Discriminator)。生成器致力于創(chuàng)作逼真的假數(shù)據(jù),而判別器則致力于分辨輸入數(shù)據(jù)的真?zhèn)巍T诔掷m(xù)的博弈中,兩者不斷調(diào)整參數(shù),直至達(dá)到一種動(dòng)態(tài)平衡。這時(shí),生成器生成的假數(shù)據(jù)如此逼真,判別器已難以分辨其真?zhèn)巍?/span>
模型訓(xùn)練:
GAN的訓(xùn)練過(guò)程是一個(gè)微妙的優(yōu)化過(guò)程。在每個(gè)訓(xùn)練步驟中,生成器首先利用當(dāng)前參數(shù)生成假數(shù)據(jù),判別器隨后對(duì)這些數(shù)據(jù)的真實(shí)性進(jìn)行判斷。根據(jù)判別結(jié)果,判別器的參數(shù)得到更新。同時(shí),為了防止判別器過(guò)于精準(zhǔn),我們也會(huì)對(duì)生成器進(jìn)行訓(xùn)練,使其能夠創(chuàng)作出能欺騙判別器的假數(shù)據(jù)。這個(gè)過(guò)程反復(fù)進(jìn)行,直至雙方達(dá)到一種微妙的平衡。
優(yōu)點(diǎn):
強(qiáng)大的生成能力:GAN能夠深入挖掘數(shù)據(jù)的內(nèi)在結(jié)構(gòu)和分布規(guī)律,創(chuàng)作出極其逼真的假數(shù)據(jù)。
無(wú)需顯式監(jiān)督:在GAN的訓(xùn)練過(guò)程中,我們無(wú)需提供顯式的標(biāo)簽信息,只需提供真實(shí)數(shù)據(jù)即可。
靈活性高:GAN可以與其他模型無(wú)縫結(jié)合,如與自編碼器結(jié)合形成AutoGAN,或與卷積神經(jīng)網(wǎng)絡(luò)結(jié)合形成DCGAN等,從而拓展其應(yīng)用范圍。
缺點(diǎn):
訓(xùn)練不穩(wěn)定:GAN的訓(xùn)練過(guò)程可能充滿挑戰(zhàn),有時(shí)會(huì)出現(xiàn)模式崩潰(mode collapse)的問(wèn)題,即生成器只專注于生成某一種樣本,導(dǎo)致判別器難以準(zhǔn)確判斷。
調(diào)試?yán)щy:生成器和判別器之間的相互作用錯(cuò)綜復(fù)雜,這使得GAN的調(diào)試變得頗具挑戰(zhàn)性。
評(píng)估難度大:鑒于GAN出色的生成能力,準(zhǔn)確評(píng)估其生成的假數(shù)據(jù)的真實(shí)性和多樣性并非易事。
使用場(chǎng)景:
圖像生成:GAN在圖像生成領(lǐng)域大放異彩,能夠創(chuàng)作出各種風(fēng)格的圖像,如根據(jù)文字描述生成圖像,或?qū)⒁环鶊D像轉(zhuǎn)換為另一種風(fēng)格等。
數(shù)據(jù)增強(qiáng):GAN可以生成與真實(shí)數(shù)據(jù)極為相似的假數(shù)據(jù),用于擴(kuò)充數(shù)據(jù)集或提升模型的泛化能力。
圖像修復(fù):借助GAN,我們能夠修復(fù)圖像中的缺陷或消除圖像中的噪聲,使圖像質(zhì)量得到顯著提升。
視頻生成:基于GAN的視頻生成已成為當(dāng)前研究的熱點(diǎn)之一,能夠創(chuàng)作出各種風(fēng)格獨(dú)特的視頻內(nèi)容。
簡(jiǎn)單的Python示例代碼:
以下是一個(gè)簡(jiǎn)單的GAN示例代碼,使用PyTorch實(shí)現(xiàn):
import torchimport torch.nn as nnimport torch.optim as optimimport torch.nn.functional as F# 定義生成器和判別器網(wǎng)絡(luò)結(jié)構(gòu)class Generator(nn.Module):def __init__(self, input_dim, output_dim):super(Generator, self).__init__()self.model = nn.Sequential(nn.Linear(input_dim, 128),nn.ReLU(),nn.Linear(128, output_dim),nn.Sigmoid())def forward(self, x):return self.model(x)class Discriminator(nn.Module):def __init__(self, input_dim):super(Discriminator, self).__init__()self.model = nn.Sequential(nn.Linear(input_dim, 128),nn.ReLU(),nn.Linear(128, 1),nn.Sigmoid())def forward(self, x):return self.model(x)# 實(shí)例化生成器和判別器對(duì)象input_dim = 100 # 輸入維度可根據(jù)實(shí)際需求調(diào)整output_dim = 784 # 對(duì)于MNIST數(shù)據(jù)集,輸出維度為28*28=784gen = Generator(input_dim, output_dim)disc = Discriminator(output_dim)# 定義損失函數(shù)和優(yōu)化器criterion = nn.BCELoss() # 二分類交叉熵?fù)p失函數(shù)適用于GAN的判別器部分和生成器的logistic損失部分。但是,通常更常見(jiàn)的選擇是采用二元交叉熵?fù)p失函數(shù)(binary cross
8、Diffusion擴(kuò)散模型
火爆全網(wǎng)的Sora大模型的底層就是Diffusion模型,它是一種基于深度學(xué)習(xí)的生成模型,它主要用于生成連續(xù)數(shù)據(jù),如圖像、音頻等。Diffusion模型的核心思想是通過(guò)逐步添加噪聲來(lái)將復(fù)雜數(shù)據(jù)分布轉(zhuǎn)化為簡(jiǎn)單的高斯分布,然后再通過(guò)逐步去除噪聲來(lái)從簡(jiǎn)單分布中生成數(shù)據(jù)。
算法原理:
Diffusion Model的基本思想是將數(shù)據(jù)生成過(guò)程看作一個(gè)馬爾可夫鏈。從目標(biāo)數(shù)據(jù)開(kāi)始,每一步都向隨機(jī)噪聲靠近,直到達(dá)到純?cè)肼暊顟B(tài)。然后,通過(guò)反向過(guò)程,從純?cè)肼曋饾u恢復(fù)到目標(biāo)數(shù)據(jù)。這個(gè)過(guò)程通常由一系列的條件概率分布來(lái)描述。
訓(xùn)練過(guò)程:
前向過(guò)程(Forward Process):從真實(shí)數(shù)據(jù)開(kāi)始,逐步添加噪聲,直到達(dá)到純?cè)肼暊顟B(tài)。這個(gè)過(guò)程中,需要計(jì)算每一步的噪聲水平,并保存下來(lái)。
反向過(guò)程(Reverse Process):從純?cè)肼曢_(kāi)始,逐步去除噪聲,直到恢復(fù)到目標(biāo)數(shù)據(jù)。在這個(gè)過(guò)程中,使用神經(jīng)網(wǎng)絡(luò)(通常是U-Net結(jié)構(gòu))來(lái)預(yù)測(cè)每一步的噪聲水平,并據(jù)此生成數(shù)據(jù)。
優(yōu)化:通過(guò)最小化真實(shí)數(shù)據(jù)與生成數(shù)據(jù)之間的差異來(lái)訓(xùn)練模型。常用的損失函數(shù)包括MSE(均方誤差)和BCE(二元交叉熵)。
優(yōu)點(diǎn):
生成質(zhì)量高:由于Diffusion Model采用了逐步擴(kuò)散和恢復(fù)的過(guò)程,因此可以生成高質(zhì)量的數(shù)據(jù)。
可解釋性強(qiáng):Diffusion Model的生成過(guò)程具有明顯的物理意義,便于理解和解釋。
靈活性好:Diffusion Model可以處理各種類型的數(shù)據(jù),包括圖像、文本和音頻等。
缺點(diǎn):
訓(xùn)練時(shí)間長(zhǎng):由于Diffusion Model需要進(jìn)行多步的擴(kuò)散和恢復(fù)過(guò)程,因此訓(xùn)練時(shí)間較長(zhǎng)。
計(jì)算資源需求大:為了保證生成質(zhì)量,Diffusion Model通常需要較大的計(jì)算資源,包括內(nèi)存和計(jì)算力。
適用場(chǎng)景:
Diffusion Model適用于需要生成高質(zhì)量數(shù)據(jù)的場(chǎng)景,如圖像生成、文本生成和音頻生成等。同時(shí),由于其可解釋性強(qiáng)和靈活性好的特點(diǎn),Diffusion Model也可以應(yīng)用于其他需要深度生成模型的領(lǐng)域。
Python示例代碼:
import torchimport torch.nn as nnimport torch.optim as optim# 定義U-Net模型class UNet(nn.Module):# ...省略模型定義...# 定義Diffusion Modelclass DiffusionModel(nn.Module):def __init__(self, unet):super(DiffusionModel, self).__init__()self.unet = unetdef forward(self, x_t, t):# x_t為當(dāng)前時(shí)刻的數(shù)據(jù),t為噪聲水平# 使用U-Net預(yù)測(cè)噪聲水平noise_pred = self.unet(x_t, t)# 根據(jù)噪聲水平生成數(shù)據(jù)x_t_minus_1 = x_t - noise_pred * torch.sqrt(1 - torch.exp(-2 * t))return x_t_minus_1# 初始化模型和優(yōu)化器unet = UNet()model = DiffusionModel(unet)optimizer = optim.Adam(model.parameters(), lr=0.001)# 訓(xùn)練過(guò)程for epoch in range(num_epochs):for x_real in dataloader: # 從數(shù)據(jù)加載器中獲取真實(shí)數(shù)據(jù)# 前向過(guò)程x_t = x_real # 從真實(shí)數(shù)據(jù)開(kāi)始for t in torch.linspace(0, 1, num_steps):# 添加噪聲noise = torch.randn_like(x_t) * torch.sqrt(1 - torch.exp(-2 * t))x_t = x_t + noise * torch.sqrt(torch.exp(-2 * t))# 計(jì)算預(yù)測(cè)噪聲noise_pred = model(x_t, t)# 計(jì)算損失loss = nn.MSELoss()(noise_pred, noise)# 反向傳播和優(yōu)化optimizer.zero_grad()loss.backward()optimizer.step()
Python
import torchfrom torch_geometric.nn import GCNConvfrom torch_geometric.data import Data# 定義一個(gè)簡(jiǎn)單的圖結(jié)構(gòu)edge_index = torch.tensor([[0, 1, 1, 2],0, 2, 1]], dtype=torch.long)x = torch.tensor([[-1], [0], [1]], dtype=torch.float)data = Data(x=x, edge_index=edge_index)# 定義一個(gè)簡(jiǎn)單的兩層圖卷積網(wǎng)絡(luò)class Net(torch.nn.Module):def __init__(self):self).__init__()= GCNConv(dataset.num_features, 16)= GCNConv(16, dataset.num_classes)def forward(self, data):edge_index = data.x, data.edge_indexx = self.conv1(x, edge_index)x = torch.relu(x)x = torch.dropout(x, training=self.training)x = self.conv2(x, edge_index)return torch.log_softmax(x, dim=1)# 實(shí)例化模型、損失函數(shù)和優(yōu)化器model = Net()criterion = torch.nn.NLLLoss()optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)# 訓(xùn)練模型model.train()for epoch in range(200):optimizer.zero_grad()out = model(data)loss = criterion(out[data.train_mask], data.y[data.train_mask])loss.backward()optimizer.step()# 在測(cè)試集上評(píng)估模型model.eval()pred = model(data).max(dim=1)correct = int((pred == data.y).sum().item())acc = correct / int(data.y.sum().item()): {:.4f}'.format(acc))
import tensorflow as tfimport numpy as npimport randomimport gymfrom collections import deque# 設(shè)置超參數(shù)BUFFER_SIZE = int(1e5) # 經(jīng)驗(yàn)回放存儲(chǔ)的大小BATCH_SIZE = 64 # 每次從經(jīng)驗(yàn)回放中抽取的樣本數(shù)量GAMMA = 0.99 # 折扣因子TAU = 1e-3 # 目標(biāo)網(wǎng)絡(luò)更新的步長(zhǎng)LR = 1e-3 # 學(xué)習(xí)率UPDATE_RATE = 10 # 每多少步更新一次目標(biāo)網(wǎng)絡(luò)# 定義經(jīng)驗(yàn)回放存儲(chǔ)class ReplayBuffer:def __init__(self, capacity):self.buffer = deque(maxlen=capacity)def push(self, state, action, reward, next_state, done):self.buffer.append((state, action, reward, next_state, done))def sample(self, batch_size):return random.sample(self.buffer, batch_size)# 定義DQN模型class DQN:def __init__(self, state_size, action_size):self.state_size = state_sizeself.action_size = action_sizeself.model = self._build_model()def _build_model(self):model = tf.keras.Sequential()model.add(tf.keras.layers.Dense(24, input_dim=self.state_size, activation='relu'))model.add(tf.keras.layers.Dense(24, activation='relu'))model.add(tf.keras.layers.Dense(self.action_size, activation='linear'))model.compile(loss='mse', optimizer=tf.keras.optimizers.Adam(lr=LR))return modeldef remember(self, state, action, reward, next_state, done):self.replay_buffer.push((state, action, reward, next_state, done))def act(self, state):if np.random.rand() <= 0.01:return random.randrange(self.action_size)act_values = self.model.predict(state)return np.argmax(act_values[0])def replay(self, batch_size):minibatch = self.replay_buffer.sample(batch_size)for state, action, reward, next_state, done in minibatch:target = self.model.predict(state)if done:target[0][action] = rewardelse:Q_future = max(self.target_model.predict(next_state)[0])target[0][action] = reward + GAMMA * Q_futureself.model.fit(state, target, epochs=1, verbose=0)if self.step % UPDATE_RATE == 0:self.target_model.set_weights(self.model.get_weights())def load(self, name):self.model.load_weights(name)def save(self, name):self.model.save_weights(name)# 創(chuàng)建環(huán)境env = gym.make('CartPole-v1')state_size = env.observation_space.shape[0]action_size = env.action_space.n# 初始化DQN和回放存儲(chǔ)dqn = DQN(state_size, action_size)replay_buffer = ReplayBuffer(BUFFER_SIZE)# 訓(xùn)練過(guò)程total_steps = 10000for step in range(total_steps):state = env.reset()state = np.reshape(state, [1, state_size])for episode in range(100):action = dqn.act(state)next_state, reward, done, _ = env.step(action)next_state = np.reshape(next_state, [1, state_size])replay_buffer.remember(state, action, reward, next_state, done)state = next_stateif done:breakif replay_buffer.buffer.__
編輯:王菁
