3易懂AI深度學習算法:長短期記憶網絡(Long Short-Term Memory, LSTM)生成對抗網絡 優化算法進化算法

繼續寫:https://blog.csdn.net/chenhao0568/article/details/134920391?spm=1001.2014.3001.5502
1.https://blog.csdn.net/chenhao0568/article/details/134931993?spm=1001.2014.3001.5502
2.https://blog.csdn.net/chenhao0568/article/details/134932800?spm=1001.2014.3001.5502

長短期記憶網絡(Long Short-Term Memory, LSTM)

長短期記憶網絡(LSTM)是一種特殊的循環神經網絡(RNN),主要用于處理和預測序列數據中的長期依賴問題。LSTM網絡在許多序列數據任務中表現出色,例如語言建模、語音識別和時間序列預測。

為了更好地理解LSTM,我們可以將其比作一部電視劇的編劇。在電視劇中,編劇需要記住過去的情節(長期記憶),同時還要考慮最近的發展(短期記憶),以決定接下來的劇情如何發展。同樣,在處理序列數據時,LSTM網絡需要記住長期的信息(比如整個對話的背景),同時也要處理最近的輸入(比如最近幾句話)。

LSTM的關鍵特點是其內部結構,主要包括三個門(門控單元):遺忘門、輸入門和輸出門。這些門控單元幫助網絡決定何時更新記憶、何時忽略無關信息以及何時將記憶用于當前的輸出。

  1. 遺忘門:決定哪些信息應該從單元狀態中被遺忘。它通過一系列輸入和先前的隱藏狀態來查看信息,并輸出一個0到1之間的值,其中1表示“完全保留”而0表示“完全忘記”。

  2. 輸入門:決定哪些新的信息應該被添加到單元狀態中。它包含一個sigmoid層和一個tanh層,sigmoid層決定哪些值需要更新,tanh層則創建一個新的候選值向量,這些值可能會被加入到狀態中。

  3. 輸出門:決定基于單元狀態的下一個隱藏狀態(即下一個輸出)。隱藏狀態包含了先前單元狀態的信息,用于預測或決定下一步。

通過這種方式,LSTM能夠在處理序列數據時保持對重要歷史信息的記憶,同時忽略不相關的信息。這使得LSTM在處理長序列和需要理解長期依賴的任務中特別有效。

用python寫個示例

當然可以。以下是一個使用Python中的Keras庫來實現簡單的LSTM網絡的示例。這個例子中,我們將創建一個用于序列數據預測的小型LSTM模型。為了簡化,我們會使用一個合成的時間序列數據。

首先,我們需要安裝Keras和TensorFlow(如果你還沒有安裝的話)。你可以使用以下命令安裝:

pip install tensorflow

然后,我們可以寫一個簡單的腳本來創建和訓練我們的LSTM模型:

  1. 生成一些合成的時間序列數據。
  2. 創建一個LSTM模型。
  3. 訓練模型并對其進行評估。

以下是完整的代碼:

import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
from tensorflow.keras.optimizers import Adam# 生成合成數據
def generate_data(seq_length=100, num_samples=1000):x = np.array([np.linspace(0, (seq_length - 1)*0.1, seq_length) for _ in range(num_samples)])y = np.sin(x)return x, y# 創建LSTM模型
def create_lstm_model(input_shape):model = Sequential()model.add(LSTM(50, activation='relu', input_shape=input_shape))model.add(Dense(1))model.compile(optimizer=Adam(learning_rate=0.01), loss='mse')return model# 主程序
def main():# 生成數據x, y = generate_data()x = x.reshape((x.shape[0], x.shape[1], 1))  # 重塑為LSTM需要的形狀# 創建并編譯模型model = create_lstm_model((x.shape[1], 1))# 訓練模型model.fit(x, y, epochs=20, batch_size=32, verbose=1)# 評估模型(這里我們簡單地用訓練數據評估)loss = model.evaluate(x, y)print("Model Loss:", loss)if __name__ == "__main__":main()

這個腳本首先生成一個基于正弦函數的時間序列數據,然后創建一個包含一個LSTM層和一個密集層的模型。之后,它使用這些數據訓練模型,并評估模型的性能。這只是一個簡單的示例,實際應用中可能需要更復雜的數據處理和模型結構調整。

生成對抗網絡(Generative Adversarial Networks, GANs)

生成對抗網絡(GANs)是一種深度學習模型,主要用于生成數據。它由兩個部分組成:生成器(Generator)和鑒別器(Discriminator)。

想象一下,生成器就像是一個藝術家,它試圖創造看起來真實的作品。鑒別器則像是一個藝術評論家,它的任務是判斷作品是真實的還是生成器創造的假作品。

在訓練過程中,生成器不斷嘗試創造越來越逼真的數據(比如圖片),而鑒別器則不斷學習如何更好地區分真實數據和生成器創造的數據。這個過程就像是一場博弈,最終目標是讓生成器能夠創造出鑒別器也難以區分的高質量數據。

舉個例子,如果我們用GANs來生成圖片,生成器最開始可能生成的是一些難以辨認的圖像。但隨著訓練的進行,它學會如何創造越來越真實的圖片,比如逼真的人臉或風景畫。同時,鑒別器也在學習如何更精準地分辨真假圖片。這個過程就像是一個學習和適應的游戲。

用python寫個示例

創建一個簡單的生成對抗網絡(GAN)示例需要使用深度學習庫,比如TensorFlow或PyTorch。這里我將使用TensorFlow來演示如何構建一個基本的GAN模型。這個示例將展示如何構建和訓練一個生成器(Generator)和一個鑒別器(Discriminator)來生成手寫數字圖片(類似于MNIST數據集中的圖片)。

首先,確保您的環境中已安裝TensorFlow。如果未安裝,可以通過運行pip install tensorflow來安裝。

接下來是構建和訓練GAN模型的代碼:

import tensorflow as tf
from tensorflow.keras.layers import Dense, Flatten, Reshape
from tensorflow.keras import Sequential
import matplotlib.pyplot as plt
import numpy as np# 加載MNIST數據集
(X_train, _), (_, _) = tf.keras.datasets.mnist.load_data()
X_train = X_train / 255.0  # 歸一化# 創建生成器
generator = Sequential([Dense(128, activation='relu', input_shape=(100,)),Dense(784, activation='sigmoid'),Reshape((28, 28))
])# 創建鑒別器
discriminator = Sequential([Flatten(input_shape=(28, 28)),Dense(128, activation='relu'),Dense(1, activation='sigmoid')
])# 編譯鑒別器
discriminator.compile(loss='binary_crossentropy', optimizer='adam')
discriminator.trainable = False# 創建和編譯GAN模型
gan = Sequential([generator, discriminator])
gan.compile(loss='binary_crossentropy', optimizer='adam')# 訓練GAN
epochs = 100
batch_size = 32
for epoch in range(epochs):for _ in range(batch_size):# 隨機噪聲noise = np.random.normal(0, 1, (batch_size, 100))# 生成圖片generated_images = generator.predict(noise)# 真實圖片real_images = X_train[np.random.randint(0, X_train.shape[0], batch_size)]# 標簽real_y = np.ones((batch_size, 1))fake_y = np.zeros((batch_size, 1))# 訓練鑒別器discriminator.trainable = Trued_loss_real = discriminator.train_on_batch(real_images, real_y)d_loss_fake = discriminator.train_on_batch(generated_images, fake_y)d_loss = 0.5 * np.add(d_loss_real, d_loss_fake)# 訓練生成器noise = np.random.normal(0, 1, (batch_size, 100))discriminator.trainable = Falseg_loss = gan.train_on_batch(noise, real_y)# 每個epoch結束時打印損失print(f'Epoch {epoch + 1}/{epochs}, Discriminator Loss: {d_loss}, Generator Loss: {g_loss}')# 生成一些圖片以查看結果
noise = np.random.normal(0, 1, (10, 100))
generated_images = generator.predict(noise)
plt.figure(figsize=(10, 10))
for i in range(generated_images.shape[0]):plt.subplot(2, 5, i+1)plt.imshow(generated_images[i], cmap='gray')plt.axis('off')
plt.tight_layout()
plt.show()

這個代碼首先加載MNIST數據集,然后定義了生成器和鑒別器的結構。生成器的目標是從隨機噪聲中生成手寫數字圖片,而鑒別器則試圖區分真實圖片和生成器生成的圖片。接著,代碼中定義了訓練循環,其中交替地訓練鑒別器和生成器。最后,代碼生成了一些圖片以展示訓練后生成器的效果。

梯度下降(Gradient Descent)

梯度下降(Gradient Descent)是一種用于優化算法的方法,廣泛應用于機器學習和深度學習中。我們可以用一個生活中的比喻來理解它:想象你站在山上,目標是要走到山谷的最低點。但是,由于濃霧的遮擋,你看不到整座山,只能感覺到腳下地面的傾斜程度。

梯度下降就像是你決定沿著腳下最陡峭的方向(這就是“梯度”)往下走,希望這樣能更快地到達山谷底部。在機器學習中,這座山就代表了一個損失函數(Loss Function),這個函數描述了當前模型預測值與實際值之間的誤差。山谷的最低點,即損失函數的最小值,對應于模型的最佳參數。

梯度下降法的步驟大致如下:

  1. 選擇起始點:這就好比選擇一個山上的起始位置。在機器學習中,這通常是隨機選擇模型參數的初始值。

  2. 計算梯度:梯度是損失函數在當前位置的斜率,指示了誤差下降最快的方向。這就像是感覺腳下的地面,判斷哪個方向最陡。

  3. 更新位置:根據梯度和一個稱為“學習率”的參數,更新你的位置。學習率決定了你每一步走多遠。太大可能會越過最低點,太小則下降得很慢。

  4. 重復步驟:重復計算梯度和更新位置,直到找到一個“足夠好”的最低點,或者達到預設的迭代次數。

梯度下降法的關鍵在于學習率的選擇和梯度的準確計算。如果學習率太大,可能會錯過最低點;如果太小,則可能需要很長時間才能到達最低點。同時,由于只能根據當前位置的梯度信息來決策,因此有時可能會陷入局部最低點,而不是全局最低點。

用python寫個示例

當然可以。讓我們以一個簡單的例子來展示梯度下降的過程:假設有一個函數 ( f(x) = x^2 ),我們想要找到使這個函數最小化的 ( x ) 值。很顯然,這個函數的最小值在 ( x = 0 ) 處,但我們將使用梯度下降法來找到這個點。

首先,我們需要計算函數的梯度,即 ( f’(x) = 2x )。然后,我們將從一個隨機點開始,比如 ( x = 10 ),并使用梯度下降法來更新 ( x ) 的值,直到找到最小值。

我將編寫一個Python腳本來演示這個過程。我們將設置一個學習率,例如 0.1,然后迭代地更新 ( x ) 的值。

通過梯度下降法,我們從起始點 ( x = 10 ) 開始,經過 100 次迭代后,得到的 ( x ) 的值接近于 0(大約是 ( 2.04 \times 10^{-9} )),這與我們預期的最小化點 ( x = 0 ) 非常接近。這個結果展示了梯度下降法在尋找函數最小值時的有效性。在每次迭代中,我們根據函數的梯度(斜率)來更新 ( x ) 的值,并逐漸接近最小值點。

進化算法(Evolutionary Algorithms)

進化算法是一種模仿生物進化過程的算法,用于解決優化和搜索問題。就像自然選擇中最適應環境的生物能夠生存下來一樣,進化算法通過迭代過程優化解決方案。這個過程包括選擇、交叉(或稱為雜交)、變異和遺傳這幾個步驟。

讓我們用一個簡單的例子來理解進化算法的基本原理:假設你正在嘗試創建一個可以走得很遠的小機器人。你有很多不同設計的小機器人,但你不知道哪一個最好。

  1. 初始化:首先,你隨機創建一群小機器人(這就是“種群”)。

  2. 評估:然后,你測試每個機器人走多遠(這就是“適應度”評估)。

  3. 選擇:選擇表現最好的一些機器人。這就像自然界中生存競爭,表現好的有更多機會“繁衍”。

  4. 交叉:將這些表現好的機器人的“特性”組合起來,創造新一代機器人。這就像生物的雜交,后代會繼承父代的特性。

  5. 變異:在新一代中引入一些小的隨機改變。這就像生物進化中的突變,有助于探索新的可能性。

  6. 迭代:重復這個過程多次。每一代機器人都會根據其走路的能力被評估,選擇,雜交,然后再變異。

隨著時間的推移,你會發現整體的機器人性能在提高,因為不斷有更適應的機器人被創造出來。這就是進化算法的基本思想:通過模擬自然選擇和遺傳原理來不斷優化解決方案。

用python寫個示例

當然可以。讓我們以一個簡單的例子來演示進化算法:我們將嘗試優化一個函數,使其輸出盡可能接近目標值。我們的目標是找到一個數字,當將其平方時,結果盡可能接近某個給定的目標值(比如42)。

在這個例子中,我們將使用一個非常基礎的進化算法流程:

  1. 初始化:生成一個隨機數列表(種群)。
  2. 評估:計算每個數字平方后與目標值的差距(適應度)。
  3. 選擇:選擇表現最好(即與目標值差距最小)的數字。
  4. 交叉和變異:結合和修改選擇出的數字以創建新的數字。
  5. 迭代:重復這個過程,直到找到足夠接近目標值的解。

現在,我將用Python編寫這個示例的代碼。

經過25代的進化,我們找到了一個相當接近目標值42的解。這個最佳個體的值約為-6.842,其平方與42的差距僅為0.353。

這個簡單的進化算法示例展示了如何通過初始化一個隨機種群、計算適應度、選擇最佳個體、進行交叉和變異,以及迭代這些步驟來逐步優化解決方案。當然,實際應用中的進化算法可能會更加復雜和精細,包括更高級的選擇、交叉和變異策略,以及對不同類型問題的特定調整。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/214222.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214222.shtml
英文地址,請注明出處:http://en.pswp.cn/news/214222.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LeetCode 1631. 最小體力消耗路徑:廣度優先搜索BFS

【LetMeFly】1631.最小體力消耗路徑:廣度優先搜索BFS 力扣題目鏈接:https://leetcode.cn/problems/path-with-minimum-effort/ 你準備參加一場遠足活動。給你一個二維 rows x columns 的地圖 heights ,其中 heights[row][col] 表示格子 (ro…

視頻如何提取文字?這四個方法一鍵提取視頻文案

視頻如何提取文字?你用過哪些視頻提取工具?視頻轉文字工具,又稱為語音識別軟件,是一款能夠將視頻中的語音或對話轉化為文字的實用工具。它運用了尖端的聲音識別和語言理解技術,能精準地捕捉視頻中的音頻,并…

弧形導軌的工作原理

弧形導軌是一種能夠將物體沿著弧形軌道運動的裝置,它由個弧形軌道和沿著軌道運動的物體組成,弧形導軌的工作原理是利用軌道的形狀和物體的運動方式來實現運動,當物體處于軌道上時,它會受到軌道的引導,從而沿著軌道的弧…

Nginx正則表達式

目錄 1.nginx常用的正則表達式 2.location location 大致可以分為三類 location 常用的匹配規則 location 優先級 location 示例說明 優先級總結 3.rewrite rewrite功能 rewrite跳轉實現 rewrite執行順序 語法格式 rewrite示例 實例1: 實例2&#xf…

生活小記錄

上個月項目總算上線了,節奏也慢慢調整正常。發現自己好久沒有記錄生活點滴了,正好寫寫。其實,最近這段日子發生的事情還是挺多的。 流感 媳婦11.24得流感,這件事情特別好笑,大晚上她和我妹妹想喝酒試試,結…

【Python必做100題】之第六題(求圓的周長)

圓的周長公式:C 2 * pi * r 代碼如下: pi 3.14 r float(input("請輸入圓的半徑:")) c 2 * pi *r print(f"圓的周長為{c}") 運行截圖: 總結 1、圓周長的公式:C 2 * pi * r 2、輸出結果注意…

webrtc 工具類

直接上代碼;webrtc 工具類 package com.example.mqttdome;import android.app.Activity; import android.content.Context; import android.content.Intent; import android.media.projection.MediaProjection; import android.media.projection.MediaProjectionMa…

API低代碼開發平臺的實際應用及好處

API低代碼開發平臺是一種快速開發工具,可以幫助企業快速構建和部署應用程序,并提供易于使用的API集成。 實際應用 API低代碼開發平臺的應用范圍非常廣泛,包括但不限于以下幾個方面: 企業級應用程序開發:API低代碼開發…

TypeScript中的類型縮小、類型謂詞

一. 概覽 TypeScript中的類型縮小的方式有typeof、in等方式進行類型縮小。 二. 類型縮小 typeof function test(a: string| number | string []) {if(a) {if(typeof a string) {} else if(typeof a number) {}} }in關鍵字 nterface ISideBar {hide: () >void }interf…

mybatis-plus查詢的字段和mysql關鍵字重名

先看一下這個 TableField("show") 這個注解表示當前屬性對應在數據庫的字段為show,但是show在mysql中為關鍵字,直接查詢會導致語法錯誤 正確寫法應該是 但寫sql由和mybatis-plus理念相違背, 并且無法輕松創建對應方法&#xff0…

第8課 SQL入門之使用數據處理函數

文章目錄 8.1 函數8.2 使用函數8.2.1 文本處理函數8.2.2 日期和時間處理函數8.2.3 數值處理函數 表8-3 常用數值處理函數 這一課介紹什么是函數,DBMS支持何種函數,以及如何使用這些函數;還將講解為什么SQL函數的使用可能會帶來問題。 8.1 函數…

數據結構之----邏輯結構、物理結構

數據結構之----邏輯結構、物理結構 目前我們常見的數據結構分別有: 數組、鏈表、棧、隊列、哈希表、樹、堆、圖 而它們可以從 邏輯結構和物理結構兩個維度進行分類。 什么是邏輯結構? 邏輯結構是指數據元素之間的邏輯關系,而邏輯結構又分為…

HCIA-H12-811題目解析(5)

1、【單選題】 以下關于Hybrid端口說法正確的有? 2、【單選題】使用命令"vlan batch 10 20"和"valn batch 10 to 20",分別能創建的vlan數量是?() 3、【單選題】二層ACL的編號范圍是?…

Scala日志log4j,序列化Gson

一、日志輸出log4j 1. Scala中配置log4j依賴 對于 Maven 項目,可以在 pom.xml 文件中添加以下內容: <dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version> </dependency>2.創建…

VueUse工具庫

VueUse VueUse不是Vue.use&#xff0c;它是為Vue 2和3服務的一套Vue Composition API的常用工具集&#xff0c;是目前世界上Star最高的同類型庫之一。它的初衷就是將一切原本并不支持響應式的JS API變得支持響應式&#xff0c;省去程序員自己寫相關代碼。 VueUse 是一個基于 …

Java畢業設計 SSM SpringBoot 在線學習系統

Java畢業設計 SSM SpringBoot 在線學習系統 SSM SpringBoot 在線學習系統 功能介紹 首頁 圖片輪播 視頻推薦 在線學習 學習介紹 評論 收藏 資料中心 資料詳情 下載資料 話題討論 文檔發布 試題中心 系統公告 登錄 注冊學生 個人中心 試題記錄 錯題本 我的收藏 算法演示 結果分…

C語言 害死人不償命的(3n+1)算法 挖掘機技術哪家強 選擇排序 貪心算法

1.害死人不償命的&#xff08;3n1)算法 卡拉茲( Calatz)猜想: 對任何一個自然數n,如果它是偶數,那么把它砍掉一半;如果它是奇數,那么把(3n1)砍掉一半。這樣一直反復砍下去,最后一定在某一步得到n1。卡拉茲在1950年的世界數學家大會上公布了這個猜想,傳說當時耶魯大學師生齊動員…

持續集成交付CICD:Jenkins使用GitLab共享庫實現前后端項目Sonarqube

目錄 一、實驗 1.Jenkins使用GitLab共享庫實現后端項目Sonarqube 2.優化GitLab共享庫 3.Jenkins使用GitLab共享庫實現前端項目Sonarqube 4.Jenkins通過插件方式進行優化 二、問題 1.sonar-scanner 未找到命令 2.npm 未找到命令 一、實驗 1.Jenkins使用GitLab共享庫實現…

Vue學習筆記-Vue3中ref和reactive函數的使用

前言 為了讓vue3中的數據變成響應式&#xff0c;需要使用ref,reactive函數 ref函數使用方式 導入ref函數 import {ref} from vue在setup函數中&#xff0c;將需要響應式的數據通過ref函數進行包裝&#xff0c;修改響應式數據時&#xff0c;需要通過: ref包裝的響應式對象.val…

Flink之遲到的數據

遲到數據的處理 推遲水位線推進: WatermarkStrategy.<Event>forBoundedOutOfOrderness(Duration.ofSeconds(2))設置窗口延遲關閉&#xff1a;.allowedLateness(Time.seconds(3))使用側流接收遲到的數據: .sideOutputLateData(lateData) public class Flink12_LateDataC…