首页 > 其他分享 >[Day 38] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

[Day 38] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

时间:2024-07-29 14:58:55浏览次数:9  
标签:實踐 我們 38 一個 self torch 計算 技術 PyTorch

深度學習框架介紹:PyTorch

1. PyTorch概述

PyTorch是一個開源的深度學習框架,由Facebook的人工智能研究小組開發。它以其易用性和動態計算圖的特性而聞名,這使得研究人員和開發者能夠更加靈活地進行模型設計和調試。與其他框架(如TensorFlow)相比,PyTorch的語法更加接近於Python,這使得它非常適合於研究和快速原型設計。

2. PyTorch的核心概念

2.1 張量 (Tensor)

在PyTorch中,張量是基本的數據結構。張量類似於NumPy中的多維數組,但與NumPy不同的是,PyTorch的張量可以在GPU上進行運算,這大大加快了深度學習模型的訓練速度。

import torch

# 創建一個5x3的矩陣,不初始化數值
x = torch.empty(5, 3)
print(x)

這段代碼創建了一個5x3的未初始化的張量。torch.empty不會設置初始值,因此矩陣中的數據是未定義的。這在需要快速分配內存的情況下特別有用。

# 創建一個隨機初始化的矩陣
x = torch.rand(5, 3)
print(x)

這段代碼創建了一個隨機初始化的5x3矩陣。torch.rand生成的是均勻分佈在區間 [0, 1) 內的隨機數。

# 創建一個全為0的矩陣,並指定數據類型為long
x = torch.zeros(5, 3, dtype=torch.long)
print(x)

torch.zeros 創建了一個全為0的張量。通過指定 dtypetorch.long,可以設置張量中的數據類型為長整型。

2.2 自動微分 (Autograd)

自動微分是PyTorch中的一個核心特性,它能夠自動計算張量的梯度。這在反向傳播(backpropagation)中非常有用,因為反向傳播是深度學習模型訓練過程中的關鍵步驟。

x = torch.ones(2, 2, requires_grad=True)
y = x + 2
print(y)

這段代碼創建了一個值全為1的張量 x,並且設置了 requires_grad=True,這意味著PyTorch將開始為這個張量構建計算圖,以便稍後進行梯度計算。然後進行加法操作,生成張量 y

z = y * y * 3
out = z.mean()
print(z, out)

這段代碼中,我們對 y 進行了一些數學運算,得到 z。最後,我們計算 z 的平均值並存儲在 out 中。由於 xrequires_grad=True,這些操作都會被記錄在計算圖中,這使得我們可以隨後使用 out.backward() 進行反向傳播。

out.backward()
print(x.grad)

這裡我們調用了 out.backward(),這將計算 out 相對於 x 的梯度,並將結果存儲在 x.grad 中。

3. 使用PyTorch構建神經網絡

3.1 構建一個簡單的線性回歸模型
import torch.nn as nn
import torch.optim as optim

# 定義模型
class LinearRegressionModel(nn.Module):
    def __init__(self):
        super(LinearRegressionModel, self).__init__()
        self.linear = nn.Linear(1, 1)
    
    def forward(self, x):
        return self.linear(x)

model = LinearRegressionModel()
print(model)

這段代碼定義了一個簡單的線性回歸模型。nn.Module 是所有神經網絡模型的基類。在模型的 __init__ 方法中,我們定義了一個線性層 self.linear,它將一個輸入特徵映射到一個輸出特徵。在 forward 方法中,我們定義了前向傳播的計算,即對輸入 x 應用線性層。

3.2 訓練模型
# 生成一些數據
x_train = torch.tensor([[1.0], [2.0], [3.0], [4.0]])
y_train = torch.tensor([[2.0], [4.0], [6.0], [8.0]])

# 定義損失函數和優化器
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 訓練過程
for epoch in range(100):
    model.train()
    
    # 向前傳播
    y_pred = model(x_train)
    
    # 計算損失
    loss = criterion(y_pred, y_train)
    
    # 向後傳播和優化
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    
    print(f'Epoch {epoch+1}: loss = {loss.item()}')

在這段代碼中,我們首先生成了一些簡單的訓練數據。然後,我們定義了均方誤差損失函數 nn.MSELoss() 和隨機梯度下降優化器 optim.SGD。在訓練循環中,我們先將模型設置為訓練模式,然後計算前向傳播的結果 y_pred。接著,我們計算損失 loss,並通過 loss.backward() 進行反向傳播計算梯度。最後,我們調用 optimizer.step() 更新模型參數。

3.3 評估模型
# 評估模型
model.eval()
with torch.no_grad():  # 關閉自動求導
    y_test = model(x_train)
    loss = criterion(y_test, y_train)
    print(f'Test loss: {loss.item()}')

在評估階段,我們將模型設置為評估模式 model.eval(),這會關閉一些特定於訓練的操作(如dropout)。然後,我們使用 torch.no_grad() 來臨時禁用梯度計算,這可以節省內存並加速計算。最後,我們計算測試損失。

4. PyTorch的優勢與應用

PyTorch因其動態計算圖和易用性而廣受歡迎。動態計算圖允許在運行時定義和修改計算圖,這使得調試更加直觀。此外,PyTorch的強大社區和豐富的生態系統也為其廣泛應用提供了支持,包括計算機視覺、自然語言處理、生成對抗網絡等領域。

4.1 動態計算圖的靈活性

動態計算圖使得模型的結構可以在每次迭代中有所不同,這對於一些需要動態改變計算流程的模型(如可變長度輸入的RNN)特別有用。

class DynamicRNN(nn.Module):
    def __init__(self, input_size, hidden_size):
        super(DynamicRNN, self).__init__()
        self.hidden_size = hidden_size
        self.rnn = nn.RNN(input_size, hidden_size)
    
    def forward(self, x, lengths):
        packed = torch.nn.utils.rnn.pack_padded_sequence(x, lengths, batch_first=True)
        packed_output, _ = self.rnn(packed)
        output, _ = torch.nn.utils.rnn.pad_packed_sequence(packed_output, batch_first=True)
        return output

rnn = DynamicRNN(10, 20)

這段代碼展示了一個動態RNN的示例,能夠處理可變長度的輸入數據。這在自然語言處理中的句子分類任務中非常常見。

4.2 社區與資源

PyTorch擁有一個活躍的開發者社區,並且有大量的教程、文檔和預訓練模型可供使用。這使得學習和使用PyTorch更加容易,特別是對於新手來說。

5. 結論

PyTorch因其易用性和靈活性而成為深度學習研究和開發中的一個重要工具。無論是初學者還是經驗豐富的開發者,都可以從其動態計算圖、豐富的工具和活躍的社區中受益。隨著人工智能領域的不斷發展,PyTorch也將繼續成為推動創新和實踐的重要力量。

标签:實踐,我們,38,一個,self,torch,計算,技術,PyTorch
From: https://blog.csdn.net/2401_83208854/article/details/140756581

相关文章

  • spellman电源维修XRM50P50X3839 NY11788
    电源维修的常见故障包括:无法开机、电源烧、短路、输出偏小、电源不通电、电源风扇不转,无输出,缺项,输出过高,电源烧毁,灯不亮,不动作等故障维修。Spellman的专有高压技术,再加上MT电路,导致了一个紧凑和轻量级的模块,是理想的OEM应用布置来获得的高压输出,而较低的电压单元则采用稳健......
  • [Day 37] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
    區塊鏈的智能合約開發1.什麼是智能合約?智能合約是自動執行的合約,其條款由程式碼直接寫入區塊鏈。當滿足特定條件時,智能合約自動執行預定的操作,無需中間人參與。這種技術帶來了合約執行的透明性和可信性。2.智能合約的優勢自動化執行:智能合約一旦部署並觸發條件,將自動執行......
  • [lnsyoj538/luoguP3628/APIO2010]特别行动队
    题意原题链接给定序列\(a\)和自定义二次函数\(f(x)=ax^2+bx+c(a<0)\),要求将\(a\)分为几段(不妨设为\(k\)段),使得\(\sum_{i=1}^{k}f(\sum_{j=l_i}^{r_i}a_j)\)的值最大,求最大的值sol设计状态转移方程。显然,\(dp_i\)可以由\(dp_j\)转移当且仅当\(j<i\),这表示......
  • 24暑假算法刷题 | Day21 | LeetCode 669. 修剪二叉搜索树,108. 将有序数组转换为二叉搜
    目录669.修剪二叉搜索树题目描述题解108.将有序数组转换为二叉搜索树题目描述题解538.把二叉搜索树转换为累加树题目描述题解669.修剪二叉搜索树点此跳转题目链接题目描述给你二叉搜索树的根节点root,同时给定最小边界low和最大边界high。通过修剪二叉......
  • 精细化管理:项目经理日常管理的38项要务!
    在当今快速变化的商业环境中,项目管理作为推动企业战略目标实现的关键环节,其重要性日益凸显。作为项目管理的核心角色,项目经理不仅需要具备全面的知识和技能,更需要在日常管理中实施精细化管理策略,以确保项目的高效、高质完成。对于项目经理而言,实施精细化管理意味着要在项目......
  • 代码随想录算法训练营Day7 | Leetcode 454 四数相加Ⅱ Leetcode 383 赎金信 Leetcode
    前言今天的四道题目稍稍有点难度,需要理解和反复记忆才行。四数相加类比于两数之和,赎金信类比于异位词,三数之和和四数之和自成体系,可以推广到n数之和。Leetcode454四数相加Ⅱ题目链接:454.四数相加II-力扣(LeetCode)代码随想录题解:代码随想录(programmercarl.com)思路:......
  • iOS开发基础138-视频编码
    为完善视频编码的封装和提供一定的拓展性,以下是视频编码的详细示例,其中包括编码参数设置和数据提取处理。以下示例侧重于视频编码部分。视频编码器示例下面的代码示例展示了一个视频编码器的实现,包括如何设置关键编码参数和从回调中提取H.264数据。//VideoEncoder.h#import<......
  • # 代码随想录算法训练营第38天 | 01背包问题:1049.最后一块石头的重量II(最多能装多少)、
    1049.最后一块石头的重量IIhttps://leetcode.cn/problems/last-stone-weight-ii/代码随想录https://programmercarl.com/1049.最后一块石头的重量II.html#算法公开课494.目标和https://leetcode.cn/problems/target-sum/description/代码随想录https://programmercarl.com......
  • 代码随想录day7 | 454 四数相加|| 383 赎金信 15 三数之和 18 四数之和
    454四个数相加==0funcfourSumCount(nums1[]int,nums2[]int,nums3[]int,nums4[]int)int{ //1.用哈希表存储nums1和nums2两者之和的所有可能情况 //2.遍历nums3和nums4两者之和的相反数,如果在哈希表中存在,则结果加上哈希表中的值 //3.返回结果 sum1:......
  • UNS0881a-P,V1 3BHB006338R0001 可编程控制器PLC
    产品型号:UNS0881a-P,V13BHB006338R0001产品类别:可编程控制器PLC产品成色:全新、非全新质量保障:365天原产地;美国库存;有货品牌;ABBUNS0881a-P,V13BHB006338R0001控制板是一种电子设备,主要用于控制和管理各种电气设备。它通常由主控芯片、外设接口、电源模块、存储模......