入門 PyTorch ,這70個操作技巧就夠了

Pytorch 是當下最流行的算法框架,很多大模型都是基于Pytorch 搭建而成,它提供了大量操作用于創建和訓練神經網絡。

今天給大家分享 Pytorch 的19個方面,涉及到70個細節操作,這部分內容梳理花了我一天的時間,喜歡記得點個贊

本文從 Pytorch 的操作開始分享,

  • 創建張量

  • 張量屬性

  • 張量索引、切片與拼接

  • 張量變換

  • 數學運算

  • 匯總統計

  • 梯度相關

  • 數據管理

  • 其他操作基礎操作

  • 自動求導

  • 神經網絡模塊

  • 數據加載與處理

  • 損失函數

  • 優化器

  • 模型訓練與驗證

  • 模型保存與加載

  • GPU 加速

  • 模型調優

  • 遷移學習

技術交流&資料

技術要學會分享、交流,不建議閉門造車。一個人可以走的很快、一堆人可以走的更遠。

成立了 Pytorch 算法面試和技術交流群,相關資料、技術交流&答疑,均可加我們的交流群獲取,群友已超過2000人,添加時最好的備注方式為:來源+興趣方向,方便找到志同道合的朋友。

方式①、微信搜索公眾號:機器學習社區,后臺回復:加群
方式②、添加微信號:mlc2040,備注:來自CSDN + 技術交流

創建張量

torch.tensor(data): 從數據創建張量

這個函數會根據提供的數據創建一個新的張量。數據可以是列表、數組等。

import torchdata = [1, 2, 3, 4, 5]
tensor_data = torch.tensor(data)
print(tensor_data)

torch.zeros(size): 創建元素全為0的張量

創建一個指定大小的張量,其中所有元素的值都為0。

import torchsize = (2, 3)
zeros_tensor = torch.zeros(size)
print(zeros_tensor)

torch.ones(size): 創建元素全為1的張量

創建一個指定大小的張量,其中所有元素的值都為1。

import torchsize = (2, 3)
ones_tensor = torch.ones(size)
print(ones_tensor)

torch.empty(size): 創建未初始化的張量

創建一個指定大小的未初始化張量,其值取決于內存的狀態。

import torchsize = (2, 3)
empty_tensor = torch.empty(size)
print(empty_tensor)

torch.randn(size): 創建服從標準正態分布的張量

創建一個指定大小的張量,其中的元素值是從標準正態分布中隨機抽取的。

import torchsize = (2, 3)
randn_tensor = torch.randn(size)
print(randn_tensor)

torch.arange(start, end, step): 創建一個范圍內的一維張量

創建一個一維張量,其中的元素值從起始值到結束值,步長為給定的步長。

import torchstart = 0
end = 5
step = 1
arange_tensor = torch.arange(start, end, step)
print(arange_tensor)

torch.linspace(start, end, steps): 創建一個在指定范圍內均勻間隔的張量

創建一個一維張量,其中的元素值在指定范圍內均勻分布。

import torchstart = 0
end = 5
steps = 5
linspace_tensor = torch.linspace(start, end, steps)
print(linspace_tensor)

張量屬性

.dtype: 獲取張量的數據類型

返回張量中元素的數據類型。

import torchtensor = torch.tensor([1, 2, 3])
print(tensor.dtype)

.shape: 獲取張量的形狀

返回一個元組,表示張量的形狀。

import torchtensor = torch.tensor([[1, 2, 3], [4, 5, 6]])
print(tensor.shape)

.device: 獲取張量所在的設備

返回一個字符串,表示張量所在的設備,如’cpu’或’cuda:0’。

import torchtensor = torch.tensor([1, 2, 3])
print(tensor.device)

張量索引、切片與拼接

tensor[index]: 索引操作

使用索引來訪問張量中的元素。

import torchtensor = torch.tensor([[1, 2, 3], [4, 5, 6]])
element = tensor[0, 1]  # Accesses the element at row 0, column 1
print(element)

tensor[start:end]: 切片操作

使用切片來獲取張量的子張量。

import torchtensor = torch.tensor([[1, 2, 3], [4, 5, 6]])
sub_tensor = tensor[:, 1:]  # Slices the tensor to get all rows and columns starting from the second column
print(sub_tensor)

torch.cat(tensors, dim): 在給定維度上連接張量

沿著指定維度將多個張量連接在一起。

import torchtensor1 = torch.tensor([[1, 2], [3, 4]])
tensor2 = torch.tensor([[5, 6], [7, 8]])
concatenated_tensor = torch.cat((tensor1, tensor2), dim=0)  # Concatenates along the row dimension
print(concatenated_tensor)

torch.stack(tensors, dim): 在新維度上堆疊張量

在一個新的維度上堆疊多個張量。

import torchtensor1 = torch.tensor([1, 2, 3])
tensor2 = torch.tensor([4, 5, 6])
stacked_tensor = torch.stack((tensor1, tensor2), dim=1)  # Stacks tensors along a new dimension
print(stacked_tensor)

張量變換

tensor.view(shape): 返回給定形狀的張量視圖

返回一個具有指定形狀的新張量,原始張量的形狀必須與新形狀兼容。

import torchtensor = torch.tensor([[1, 2], [3, 4]])
reshaped_tensor = tensor.view(1, 4)  # Reshapes the tensor to a 1x4 tensor
print(reshaped_tensor)

tensor.reshape(shape): 改變張量的形狀

返回一個具有指定形狀的新張量,原始張量的元素數量必須與新形狀一致。

import torchtensor = torch.tensor([[1, 2], [3, 4]])
reshaped_tensor = tensor.reshape(1, 4)  # Reshapes the tensor to a 1x4 tensor
print(reshaped_tensor)

tensor.transpose(dim0, dim1): 交換兩個維度

交換張量中兩個維度的位置。

import torchtensor = torch.tensor([[1, 2], [3, 4]])
transposed_tensor = tensor.transpose(0, 1)  # Swaps the first and second dimensions
print(transposed_tensor)

tensor.permute(*dims): 按照指定順序排列張量的維度

按照給定順序重新排列張量的維度。

import torchtensor = torch.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
permuted_tensor = tensor.permute(1, 0, 2)  # Permutes the dimensions to (1, 0, 2)
print(permuted_tensor)

tensor.squeeze(): 刪除所有長度為1的維度

刪除張量中所有長度為1的維度。

import torchtensor = torch.tensor([[[1, 2], [3, 4]]])
squeezed_tensor = tensor.squeeze()  # Removes the single-dimensional entries
print(squeezed_tensor)

tensor.unsqueeze(dim): 在指定位置增加一個維度

在指定位置增加一個長度為1的新維度。

import torchtensor = torch.tensor([[1, 2], [3, 4]])
unsqueezed_tensor = tensor.unsqueeze(0)  # Adds a dimension at index 0
print(unsqueezed_tensor)

數學運算

torch.add(x, y): 加法

對兩個張量進行逐元素加法運算。

import torchx = torch.tensor([1, 2, 3])
y = torch.tensor([4, 5, 6])
result = torch.add(x, y)
print(result)

torch.sub(x, y): 減法

對兩個張量進行逐元素減法運算。

import torchx = torch.tensor([1, 2, 3])
y = torch.tensor([4, 5, 6])
result = torch.sub(x, y)
print(result)

torch.mul(x, y): 乘法

對兩個張量進行逐元素乘法運算。

import torchx = torch.tensor([1, 2, 3])
y = torch.tensor([4, 5, 6])
result = torch.mul(x, y)
print(result)

torch.div(x, y): 除法

對兩個張量進行逐元素除法運算。

import torchx = torch.tensor([1.0, 2.0, 3.0])
y = torch.tensor([4.0, 5.0, 6.0])
result = torch.div(x, y)
print(result)

torch.matmul(x, y): 矩陣乘法

計算兩個張量的矩陣乘法。

import torchx = torch.tensor([[1, 2], [3, 4]])
y = torch.tensor([[5, 6], [7, 8]])
result = torch.matmul(x, y)
print(result)

torch.pow(base, exponent): 冪運算

計算張量的冪。

import torchbase = torch.tensor([1, 2, 3])
exponent = 2
result = torch.pow(base, exponent)
print(result)

torch.exp(tensor): 指數運算

計算張量中所有元素的指數。

import torchtensor = torch.tensor([1.0, 2.0, 3.0])
result = torch.exp(tensor)
print(result)

torch.sqrt(tensor): 開方運算

計算張量中所有元素的平方根。

import torchtensor = torch.tensor([1.0, 4.0, 9.0])
result = torch.sqrt(tensor)
print(result)

匯總統計

torch.sum(input): 求和

計算張量中所有元素的和。

import torchtensor = torch.tensor([[1, 2], [3, 4]])
result = torch.sum(tensor)
print(result)

torch.mean(input): 求平均值

計算張量中所有元素的平均值。

import torchtensor = torch.tensor([[1, 2], [3, 4]], dtype=torch.float)
result = torch.mean(tensor)
print(result)

torch.max(input): 求最大值

找出張量中所有元素的最大值。

import torchtensor = torch.tensor([[1, 2], [3, 4]])
result = torch.max(tensor)
print(result)

torch.min(input): 求最小值

找出張量中所有元素的最小值。

import torchtensor = torch.tensor([[1, 2], [3, 4]])
result = torch.min(tensor)
print(result)

torch.std(input): 求標準差

計算張量中所有元素的標準差。

import torchtensor = torch.tensor([[1, 2], [3, 4]], dtype=torch.float)
result = torch.std(tensor)
print(result)

torch.var(input): 求方差

計算張量中所有元素的方差。

import torchtensor = torch.tensor([[1, 2], [3, 4]], dtype=torch.float)
result = torch.var(tensor)
print(result)

梯度相關

tensor.requires_grad_(): 標記張量需要計算梯度

標記張量以便在反向傳播中計算梯度。

import torchtensor = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)

tensor.grad: 獲取張量的梯度

獲取張量的梯度值,前提是該張量需要計算梯度。

import torchtensor = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
tensor.sum().backward()
print(tensor.grad)

tensor.backward(): 計算梯度

計算張量的梯度值,前提是該張量需要計算梯度。

import torchtensor = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
tensor.sum().backward()

數據管理

tensor.to(device): 將張量移動到指定的設備上(如GPU)

將張量移動到指定的設備上,例如GPU。

import torchtensor = torch.tensor([1, 2, 3])
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
tensor = tensor.to(device)
print(tensor.device)

torch.save(obj, f): 保存對象到文件

將對象保存到文件中。

import torchtensor = torch.tensor([1, 2, 3])
torch.save(tensor, 'tensor.pt')  # Save tensor to file

torch.load(f): 從文件加載對象

從文件中加載對象。

import torchtensor = torch.load('tensor.pt')  # Load tensor from file
print(tensor)

其他操作基礎操作

torch.nn.functional.relu(input): 應用ReLU激活函數

對輸入張量應用ReLU激活函數。

import torch.nn.functional as F
import torchinput = torch.tensor([-1, 0, 1], dtype=torch.float)
output = F.relu(input)
print(output)

torch.nn.Conv2d(in_channels, out_channels, kernel_size): 創建二維卷積層

創建一個二維卷積層。

import torch.nn as nn
import torchconv_layer = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3)
input = torch.randn(1, 3, 64, 64)
output = conv_layer(input)
print(output.shape)

torch.optim.SGD(params, lr): 使用SGD優化器

使用隨機梯度下降(SGD)優化器來優化模型參數。

import torch.optim as optim
import torchparams = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
optimizer = optim.SGD([params], lr=0.1)

自動求導(Autograd)

自動求導是 PyTorch 中一個重要的功能,能夠自動計算張量的梯度。

import torchx = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
y = x ** 2
y.backward(torch.tensor([1.0, 1.0, 1.0]))  # 計算 y 對 x 的梯度
print(x.grad)  # 輸出梯度值

神經網絡模塊(nn.Module)

使用 nn.Module 類來定義神經網絡模型,可以方便地管理和組織模型的結構。

import torch.nn as nn
import torchclass Net(nn.Module):def __init__(self):super(Net, self).__init__()self.fc = nn.Linear(10, 1)def forward(self, x):return self.fc(x)model = Net()

數據加載與處理(Data Loading and Processing)

使用 DataLoader 和 Dataset 類來加載和處理數據集。

import torch
from torch.utils.data import DataLoader, Datasetclass CustomDataset(Dataset):def __init__(self, data):self.data = datadef __len__(self):return len(self.data)def __getitem__(self, index):return self.data[index]data = [1, 2, 3, 4, 5]
dataset = CustomDataset(data)
dataloader = DataLoader(dataset, batch_size=2, shuffle=True)

損失函數(Loss Functions)

使用損失函數來衡量模型輸出與真實標簽之間的差異。

import torch.nn as nn
import torchcriterion = nn.CrossEntropyLoss()
output = torch.tensor([[0.1, 0.2, 0.7], [0.3, 0.6, 0.1]])
target = torch.tensor([2, 1])
loss = criterion(output, target)
print(loss)

優化器(Optimizers)

使用優化器來更新模型的參數,常見的優化器包括 SGD、Adam 等。

import torch.optim as optim
import torchmodel = Net()
optimizer = optim.SGD(model.parameters(), lr=0.01)

模型訓練與驗證(Model Training and Validation)

使用 PyTorch 來訓練和驗證神經網絡模型。

import torch.nn as nn
import torch.optim as optim
import torchmodel = Net()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)for epoch in range(10):# 訓練模型for data in dataloader:inputs, labels = dataoptimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()# 驗證模型with torch.no_grad():# 計算準確率等指標

模型保存與加載(Model Saving and Loading)

在訓練完成后,將模型保存到文件中以便后續使用。

import torchtorch.save(model.state_dict(), 'model.pth')  # 保存模型參數

GPU 加速(GPU Acceleration)

利用 GPU 加速計算可以顯著提高模型訓練的速度。

import torchdevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = Net().to(device)  # 將模型移動到 GPU 上

模型調優(Model Tuning)

使用交叉驗證和超參數搜索來調優模型,以提高模型性能。

from sklearn.model_selection import GridSearchCV
import torchparameters = {'lr': [0.01, 0.1, 1.0]}
model = Net()
optimizer = optim.SGD(model.parameters(), lr=0.01)
grid_search = GridSearchCV(optimizer, parameters)

遷移學習(Transfer Learning)

遷移學習是一種常見的訓練技巧,可以使用預訓練的模型來加速模型的訓練過程。

import torchvision.models as models
import torchpretrained_model = models.resnet18(pretrained=True)
# 將預訓練模型的參數凍結
for param in pretrained_model.parameters():param.requires_grad = False

最后

掌握以上19種操作方法可以讓你更好地使用 PyTorch 進行深度學習任務。這些操作方法涵蓋了張量的創建、變換、數學運算、梯度計算、模型構建、數據處理等方面,是使用 PyTorch 進行深度學習的基礎操作。

用通俗易懂的方式講解系列

  • 重磅來襲!《大模型面試寶典》(2024版) 發布!

  • 重磅來襲!《大模型實戰寶典》(2024版) 發布!

  • 用通俗易懂的方式講解:不用再找了,這是大模型最全的面試題庫

  • 用通俗易懂的方式講解:這是我見過的最適合大模型小白的 PyTorch 中文課程

  • 用通俗易懂的方式講解:一文講透最熱的大模型開發框架 LangChain

  • 用通俗易懂的方式講解:基于 LangChain + ChatGLM搭建知識本地庫

  • 用通俗易懂的方式講解:基于大模型的知識問答系統全面總結

  • 用通俗易懂的方式講解:ChatGLM3 基礎模型多輪對話微調

  • 用通俗易懂的方式講解:最火的大模型訓練框架 DeepSpeed 詳解來了

  • 用通俗易懂的方式講解:這應該是最全的大模型訓練與微調關鍵技術梳理

  • 用通俗易懂的方式講解:Stable Diffusion 微調及推理優化實踐指南

  • 用通俗易懂的方式講解:大模型訓練過程概述

  • 用通俗易懂的方式講解:專補大模型短板的RAG

  • 用通俗易懂的方式講解:大模型LLM Agent在 Text2SQL 應用上的實踐

  • 用通俗易懂的方式講解:大模型 LLM RAG在 Text2SQL 上的應用實踐

  • 用通俗易懂的方式講解:大模型微調方法總結

  • 用通俗易懂的方式講解:漲知識了,這篇大模型 LangChain 框架與使用示例太棒了

  • 用通俗易懂的方式講解:掌握大模型這些優化技術,優雅地進行大模型的訓練和推理!

  • 用通俗易懂的方式講解:九大最熱門的開源大模型 Agent 框架來了

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

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

相關文章

騎馬與砍殺戰團mod制作-基礎-對話制作筆記(四)

騎馬與砍殺戰團mod制作-基礎-對話制作筆記(四) 資料來源 學習的資料來源: b站【三嘯解說】手把手教你做【騎砍】MOD,基礎篇,鏈接為: https://www.bilibili.com/video/BV19x411Q7No?p4&vd_sourcea507…

免費領!系統學習上位機編程的流程與基礎教程

上位機電氣自動化plc編程全套入門教程工具 華山編程導師根據當前招聘需求的關鍵點,原創錄制了一套系統的學習流程和基礎教程,幫助你從快速入門到掌握上位機編程的技能。 二. 學習準備 為了更好地學習并實現80%以上的代碼運行,建議準備一個工…

Android音頻系統

最近在做UAC的項目,大概就是接收內核UAC的事件,也就是聲音相關事件。然后就是pcm_read和AudioTrackr->write之間互傳。感覺略微有點奇怪,所以簡單總結一下。 1 UAC的簡要流程 open_netlink_socket 打開內核窗口,類似于ioctl。…

[leetcode]valid-triangle-number. 有效三角形的個數

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int triangleNumber(vector<int>& nums) {int n nums.size();sort(nums.begin(), nums.end());int ans 0;for (int i 0; i < n; i) {for (int j i 1; j < n; j) {int left j 1, righ…

大模型RAG技術:構建高效、可信賴的知識檢索系統

前言 LLM 問題 幻覺&#xff1a;在沒有答案的情況下提供虛假信息。 過時&#xff1a;當用戶需要特定的當前響應時&#xff0c;提供過時或通用的信息。 來源&#xff1a;從非權威來源創建響應。由于術語混淆&#xff0c;不同的培訓來源使用相同的術語來談論不同的事情&#…

網絡構建和設計方法_1.網絡需求分析

1.網絡需求分析 網絡需求分析是網絡構建及開發過程的起始環節&#xff0c;也是極其重要的階段。在該階段&#xff0c;可盡早明確客戶使用網絡的真實用途或痛點&#xff0c;以便為后續能夠構建和設計出更貼近客戶真實訴求的網絡打下堅實基礎&#xff0c;前期的網絡需求分析至關…

制造業包括哪些?需要堡壘機嗎?

制造業-國民經濟的主體&#xff0c;是立國之本、興國之器、強國之基&#xff0c;一個關系著大家吃穿住行的行業&#xff0c;一個與大家息息相關的行業。但大家對于制造業還有很多不了解&#xff0c;有小伙伴在問&#xff0c;制造業包括哪些&#xff1f;需要堡壘機嗎&#xff1f…

深入探索npm依賴:掌握查看與管理包依賴的藝術

深入探索npm依賴&#xff1a;掌握查看與管理包依賴的藝術 在JavaScript和Node.js的世界中&#xff0c;npm&#xff08;Node Package Manager&#xff09;不僅是一個包管理器&#xff0c;更是一個強大的工具&#xff0c;用于管理項目依賴。理解并掌握如何查看和管理npm包的依賴…

k8s使用Endpoint將信息存儲到集群外部數據庫

https://mp.csdn.net/mp_blog/creation/editor/139864305 上一篇文章

引領AI新時代:深度學習與大模型的關鍵技術

文章目錄 &#x1f4d1;前言一、內容概述二、作者簡介三、書籍特色四、學習平臺與資源 &#x1f4d1;前言 在數字化浪潮席卷全球的今天&#xff0c;人工智能&#xff08;AI&#xff09;和深度學習技術已經滲透到我們生活的方方面面。從智能手機中的智能語音助手&#xff0c;到…

20.流入門

學習知識&#xff1a;輸入流和輸出流讀文件的簡單使用 test.txt&#xff1a; iloveu是我愛你的意思。 Main.java import java.io.*;public class Main {public static void main(String[] args) {// 1.利用輸入流讀文件//讀取test.txt并輸出文件內容try{FileInputStream in…

分類預測 | Matlab實現GA-XGBoost遺傳算法優化XGBoost的多特征分類預測

分類預測 | Matlab實現GA-XGBoost遺傳算法優化XGBoost的多特征分類預測 目錄 分類預測 | Matlab實現GA-XGBoost遺傳算法優化XGBoost的多特征分類預測效果一覽基本介紹程序設計參考資料 效果一覽 基本介紹 Matlab實現GA-XGBoost遺傳算法優化XGBoost的多特征分類預測&#xff0c;…

【Hadoop集群搭建】集群崩潰處理及啟動時常見報錯解決辦法

目錄 1. 集群崩潰處理 1.1 殺死進程 1.2 刪除目錄&#xff08;logs/和hadoopdata/&#xff09; 1.3 重新初始化集群 1.4 重新啟動集群 2. 啟動時常見報錯 2.1 報錯如下 2.2 在運行程序測試 MapReduce 計算框架時報錯如下 2.3 報錯如下 1. 集群崩潰處理 1.1 殺死進程 sbin/st…

Clickhouse的基本sql語句

1&#xff0c;建庫語句 create database if not exists mytestdb on cluster default_cluster;注意&#xff1a;用戶在集群中創建數據庫或者表時使用ON CLUSTER語句&#xff0c;保證各個ClickHouse節點上數據庫、表的元信息相同。 2&#xff0c;建表 -- 創建復制表 create t…

SpringBoot優點達項目實戰:項目基本配置(二)

SpringBoot優點達項目實戰&#xff1a;項目基本配置&#xff08;二&#xff09; 文章目錄 SpringBoot優點達項目實戰&#xff1a;項目基本配置&#xff08;二&#xff09;1、項目初始化配置2、MyBatisPlus配置3、Knife配置4、定義統一返回數據結構 1、項目初始化配置 創建appli…

學習筆記——動態路由——RIP(RIP工作原理/防環機制)

三、RIP工作原理/防環機制 1、工作原理 配置好RIP的路由器會每隔30s,向鄰居路由器自動發送RIP路由更新報文。報文里面攜帶了其所知道的所有路由。 通過發送數據包進行路由信息的交互&#xff0c;路由器啟動RIP協議&#xff0c;向周圍鄰居路由器傳遞request(請求)response(響…

克隆網站的風險

克隆網站的風險 隨著互聯網的快速發展&#xff0c;克隆網站也變得越來越常見。克隆網站是指復制原始網站的外觀和功能&#xff0c;并偽裝成原始網站。雖然克隆網站可以提供與原始網站相似的服務和體驗&#xff0c;但它們也帶來了一系列風險。本文將探討克隆網站的風險&#xff…

我的故事與思考

在24年的高考帷幕落下之后&#xff0c;我們站在了一個新的起點&#xff0c;面對著即將開始的大學新生活&#xff0c;我們面臨著一道重要的選擇題&#xff1a;是選擇一個心儀的專業&#xff0c;還是選擇一個知名度更高的學校&#xff1f;這是一個困擾了眾多考生和家長的長期難題…

Docker 從入門到精通(大全)

一、概述 1.1 基本概念 Docker 是一個開源的應用容器引擎&#xff0c;基于 Go 語言 并遵從 Apache2.0 協議開源。 Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中&#xff0c;然后發布到任何流行的 Linux 機器上&#xff0c;也可以實現虛擬化。…

使用QtGui顯示QImage的幾種方法

問題描述 我是一名剛學習Qt的新手,正在嘗試創建一個簡單的GUI應用程序。當點擊一個按鈕時,顯示一張圖片。我可以使用QImage對象讀取圖片,但是否有簡單的方法調用一個Qt函數,將QImage作為輸入并顯示它? 方法一:使用QLabel顯示QImage 最簡單的方式是將QImage添加到QLabe…