哈嘍,我是小壯!
這幾天關于深度學習的內容,已經分享了一些。
另外,類似于numpy、pandas常用數據處理函數,在Pytorch中也是同樣的重要,同樣的有趣!!
Pytorch同樣提供了許多用于數據處理和轉換的函數。
今兒來看下,最重要的幾個必會函數。
torch.Tensor 是PyTorch中最基本的數據結構,用于表示張量(tensor)。張量是多維數組,可以包含數字、布爾值等。你可以使用torch.Tensor的構造函數創建張量,也可以通過其他函數創建。
import torch# 創建一個空的張量empty_tensor = torch.Tensor()# 從列表創建張量data = [1, 2, 3, 4]tensor_from_list = torch.Tensor(data)
用于將NumPy數組轉換為PyTorch張量。
import numpy as npnumpy_array = np.array([1, 2, 3, 4])torch_tensor = torch.from_numpy(numpy_array)
用于從只包含一個元素的張量中提取Python數值。適用于標量張量。
scalar_tensor = torch.tensor(5)scalar_value = scalar_tensor.item()
用于改變張量的形狀。
original_tensor = torch.randn(2, 3) # 2x3的隨機張量reshaped_tensor = original_tensor.view(3, 2) # 將形狀改變為3x2
用于將張量轉換到指定的設備(如CPU或GPU)。
cpu_tensor = torch.randn(3)gpu_tensor = cpu_tensor.to("cuda") # 將張量移動到GPU
將張量轉換為NumPy數組。
pytorch_tensor = torch.tensor([1, 2, 3])numpy_array = pytorch_tensor.numpy()
用于對整數張量進行獨熱編碼。
import torch.nn.functional as Finteger_tensor = torch.tensor([0, 2, 1])one_hot_encoded = F.one_hot(integer_tensor)
用于加載和處理數據集。這兩個類通常與自定義的數據集類一起使用。
from torch.utils.data import Dataset, DataLoaderclass CustomDataset(Dataset): def __init__(self, data): self.data = data def __len__(self): return len(self.data) def __getitem__(self, index): return self.data[index]dataset = CustomDataset([1, 2, 3, 4, 5])dataloader = DataLoader(dataset, batch_size=2, shuffle=True)
以上這些是PyTorch中一些重要的數據轉換函數,進行了簡單的使用。
它們對于處理和準備深度學習任務中的數據非常非常有幫助。
接下來,我們制作一個圖像分割的案例。
在這個案例中,我們將使用PyTorch和torchvision庫進行圖像分割,使用預訓練的DeepLabV3模型和PASCAL VOC數據集。
在整個的代碼中,涉及到上面所學到的內容,調整大小、裁剪、標準化等。
import torchimport torchvision.transforms as transformsfrom torchvision import modelsfrom PIL import Imageimport matplotlib.pyplot as plt# 下載示例圖像!wget -O example_image.jpg https://pytorch.org/assets/deeplab/deeplab1.jpg# 定義圖像轉換transform = transforms.Compose([ transforms.Resize((256, 256)), # 調整大小 transforms.ToTensor(), # 轉換為張量 transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # 標準化])# 加載并轉換圖像image_path = 'example_image.jpg'image = Image.open(image_path).convert("RGB")input_tensor = transform(image).unsqueeze(0) # 添加批次維度# 加載預訓練的DeepLabV3模型model = models.segmentation.deeplabv3_resnet101(pretrained=True)model.eval()# 進行圖像分割with torch.no_grad(): output = model(input_tensor)['out'][0] output_predictions = output.argmax(0)# 將預測結果轉換為彩色圖像def decode_segmap(image, nc=21): label_colors = np.array([(0, 0, 0), # 0: 背景 (128, 0, 0), (0, 128, 0), (128, 128, 0), (0, 0, 128), (128, 0, 128), # 1-5: 物體 (0, 128, 128), (128, 128, 128), (64, 0, 0), (192, 0, 0), # 6-9: 道路 (64, 128, 0), (192, 128, 0), (64, 0, 128), (192, 0, 128), # 10-13: 面部 (64, 128, 128), (192, 128, 128), (0, 64, 0), (128, 64, 0), # 14-17: 植物 (0, 192, 0), (128, 192, 0), (0, 64, 128)]) # 18-20: 建筑 r = np.zeros_like(image).astype(np.uint8) g = np.zeros_like(image).astype(np.uint8) b = np.zeros_like(image).astype(np.uint8) for l in range(0, nc): idx = image == l r[idx] = label_colors[l, 0] g[idx] = label_colors[l, 1] b[idx] = label_colors[l, 2] rgb = np.stack([r, g, b], axis=2) return rgb# 將預測結果轉換為彩色圖像output_rgb = decode_segmap(output_predictions.numpy())# 可視化原始圖像和分割結果plt.figure(figsize=(12, 6))plt.subplot(1, 2, 1)plt.imshow(image)plt.title('Original Image')plt.subplot(1, 2, 2)plt.imshow(output_rgb)plt.title('Segmentation Result')plt.show()
在這個案例中,我們首先定義了一系列圖像轉換函數,包括調整大小、轉換為張量和標準化。這些轉換確保輸入圖像滿足模型的需求。
然后,加載了一個示例圖像并應用了這些轉換。
接下來,我們使用了torchvision中預訓練的DeepLabV3模型來進行圖像分割。對于輸出,我們提取了預測結果的最大值索引,以獲得每個像素的預測類別。
最后,我們將預測結果轉換為彩色圖像,并可視化原始圖像和分割結果。
這個案例強調了圖像轉換函數在圖像分割任務中的重要作用,確保輸入圖像符合模型的輸入要求,并且輸出結果易于可視化。
本文鏈接:http://www.www897cc.com/showinfo-26-55080-0.html一個超強 Pytorch 操作!!
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com