【技術積累】Python中的PyTorch庫【一】

来源:https://www.cnblogs.com/yyyyfly1/archive/2023/06/06/17461852.html
-Advertisement-
Play Games

博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ...


PyTorch庫介紹

PyTorch是一個基於Python的科學計算庫,用於構建深度學習神經網路。它主要由兩個部分組成:一個是PyTorch Tensor庫,提供了類似於NumPy的數組操作,但是支持GPU加速;另一個是PyTorch的自動微分系統,能夠自動計算神經網路中的反向傳播演算法。

PyTorch是一個開源的深度學習框架,它的設計理念是簡潔易懂、動態的計算圖和易於使用。這使得PyTorch成為了學術界和工業界的熱門選擇。以下是PyTorch庫的一些主要特性:

  1. 動態計算圖:PyTorch中的計算圖是即時構建的。與TensorFlow等靜態計算圖的框架不同,PyTorch允許在運行時動態定義神經網路的架構。這種方式允許深度學習研究者更容易地嘗試新的模型類型和實驗。

  2. 自動微分:PyTorch能夠自動計算神經網路的梯度,即反向傳播。這種自動微分機制顯著地簡化了深度學習模型的訓練流程。

  3. 靈活性:PyTorch非常靈活,可以輕鬆地與NumPy等其他Python庫集成,其Tensor庫的API也很類似於NumPy。另外,PyTorch可以支持大規模的並行計算,包括多個GPU和多台機器。

  4. 高效性:PyTorch通過使用C++代碼進行底層優化,可以在代碼中使用Python語言的優點,同時不會降低計算性能。

  5. 豐富的工具箱:PyTorch提供了許多用於電腦視覺、自然語言處理、語音處理、增強學習和生成模型等領域的高級工具箱和模型庫。

總的來說,PyTorch庫非常適合深度學習研究者和實踐者使用,其靈活性和易用性可以幫助他們更快地實現和測試新的模型,並且可以在大規模的數據集上快速進行訓練和評估。

PyTorch中的Autograd是什麼?它有什麼作用?

Autograd是PyTorch中的自動微分引擎,它可以自動計算一些神經網路中的參數在損失函數下對損失的梯度值,從而可以進行反向傳播,更新參數,使得模型更加準確。它可以自動化地計算任何區分可能的函數的導數。因此,在神經網路訓練中,Autograd允許我們方便地計算梯度,減少手動計算梯度的麻煩。此外,Autograd還具有自動求解Hessian矩陣等高級微分方法的能力,這大大簡化了訓練開發工作的複雜性,提高了演算法的實用性。

以下是PyTorch中使用Autograd的一個簡單例子。

我們有一個簡單的線性模型:。我們想要優化這個模型,使得損失函數最小化。我們使用均方誤差作為我們的損失函數。

我們可以使用以下代碼實現:

import torch

x = torch.tensor([1.0], requires_grad=True) # 定義一個張量x並打開requires_grad
model = torch.nn.Linear(1, 1) # 定義一個線性模型,y = wx + b
optimizer = torch.optim.Adam(model.parameters(), lr=0.01) # 定義優化器
criterion = torch.nn.MSELoss() # 定義損失函數,均方誤差

for i in range(100):
    optimizer.zero_grad() # 梯度清零
    output = model(x) # 計算模型的輸出
    loss = criterion(output, torch.tensor([3.0])) # 計算損失
    loss.backward() # 反向傳播,計算梯度
    optimizer.step() # 更新參數
print(model.state_dict()) # 輸出優化後的參數值

我們將張量x打開requires_grad屬性,這樣它就可以追蹤梯度了。然後我們定義一個線性模型,即y = wx + b,使用Adam優化器進行優化,使用均方誤差作為損失函數。我們將模型訓練100次,通過梯度下降更新參數,最終輸出優化後的參數值。通過這些步驟,我們可以使用Autograd自動計算和更新梯度,從而優化模型。

該模型訓練完畢後,列印出的model.state_dict()為一個字典類型,其中包含了優化後的模型參數。

在上述代碼中,model.state_dict()的輸出結果應該為:

OrderedDict([('weight', tensor([[2.0023]])), ('bias', tensor([0.9952]))])

如何使用PyTorch庫進行圖像分類任務?

  1. 準備數據集:首先,需要收集足夠數量的圖像數據,將其分為訓練集和測試集,並將其放入文件夾中。同時,需要創建一個文本文件或CSV文件來映射圖像和其標簽的索引。

  2. 載入數據集:PyTorch提供了DataLoader類,它可以載入和預處理訓練和測試數據集。可以使用transforms模塊預處理圖像,例如縮放、裁剪、歸一化等。

  3. 建立模型:PyTorch提供了許多預訓練模型和可調整的模型,例如AlexNet、VGG、ResNet等。可以通過調用相應的模型構造函數來創建一個模型。

  4. 訓練模型:通過定義損失函數和優化器,並以批次的方式迭代訓練數據集來訓練模型。PyTorch提供了Adam、SGD等優化器。

  5. 測試模型:使用測試數據集驗證模型的性能並計算精度指標。可以使用PyTorch的torch.no_grad()上下文管理器來關閉梯度計算,以節省記憶體並提高速度。

  6. 保存和載入模型:可以通過調用模型的state_dict()方法保存模型的狀態字典,並使用torch.load()方法載入模型。

  7. 預測和推理:使用模型進行預測和推理需要使用模型的forward()方法,並將輸入傳遞給模型以獲取輸出。

以上是使用PyTorch進行圖像分類任務的基本步驟,具體實現會根據具體的數據集和模型而有所不同。

PyTorch中的torch.nn模塊是什麼?它如何使用?

torch.nn模塊是PyTorch中的神經網路模塊,包含了構建神經網路所需的各種層和函數。它提供了一種方便的方式來構建、訓練和測試各種類型的神經網路。

使用torch.nn模塊需要進行以下步驟:

  1. 定義一個繼承自torch.nn.Module的類,該類將定義神經網路的架構和前向傳遞的邏輯。
  2. 在類的構造函數中定義層和函數,並初始化它們的參數。
  3. 實現類的forward()方法,該方法定義神經網路的前向傳遞邏輯。
  4. 使用該類進行訓練、測試和推理操作。

在使用torch.nn模塊時,通常需要使用其他模塊和函數,如torch.optim、torch.utils.data等。這些模塊和函數提供了訓練、數據載入和其他輔助功能。

例如,下麵的代碼演示了使用torch.nn模塊構建一個簡單的神經網路,並訓練它進行分類操作:

import torch
import torch.nn as nn
import torch.optim as optim
import torch.utils.data as data

# 定義神經網路類
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(10, 5)
        self.fc2 = nn.Linear(5, 2)

    def forward(self, x):
        x = self.fc1(x)
        x = nn.functional.relu(x)
        x = self.fc2(x)
        return nn.functional.log_softmax(x, dim=1)

# 準備數據
x_train = torch.randn(100, 10)
y_train = torch.randint(0, 2, (100,))

# 定義模型、優化器和損失函數
model = Net()
optimizer = optim.SGD(model.parameters(), lr=0.1)
criterion = nn.NLLLoss()

# 訓練模型
for epoch in range(100):
    running_loss = 0.0

    # 使用DataLoader載入數據批次
    for x_batch, y_batch in data.DataLoader(list(zip(x_train, y_train)), batch_size=10, shuffle=True):
        optimizer.zero_grad()
        y_pred = model(x_batch)
        loss = criterion(y_pred, y_batch)
        loss.backward()
        optimizer.step()
        
        running_loss += loss.item()

    print(f"Epoch {epoch}: Loss = {running_loss}")

上述代碼中,首先定義了一個繼承自nn.Module的Net類,該類定義了一個包含兩個線性層和激活函數的簡單神經網路。隨後定義了模型、優化器和損失函數,使用DataLoader進行數據批次的載入,進行模型的訓練並輸出訓練損失。

如何使用PyTorch庫進行自然語言處理任務?

PyTorch是一種常用的深度學習庫,可以用於自然語言處理任務。以下是一些可以使用PyTorch庫進行自然語言處理的任務:

  1. 詞嵌入:PyTorch提供了大量的庫來處理文本數據。其中最常用的是torchtext。使用torchtext,可以將文本數據預處理成單詞或字元級別的序列,並使用PyTorch中的Embedding層構建詞嵌入模型。

  2. 文本分類:文本分類是一種常見的自然語言處理任務。例如,將文本分為積極的和消極的評論。PyTorch提供了一些網路結構(如CNN和LSTM)和損失函數(如交叉熵和softmax),可以用來訓練文本分類模型。

  3. 序列標註:序列標註是指將每個單詞或字元標記為特定的類別。例如,標記文本中的詞性或實體。PyTorch提供了一些模型和損失函數,例如條件隨機場(CRF)和貝葉斯網路,可以用來訓練序列標註模型。

  4. 機器翻譯:機器翻譯是將一種語言翻譯成另一種語言的任務。PyTorch提供了一些註意力機制和序列到序列模型,可以用來訓練機器翻譯模型。

  5. 對話系統:對話系統是一種可以回答用戶問題的電腦程式。PyTorch提供了一些基礎網路結構,如迴圈神經網路和註意力機制,可以用來訓練對話系統。還可以使用預訓練的語言模型,如BERT,來改進對話系統的效果。

PyTorch中的torch.optim模塊是什麼?它有什麼作用?

PyTorch中的torch.optim模塊是一個優化器,用於優化神經網路模型的參數。其作用是通過梯度下降演算法自動地更新模型的參數,以使得模型的損失函數值最小化,從而實現更好的預測結果。torch.optim模塊提供了多種優化演算法的實現,如SGD、Adam、Adagrad等,用戶可以根據自己的需求選擇不同的優化演算法。此外,torch.optim模塊還提供了一些參數調整的方法,例如學習率調整和權重衰減等,可以幫助用戶更加靈活地控制訓練過程。

如何使用PyTorch庫進行時間序列預測任務?

使用PyTorch庫進行時間序列預測任務可以遵循以下步驟:

1.準備數據:數據應該包含一系列時間序列數據和相應的目標,也可以包含先前的時間步驟的其他特征。

2.創建PyTorch數據集:將數據轉換為PyTorch數據集,準備進行訓練和測試。

3.定義網路結構:創建一個神經網路模型,可以是LSTM、GRU、RNN等。

4.定義損失函數:選擇合適的損失函數,如均方誤差(MSE)或平均絕對誤差(MAE)。

5.定義優化器:選擇合適的優化器,如隨機梯度下降(SGD)或Adam,以更新網路的權重。

6.訓練網路:使用訓練數據來訓練神經網路,計算損失並優化權重。

7.測試網路:使用測試數據對神經網路進行測試,評估其性能併進行調整。

8.預測結果:使用訓練好的模型來對以前未見過的數據進行預測,評估性能併進行調整。

例如,下麵的代碼演示瞭如何用PyTorch庫進行時間序列預測

import torch
from torch.utils.data import Dataset, DataLoader

# 準備數據
class TimeSeries(Dataset):
    def __init__(self, data):
        self.data = data
        
    def __len__(self):
        return len(self.data) - sequence_length

    def __getitem__(self, idx):
        x = self.data[idx:idx+sequence_length]
        y = self.data[idx+sequence_length]
        return torch.Tensor(x), torch.Tensor(y)

# 創建數據集
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
sequence_length = 3
dataset = TimeSeries(data)
dataloader = DataLoader(dataset, batch_size=1)

# 定義網路結構
class LSTMNet(torch.nn.Module):
    def __init__(self, input_size, hidden_size, num_layers, output_size):
        super(LSTMNet, self).__init__()
        self.hidden_size = hidden_size
        self.num_layers = num_layers
        self.lstm = torch.nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
        self.fc = torch.nn.Linear(hidden_size, output_size)
        
    def forward(self, x):
        h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).requires_grad_()
        c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).requires_grad_()
        out, (hn, cn) = self.lstm(x, (h0.detach(), c0.detach()))
        out = self.fc(out[:, -1, :])
        return out

# 定義損失函數和優化器
input_size = 1
hidden_size = 2
num_layers = 1
output_size = 1
epochs = 100
lr = 0.01
net = LSTMNet(input_size, hidden_size, num_layers, output_size)
criterion = torch.nn.MSELoss()
optimizer = torch.optim.Adam(net.parameters(), lr=lr)

# 訓練網路
for epoch in range(epochs):
    for i, (x, y) in enumerate(dataloader):
        optimizer.zero_grad()
        output = net(x)
        loss = criterion(output, y)
        loss.backward()
        optimizer.step()
    print(f'Epoch {epoch+1}, Loss {loss.item()}')
    
# 測試網路與預測結果
test_data = [11, 12, 13, 14]
test_dataset = TimeSeries(test_data)
x_test, y_test = test_dataset[0]
net.eval()
with torch.no_grad():
    prediction = net(x_test.unsqueeze(0))
    print(f'True value: {y_test.item()}, Predicted value: {prediction.item()}')

PyTorch中的torch.utils.data模塊是什麼?它如何使用?

torch.utils.data是PyTorch中用於處理數據的模塊,是數據載入和預處理的核心模塊。它基於torch.Tensor的輸入數據,提供了一個封裝類,用於數據讀取器、預處理函數、採樣器、轉換器等的組合,並封裝到一個可迭代的類中,方便用戶訓練、驗證和測試深度學習模型。

在使用torch.utils.data時,通常需要自定義以下類:

  • Dataset,表示數據集的抽象類。必須實現__getitem__和__len__方法。
  • DataLoader,使用Dataset作為數據源,並將數據提供給模型訓練時使用。

一個簡單的例子:

import torch
from torch.utils.data import Dataset, DataLoader

class MyDataset(Dataset):
  def __init__(self):
    self.data = torch.randn(100, 10)

  def __getitem__(self, index):
    return self.data[index], index

  def __len__(self):
    return len(self.data)

dataset = MyDataset()
dataloader = DataLoader(dataset, batch_size=10)

for data_batch, index_batch in dataloader:
  print(data_batch.shape, index_batch.shape)

這個例子中,我們定義了一個MyDataset類,它的__getitem__方法返回一個數據樣本及其索引,__len__方法返回數據集中樣本的數量。通過DataLoader,我們可以輕鬆地批量獲取數據。在每個迭代中,DataLoader都從Dataset中返回batch_size大小的數據,方便我們訓練模型。

PyTorch中的torchvision模塊是什麼?它有什麼作用?

PyTorch中的torchvision模塊是一個用於處理圖像和視覺數據的包,主要用於圖像數據的載入、預處理和擴充等操作。它提供了許多著名的數據集,如MNIST、CIFAR-10、ImageNet等,同時也包含各種預訓練模型,如VGG16、ResNet等。

torchvision還提供了許多用於圖像處理的工具,如圖片格式轉換、數據集分割、生成網路、圖像預處理等。可以大大簡化在PyTorch中處理圖像數據的代碼工作量,讓用戶可以更快速地開發視覺模型。

如何使用PyTorch庫進行遷移學習任務?

使用PyTorch庫進行遷移學習任務需要執行以下步驟:

  1. 準備數據:獲取原始數據,並將其分為訓練集、驗證集和測試集。如果數據集很小,可以使用數據增強方法來擴充數據集。

  2. 載入預訓練模型:在PyTorch中,可以使用torchvision庫中的預訓練模型來進行遷移學習。可以從預訓練模型中載入模型參數。

  3. 修改網路結構:對載入的預訓練模型進行微調,將其適應新的任務,比如更改分類層的輸出節點數。

  4. 設置優化器和損失函數:定義要使用的優化器和損失函數。通常使用Adam優化器和交叉熵損失函數。

  5. 訓練模型:使用訓練集訓練模型,並使用驗證集或交叉驗證來調整超參數,如學習率和批量大小。

  6. 評估模型:使用測試集評估模型性能。

  7. 預測新數據:使用訓練好的模型進行預測。

以下是使用PyTorch庫進行遷移學習任務的示例代碼:

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import models, datasets, transforms

# 定義模型
model = models.resnet18(pretrained=True)
num_features = model.fc.in_features
model.fc = nn.Linear(num_features, 2) # 這裡假設我們只有二分類任務

# 準備數據
data_transforms = {
    'train': transforms.Compose([
        transforms.RandomResizedCrop(224),
        transforms.RandomHorizontalFlip(),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ]),
    'val': transforms.Compose([
        transforms.Resize(256),
        transforms.CenterCrop(224),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ]),
}

data_dir = 'data/hymenoptera_data'
image_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x), data_transforms[x]) for x in ['train', 'val']}
dataloaders = {x: torch.utils.data.DataLoader(image_datasets[x], batch_size=4, shuffle=True, num_workers=4) for x in ['train', 'val']}
dataset_sizes = {x: len(image_datasets[x]) for x in ['train', 'val']}

# 設置優化器和損失函數
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 訓練模型
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model.to(device)
num_epochs = 10
for epoch in range(num_epochs):
    for phase in ['train', 'val']:
        if phase == 'train':
            model.train(True)
        else:
            model.train(False)

        running_loss = 0.0
        running_corrects = 0

        for inputs, labels in dataloaders[phase]:
            inputs = inputs.to(device)
            labels = labels.to(device)

            optimizer.zero_grad()

            with torch.set_grad_enabled(phase == 'train'):
                outputs = model(inputs)
                _, preds = torch.max(outputs, 1)
                loss = criterion(outputs, labels)

                if phase == 'train':
                    loss.backward()
                    optimizer.step()

            running_loss += loss.item() * inputs.size(0)
            running_corrects += torch.sum(preds == labels.data)

        epoch_loss = running_loss / dataset_sizes[phase]
        epoch_acc = running_corrects.double() / dataset_sizes[phase]

        print('{} Loss: {:.4f} Acc: {:.4f}'.format(phase, epoch_loss, epoch_acc))

# 評估模型
correct = 0
total = 0
with torch.no_grad():
    for data in dataloaders['test']:
        images, labels = data
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print('Accuracy of the network on the test images: %d %%' % (100 * correct / total))

# 預測新數據
# 假設有一張新的圖片,路徑為test.jpg,需要預測它的類別
image = Image.open("test.jpg")
image_tensor = data_transforms['val'](image).to(device)
image_tensor = image_tensor.unsqueeze(0)
output = model(image_tensor)
_, pred = torch.max(output, 1)
print("預測結果:", pred.item())
在黑夜裡夢想著光,心中覆蓋悲傷,在悲傷里忍受孤獨,空守一絲溫暖。 我的淚水是無底深海,對你的愛已無言,相信無盡的力量,那是真愛永在。 我的信仰是無底深海,澎湃著心中火焰,燃燒無盡的力量,那是忠誠永在。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Storybook 剛剛達到了一個重要的里程牌:7.0 版本!為了慶祝,該團隊舉辦了他們的第一次用戶大會 - [Storybook Day](https://storybook.js.org/day)。為了更特別,在活動頁面中添加了一個視覺上令人驚嘆的 3D 插圖。 原文:[How we built ...
  • 我們經常會說互聯網“三高”,那什麼是三高呢?我們常說的三高,高併發、高可用、高性能,這些技術是構建現代互聯網應用程式所必需的。對於京東618備戰來說,所有的中台系統服務,無疑都是圍繞著三高來展開的。對於一個程式員,或多或少都能說出一些跟三高系統有關的技術點,而我本篇文章的目的,就是幫大家系統的梳理一... ...
  • 大家好,我是 god23bin,今天說說驗證碼功能的實現,相信大家都經常接觸到驗證碼的,畢竟平時上網也能遇到各種驗證碼,需要我們輸入驗證碼進行驗證我們是人類,而不是機器人。 ...
  • # 演算法 in Golang:Breadth-first search # (BFS、廣度優先搜索) ## 最短路徑問題 Shortest-path problem - 從 A 到 F 點有多條路徑 ## 解決問題的演算法 Breadth-first Search(廣度優先搜索) 1. 將問題建模為圖 ...
  • ## 前言 在C語言中,`break`語句是一種控制流語句,它用於終止當前所在的迴圈結構(`for`、`while`、`do-while`)或者`switch`語句,從而跳出迴圈或者結束`switch`語句的執行。 ## 一、人物簡介 - 第一位閃亮登場,有請今後會一直教我們C語言的老師 —— 自在 ...
  • 某日二師兄參加XXX科技公司的C++工程師開發崗位第7面: > 面試官:C++中,`static`和`const`的關鍵字有哪些用法? > > 二師兄:`satic`關鍵字主要用在以下三個方面:1.用在全局作用域,修飾的變數或者函數為靜態的,限制在本文件內使用。2.方法內修飾修飾靜態局部變數,在第一 ...
  • # 演算法 in Golang:Quicksort(快速排序) ## Quicksort(快速排序) - 快速排序 O(nlog2^n),比選擇排序要快 O(n²) - 在日常生活中經常使用 - 使用了 D & C 策略(分而治之) ## 使用 Quicksort 排序數組 - 不需要排序的數組(也就 ...
  • ### 前言 有多少小伙伴是被標題 ~~騙~~ 吸引進來的呢,我可不是標題黨,今天的文章呢確實跟”金錢“有關係。 但是我們說的不是過度追求金錢而掉入陷阱,而是要說一說在Java程式中,各種跟金錢運算有關的陷阱。 日常工作中我們經常會涉及到各種金額這樣**浮點數的運算**。 一旦涉及到金額的運算就必須 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...