【深度學習】與【PyTorch實戰】

?2f8ae591c0e54bf1af949ceacd945bab.png

目錄

一、深度學習基礎

1.1 神經網絡簡介

1.2 激活函數

1.3 損失函數

1.4 優化算法

二、PyTorch基礎

2.1 PyTorch簡介

2.2 張量操作

2.3 構建神經網絡

?2.4訓練模型

2.5?模型評估

三、PyTorch實戰

3.1 數據加載與預處理

3.2 模型定義與訓練

3.3 模型評估與調優

3.4 模型保存與加載

四、深度學習的實際應用

4.1 圖像分類

4.1.1 數據集

4.1?.2構建模型

4.1.3 訓練模型?

?4.1.4 模型評估

?4.1.5 可視化

4.1.6 模型保存與加載

4.2 自然語言處理(NLP)

4.3 生成對抗網絡(GAN)

五、總結


?

深度學習是機器學習的一個分支,主要通過多層神經網絡進行數據特征的自動提取和建模。本文將通過PyTorch這個深度學習框架,從理論到實戰,詳細介紹深度學習的基本概念、模型構建、訓練和評估的過程。我會包含實例和代碼,以幫助理解。

一、深度學習基礎

823ca3b107a3457289b98733dacec6e1.png

1.1 神經網絡簡介

神經網絡模仿生物神經系統,由許多互聯的神經元(人工神經元)組成。主要分為以下幾部分:

  • 輸入層:接收外部輸入數據,每個神經元代表一個輸入特征。
  • 隱藏層:位于輸入層和輸出層之間,負責提取和處理輸入特征,數量和結構可以多樣化。
  • 輸出層:產生最終的輸出,每個神經元代表一個輸出結果。

神經網絡通過調整各層之間的連接權重,學習數據中的模式和特征。

1.2 激活函數

激活函數引入非線性,使神經網絡能夠擬合復雜的函數。常用的激活函數包括:

  • Sigmoid:輸出范圍為(0, 1),適合用于輸出層進行二分類。
  • Tanh:輸出范圍為(-1, 1),相比Sigmoid中心對稱且梯度較大。
  • ReLU(Rectified Linear Unit):如果輸入大于0則輸出為輸入,否則輸出為0,計算簡單且有效,廣泛應用于隱藏層。
import torch.nn.functional as F# ReLU激活函數
x = torch.tensor([-1.0, 0.0, 1.0])
relu = F.relu(x)
print(relu)  # tensor([0., 0., 1.])

1.3 損失函數

損失函數用于衡量模型預測值與真實值的差距,是模型優化的目標。常見的損失函數包括:

  • 均方誤差損失(MSE):用于回歸問題,衡量預測值與真實值之間的平方差的平均值。
  • 交叉熵損失(Cross Entropy Loss):用于分類問題,衡量預測概率分布與真實分布之間的差距。
# MSE Loss
mse_loss = nn.MSELoss()
output = torch.tensor([1.0, 2.0, 3.0])
target = torch.tensor([1.5, 2.5, 3.5])
loss = mse_loss(output, target)
print(loss)  # tensor(0.2500)

1.4 優化算法

# Adam優化器
optimizer = optim.Adam(model.parameters(), lr=0.001)

優化算法用于調整模型參數,以最小化損失函數。常見的優化算法包括:

  • 隨機梯度下降(SGD):通過對每個訓練樣本計算梯度并更新參數,計算簡單,但可能會陷入局部最小值。
  • Adam:結合了動量和自適應學習率調整的方法,能夠快速收斂且穩定性高,廣泛應用于各種深度學習任務。

二、PyTorch基礎

2.1 PyTorch簡介

PyTorch是一個開源的深度學習框架,具有以下特點:

  • 動態計算圖:支持即時計算,便于調試和修改模型結構。
  • 強大的自動微分:通過autograd模塊實現自動求導,簡化了梯度計算過程。
  • 模塊化設計:提供豐富的預定義模塊和函數,方便構建和訓練復雜的神經網絡。
  • import torch# 創建張量
    x = torch.tensor([[1, 2], [3, 4]])
    y = torch.tensor([[5, 6], [7, 8]])# 張量運算
    z = x + y
    print(z)  # tensor([[ 6,  8], [10, 12]])# 自動求導
    x = torch.tensor(2.0, requires_grad=True)
    y = x**2
    y.backward()
    print(x.grad)  # tensor(4.)

    ?

2.2 張量操作

張量是PyTorch的基本數據結構,類似于Numpy的多維數組,但支持GPU加速。常見的張量操作包括創建、索引、運算和自動求導。

2.3 構建神經網絡

在PyTorch中,神經網絡可以通過繼承nn.Module類來定義。模型的各層通過nn模塊提供的預定義層(如nn.Linearnn.Conv2d等)構建,forward方法定義了前向傳播過程。

PyTorch中的神經網絡可以通過繼承nn.Module類來定義

class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.fc1 = nn.Linear(1, 10)self.fc2 = nn.Linear(10, 1)def forward(self, x):x = F.relu(self.fc1(x))x = self.fc2(x)return xnet = Net()
print(net)

?2.4訓練模型

以一個簡單的回歸任務為例,介紹模型的訓練過程

# 生成數據
x = torch.linspace(0, 10, 100).view(-1, 1)
y = 2 * x + 1 + torch.randn(x.size()) * 0.5# 定義模型、損失函數和優化器
model = Net()
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)# 訓練模型
num_epochs = 1000
for epoch in range(num_epochs):model.train()optimizer.zero_grad()outputs = model(x)loss = criterion(outputs, y)loss.backward()optimizer.step()# 打印模型參數
for param in model.parameters():print(param.data)

2.5?模型評估

模型訓練完成后,需要對模型進行評估。常用的評估指標包括準確率、精確率、召回率等

# 生成測試數據
x_test = torch.linspace(0, 10, 100).view(-1, 1)
y_test = 2 * x_test + 1 + torch.randn(x_test.size()) * 0.5# 預測
model.eval()
with torch.no_grad():predictions = model(x_test)# 可視化
import matplotlib.pyplot as pltplt.scatter(x_test.numpy(), y_test.numpy(), label='True Data')
plt.plot(x_test.numpy(), predictions.numpy(), label='Predictions', color='red')
plt.legend()
plt.show()

三、PyTorch實戰

372fc8b991bd4e0eb2367b9190219df2.png

3.1 數據加載與預處理

PyTorch提供了torchvisiontorchtext等庫,用于處理常見的數據集。數據加載器(DataLoader)可以幫助我們高效地批量加載和預處理數據。

3.2 模型定義與訓練

模型定義包括選擇合適的層結構和激活函數。訓練過程包括以下步驟:

  1. 初始化模型:定義模型結構并初始化參數。
  2. 定義損失函數和優化器:選擇合適的損失函數和優化算法。
  3. 訓練循環
    • 前向傳播:將輸入數據傳入模型,計算輸出。
    • 計算損失:使用損失函數計算預測值與真實值之間的差距。
    • 反向傳播:計算梯度,并通過優化器更新模型參數。

3.3 模型評估與調優

訓練完成后,需要對模型進行評估。常用的評估指標包括準確率、精確率、召回率和F1分數等。根據評估結果,可以調整模型結構、參數和訓練策略,以提高模型性能。

3.4 模型保存與加載

訓練好的模型可以保存下來,以便后續使用或部署。PyTorch提供了簡單的接口來保存和加載模型,包括保存模型參數和完整模型結構。

四、深度學習的實際應用

4.1 圖像分類

圖像分類是計算機視覺中的一個基本任務。通過卷積神經網絡(CNN)可以高效地提取圖像特征并進行分類。經典的數據集包括MNIST、CIFAR-10和ImageNet等。

4.1.1 數據集

我們將使用MNIST數據集,這是一個手寫數字的圖像數據集。

from torchvision import datasets, transformstransform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
test_dataset = datasets.MNIST(root='./data', train=False, download=True, transform=transform)train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=64, shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=64, shuffle=False)

4.1?.2構建模型

我們將構建一個簡單的卷積神經網絡(CNN)來進行圖像分類。

class CNN(nn.Module):def __init__(self):super(CNN, self).__init__()self.conv1 = nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1)self.conv2 = nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1)self.fc1 = nn.Linear(64*7*7, 128)self.fc2 = nn.Linear(128, 10)def forward(self, x):x = F.relu(self.conv1(x))x = F.max_pool2d(x, 2)x = F.relu(self.conv2(x))x = F.max_pool2d(x, 2)x = x.view(-1, 64*7*7)x = F.relu(self.fc1(x))x = self.fc2(x)return xmodel = CNN()

4.1.3 訓練模型?

criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)num_epochs = 10
for epoch in range(num_epochs):model.train()for images, labels in train_loader:optimizer.zero_grad()outputs = model(images)loss = criterion(outputs, labels)loss.backward()optimizer.step()print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')

?4.1.4 模型評估

model.eval()
correct = 0
total = 0
with torch.no_grad():for images, labels in test_loader:outputs = model(images)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()print(f'Accuracy: {100 * correct / total:.2f}%')

?4.1.5 可視化

# 取一些測試數據
images, labels = iter(test_loader).next()
outputs = model(images)
_, predicted = torch.max(outputs, 1)# 顯示圖片和預測結果
fig = plt.figure(figsize=(10, 4))
for idx in np.arange(20):ax = fig.add_subplot(2, 10, idx+1, xticks=[], yticks=[])img = images[idx].numpy().squeeze()ax.imshow(img, cmap='gray')ax.set_title(f'{predicted[idx].item()}', color='green' if predicted[idx] == labels[idx] else 'red')
plt.show()

4.1.6 模型保存與加載

在訓練完模型后,我們可以將其保存下來以便后續使用。PyTorch提供了簡單的接口來保存和加載模型。

?

# 保存模型
torch.save(model.state_dict(), 'cnn_model.pth')# 加載模型
model = CNN()
model.load_state_dict(torch.load('cnn_model.pth'))

4.2 自然語言處理(NLP)

在自然語言處理領域,深度學習用于文本分類、情感分析、機器翻譯等任務。常用的模型包括循環神經網絡(RNN)、長短期記憶網絡(LSTM)和Transformer等。

import torchtext
from torchtext.data import Field, LabelField, TabularDataset, BucketIterator# 數據預處理
TEXT = Field(tokenize='spacy', tokenizer_language='en_core_web_sm', lower=True)
LABEL = LabelField(dtype=torch.float)
datafields = [("text", TEXT), ("label", LABEL)]train_data, test_data = TabularDataset.splits(path="./data", train='train.csv', test='test.csv', format='csv', skip_header=True, fields=datafields)TEXT.build_vocab(train_data, max_size=10000, vectors="glove.6B.100d")
LABEL.build_vocab(train_data)train_iterator, test_iterator = BucketIterator.splits((train_data, test_data), batch_size=64, sort_within_batch=True, sort_key=lambda x: len(x.text), device='cuda')# 構建模型
class RNN(nn.Module):def __init__(self, vocab_size, embedding_dim, hidden_dim, output_dim):super(RNN, self).__init__()self.embedding = nn.Embedding(vocab_size, embedding_dim)self.rnn = nn.LSTM(embedding_dim, hidden_dim)self.fc = nn.Linear(hidden_dim, output_dim)def forward(self, x):embedded = self.embedding(x)output, (hidden, cell) = self.rnn(embedded)hidden = torch.squeeze(hidden[-1, :, :])return self.fc(hidden)# 初始化模型
vocab_size = len(TEXT.vocab)
embedding_dim = 100
hidden_dim = 256
output_dim = 1
model = RNN(vocab_size, embedding_dim, hidden_dim, output_dim)# 使用預訓練的詞向量
pretrained_embeddings = TEXT.vocab.vectors
model.embedding.weight.data.copy_(pretrained_embeddings)# 定義損失函數和優化器
optimizer = optim.Adam(model.parameters())
criterion = nn.BCEWithLogitsLoss()# 訓練模型
model = model.to('cuda')
criterion = criterion.to('cuda')num_epochs = 5
for epoch in range(num_epochs):model.train()for batch in train_iterator:optimizer.zero_grad()predictions = model(batch.text).squeeze(1)loss = criterion(predictions, batch.label)loss.backward()optimizer.step()# 評估模型
model.eval()
with torch.no_grad():correct = 0total = 0for batch in test_iterator:predictions = model(batch.text).squeeze(1)rounded_preds = torch.round(torch.sigmoid(predictions))correct += (rounded_preds == batch.label).float().sum()total += batch.label.size(0)accuracy = correct / totalprint(f'Accuracy: {accuracy.item():.4f}')

4.3 生成對抗網絡(GAN)

生成對抗網絡(GAN)通過生成器和判別器的對抗性訓練,可以生成逼真的圖像、文本和其他數據。GAN在圖像生成、圖像修復、數據增強等方面有廣泛應用。

import torch
import torch.nn as nn
import torch.optim as optim# 定義生成器
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.Tanh())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.LeakyReLU(0.2),nn.Linear(128, 1),nn.Sigmoid())def forward(self, x):return self.model(x)# 初始化模型
latent_dim = 100
img_dim = 28 * 28
generator = Generator(latent_dim, img_dim)
discriminator = Discriminator(img_dim)# 定義損失函數和優化器
adversarial_loss = nn.BCELoss()
optimizer_G = optim.Adam(generator.parameters(), lr=0.0002)
optimizer_D = optim.Adam(discriminator.parameters(), lr=0.0002)# 訓練GAN
num_epochs = 20000
for epoch in range(num_epochs):# 訓練判別器real_imgs = torch.randn(64, img_dim)  # 使用隨機數據代替真實圖像valid = torch.ones(64, 1)fake = torch.zeros(64, 1)optimizer_D.zero_grad()real_loss = adversarial_loss(discriminator(real_imgs), valid)z = torch.randn(64, latent_dim)gen_imgs = generator(z)fake_loss = adversarial_loss(discriminator(gen_imgs.detach()), fake)d_loss = (real_loss + fake_loss) / 2d_loss.backward()optimizer_D.step()# 訓練生成器optimizer_G.zero_grad()g_loss = adversarial_loss(discriminator(gen_imgs), valid)g_loss.backward()optimizer_G.step()if epoch % 1000 == 0:print(f'Epoch {epoch}, D loss: {d_loss.item()}, G loss: {g_loss.item()}')

五、總結

深度學習是一種基于人工神經網絡的機器學習方法,模擬人腦神經元的工作機制,通過多層神經元的組合進行數據特征的提取和模式識別。神經網絡由輸入層、隱藏層和輸出層組成。輸入層接收外部數據,隱藏層對數據進行特征提取和非線性變換,輸出層生成預測結果。神經網絡通過調整神經元之間的連接權重來學習數據中的模式和規律。

PyTorch是一個開源的深度學習框架,以其動態計算圖和易用性而廣受歡迎。PyTorch的基本數據結構是張量,類似于Numpy的多維數組,但支持GPU加速。PyTorch的核心模塊包括torch用于張量操作,torch.nn用于構建神經網絡,torch.optim用于定義優化算法,以及torch.autograd用于自動求導。?

0b358190167a4401ad8bd1408871d229.png

?

?

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

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

相關文章

成都青年AI人才嶄露頭角,知了匯智科技助力孵化營大放異彩

5月18日-19日,為期兩天的成都國際商貿城青年(大學生)AI應用孵化營活動在熱烈的氛圍中圓滿落幕。本次活動由成都國際商貿城、成都成商數字科技有限公司、成都知了匯智科技有限公司及成都電商職教集團聯合舉辦,旨在為青年&#xff0…

丟失api-ms-win-crt-runtime-l1-1-0.dll的多種解決方法分析,教你簡單的一鍵修復

在使用Windows操作系統時,用戶可能會遇到一個涉及丟失 ?api-ms-win-crt-runtime-l1-1-0.dll文件的警告,這可能導致某些程序無法正常運行。該DLL文件屬于Microsoft Visual C Redistributable軟件包的一部分,這個軟件包為多個應用提供運行時支…

Mybatis-plus的兩種分頁方案

Mybatis-plus的兩種分頁方案 底層的邏輯是寫出最終執行的sql或者selectPage方法等,中間需要配置相應的page攔截器。 注意:如沒有配置攔截器,直接執行就會存在total的值為0,此方法無效。 1. 基于MP的IPage接口實現 使用步驟&am…

深度學習-Softmax回歸+損失函數+圖像分類數據集

目錄 Softmax回歸回歸 VS 分類Kaggle上的分類問題 從回歸到多類分類回歸分類從回歸到多類分類-均方損失從回歸到多類分類-無校驗比例從回歸到多類分類-校驗比例 Softmax和交叉熵損失總結損失函數均方損失絕對值損失函數魯棒損失 圖像分類數據集通過框架中內置函數將FashionMNIS…

RabbitMQ---交換機-Fanout-Direct

Publisher:生產者,不再發送消息到隊列中,而是發給交換機Exchange:交換機,一方面,接收生產者發送的消息。另一方面,知道如何處理消息,例如遞交給某個特別隊列、遞交給所有隊列、或是將…

刪除實例分割中的特定標簽

用labelme軟件對圖像進行實例分割或語義分割標注后會得到json文件,如果想要刪除某個特定標簽,可以使用如下代碼,完整代碼下載地址:代碼地址 import json import os# 要處理的json文件夾路徑 folder_path H:/json # 需要刪除的標…

如何一鍵生成多個文本二維碼?excel表格批量生碼的方法

現在很多人會將文本信息做成二維碼來展示,當有同類型內容生成大量二維碼時,可以使用將文本導入excel表格的方式,將表格中的每條數據批量生成二維碼,可以有效提升二維碼制作的速度和效率。下面就讓小編來將具體的操作步驟分享給大家…

LangChain API 2.0

轉載整理自:https://api.python.langchain.com/en/latest/langchain_api_reference.html 文章目錄 1、langchain.agentsClassesFunctions 2、langchain.callbacksClasses 3、langchain.chainsClassesFunctions 4、langchain.embeddingsClasses 5、langchain.evaluat…

二叉樹順序結構及鏈式結構

一.二叉樹的順序結構 1.定義:使用數組存儲數據,一般使用數組只適合表示完全二叉樹,此時不會有空間的浪費 注:二叉樹的順序存儲在邏輯上是一顆二叉樹,但是在物理上是一個數組,此時需要程序員自己想清楚調整…

http流式返回

HTTP流式返回(Stream)是一種服務器向客戶端傳輸數據的方式允許數據分塊發送而不是一次性發送完畢。 這樣客戶端可以在接收到第一部分數據時就開始處理,而不必等待整個響應完成。 應用場景: 2.1 業務場景:圖表的監聽&a…

手動安裝maven依賴到本地倉庫

使用mvn install命令安裝jar包到指定的倉庫。 命令如下: mvn install:install-file -Dmaven.repo.localC:\Users\liyong.m2\repository -DgroupIdcom.aspose -DartifactIdwords -Dversion18.4 -Dpackagingjar -DfileC:\Users\liyong\Desktop\jar\words-18.4.jar 解釋…

grafana + Prometheus + node-exporter + pushgateway + alertmanager的監控解決方案

業內比較著名的監控解決方案,據筆者所知,大概是三套: 一個是zabbix的解決方案,一個是prometheusgrafana,一個是ELK zabbix比較重,而且原生支持監控SNMP,自帶一個儀表盤,不需要額外…

docker redis 持久化

1、拉取redis鏡像 docker pull redis:latest 2、 mkdir /data/redis 3、填充redis.conf文件及根據需求修改相應的配置 ?通過官網地址找到對應版本的配置文件 ?將配置信息復制到redis.conf中 ?常見的修改配置 https://redis.io/docs/latest/operate/oss_and_stack/managem…

高仿果汁導航模板

參考原文:果汁導航風格模板_1234FCOM專注游戲工具及源碼例子分享 極速云

sdut pta 鏈表3(優化)-----7-3 sdut-C語言實驗-鏈表的結點插入

7-3 sdut-C語言實驗-鏈表的結點插入 分數 20 全屏瀏覽 切換布局 作者 馬新娟 單位 山東理工大學 給出一個只有頭指針的鏈表和 n 次操作,每次操作為在鏈表的第 m 個元素后面插入一個新元素x。若m 大于鏈表的元素總數則將x放在鏈表的最后。 輸入格式: 多組輸入。…

基于springboot的畢業設計系統的開發源碼

風定落花生,歌聲逐流水,大家好我是風歌,混跡在java圈的辛苦碼農。今天要和大家聊的是一款基于springboot的畢業設計系統的開發。項目源碼以及部署相關請聯系風歌,文末附上聯系信息 。 項目簡介: 畢業設計系統能夠實現…

學習通高分免費刷課實操教程

文章目錄 概要整體架構流程詳細步驟云上全平臺登錄步驟小結 概要 我之前提到過一個通過瀏覽器的三個腳本就可以免費高分刷課的文章,由于不方便拍視頻進行實操演示,然后寫下了這個實操教程,之前的三個腳本劃到文章末尾 整體架構流程 整體大…

窗口函數 | rows between …… and ……

ROWS BETWEEN ... AND ... 是 SQL 窗口函數中的一個子句&#xff0c;用于定義窗口函數操作的行范圍。窗口函數允許用戶對一組相關的記錄執行計算&#xff0c;這些記錄被稱為窗口。 基本語法 <窗口函數> OVER ( [PARTITION BY <列名>] ORDER BY <列名> [AS…

前端基礎入門三大核心之HTML篇 —— SVG的viewBox、width和height:繪制矢量圖的魔法比例尺【含代碼示例】

前端基礎入門三大核心之HTML篇 —— SVG的viewBox、width和height&#xff1a;繪制矢量圖的魔法比例尺【含代碼示例】 基本概念與作用viewBoxwidth和height 代碼示例與實踐基礎示例動態調整示例 不同角度的使用思路保持比例縮放自動適應容器 實際問題與解決方案結語與討論 在前…

華為云之Zabbix監控平臺部署實踐

華為云之Zabbix監控平臺部署實踐 一、本次實踐介紹1.1 實踐環境簡介1.3 本次實踐完成目標 二、 相關服務介紹2.1 華為云ECS云服務器介紹2.2 Zabbix介紹 三、環境準備工作3.1 預置實驗環境3.2 查看預置環境信息 四、登錄華為云4.1 登錄華為云4.2 查看ECS狀態4.3 連接ECS彈性云服…