2025-05-21 Python深度學習5——數據讀取

文章目錄

  • 1 數據準備
  • 2 `Dataset`
    • 2.1 自定義 Dataset
    • 2.2 使用示例
  • 3 `TensorBoard`
    • 3.1 安裝
    • 3.2 標量可視化(Scalars)
    • 3.3 圖像可視化(Images)
    • 3.4 其他常用功能
  • 4 `transform`
    • 4.1 `ToTensor()`
    • 4.2 `Normalize()`
    • 4.3 `Resize()`
    • 4.4 `Compose()`
    • 4.5 Crop
      • `RandomCrop()`
      • `CenterCrop()`
      • `RandomResizedCrop()`
      • `FiveCrop() / TenCrop()`
    • 4.6 `RandomHorizontalFlip() / RandomVerticalFlip()`
    • 4.7 Random
      • `RandomChoice()`
      • `RandomApply()`
      • `RandomOrder()`
    • 4.8 自定義 transforms
    • 4.9 其他
  • 5 torchvision 中的數據集
    • 5.1 CIFAR10 數據集
    • 5.2 數據加載
    • 5.3 數據格式
    • 5.4 可視化
  • 6 `DataLoader`
    • 6.1 讀取數據
    • 6.2 可視化

本文環境:

  • Pycharm 2025.1
  • Python 3.12.9
  • Pytorch 2.6.0+cu124

1 數據準備

? 數據集放在 dataset 路徑下,其中 train 文件夾存放訓練數據,包括 ants 和 bees,val 文件夾存放測試數據,包括 ants 和 bees。

image-20250520004935472

? 訓練數據為若干個 .jpg 圖片。

image-20250520005158000
  • 數據集下載鏈接:https://pan.baidu.com/s/1jZoTmoFzaTLWh4lKBHVbEA;密碼: 5suq。
  • 參考教程視頻鏈接:P7. TensorBoard的使用(一)_嗶哩嗶哩_bilibili。

2 Dataset

? Dataset 是抽象類,定義數據來源及單樣本讀取邏輯,所有自定義的 Dataset 均需要繼承它。

? 必須實現的方法:

  • __getitem__(self, index):根據索引返回(樣本, 標簽)。
  • __len__(self):返回數據集大小。

2.1 自定義 Dataset

import os
from PIL import Image
from torch.utils.data import Datasetclass MyData(Dataset):def __init__(self, root_dir, label_dir):# 初始化函數,傳入根目錄和標簽目錄self.root_dir = root_dir  # 數據集根目錄self.label_dir = label_dir  # 標簽目錄(也是類別名)# 拼接完整路徑self.path = os.path.join(self.root_dir, self.label_dir)# 獲取該路徑下所有圖片文件名self.img_path = os.listdir(self.path)def __getitem__(self, index):# 根據索引獲取圖片名img_name = self.img_path[index]# 拼接圖片完整路徑img_item_path = os.path.join(self.path, img_name)# 使用PIL打開圖片img = Image.open(img_item_path)# 標簽就是目錄名(如"ants"或"bees")label = self.label_dirreturn img, label  # 返回圖片和標簽def __len__(self):# 返回數據集大小(圖片數量)return len(self.img_path)
  1. __init__()
  • 接收兩個參數:root_dir(根目錄)和label_dir(標簽目錄)。

  • 使用os.path.join拼接完整路徑。

  • os.listdir獲取該目錄下所有文件名列表。

  1. __getitem__()

    • 根據索引獲取對應圖片。

    • 使用 PIL.Image 打開圖片。

    • 標簽直接使用目錄名(簡單示例中)。

    • 返回(圖片, 標簽)元組。

  2. __len__()

    • 返回數據集大小(圖片數量)。

    • 用于 DataLoader 確定迭代次數。

2.2 使用示例

# 定義路徑
root_dir = "dataset/train"  # 訓練集根目錄
ants_label_dir = "ants"    # 螞蟻圖片目錄
bees_label_dir = "bees"    # 蜜蜂圖片目錄# 創建數據集實例
ants_dataset = MyData(root_dir, ants_label_dir)
bees_dataset = MyData(root_dir, bees_label_dir)# 合并數據集(實際應該使用ConcatDataset)
train_dataset = ants_dataset + bees_dataset  # 簡單合并

? 示例中直接使用+合并數據集不是很規范,PyTorch 提供ConcatDataset類來正確合并多個 Dataset:

from torch.utils.data import ConcatDataset
train_dataset = ConcatDataset([ants_dataset, bees_dataset])

3 TensorBoard

? TensorBoard 是 TensorFlow 提供的可視化工具,PyTorch 通過torch.utils.tensorboard模塊也支持使用 TensorBoard。它可以幫助我們:

  • 監控訓練過程中的指標變化(如損失、準確率)。
  • 可視化模型結構。
  • 查看圖像、音頻等數據。
  • 分析參數分布和直方圖。

3.1 安裝

? 使用以下命令進行安裝:

pip install tensorboard

?

? 基本使用流程如下:

  1. 創建SummaryWriter實例。
  2. 使用各種add_*方法記錄數據。
  3. 關閉SummaryWriter。
  4. 啟動 TensorBoard 服務查看結果。

3.2 標量可視化(Scalars)

add_scalar(tag, scalar_value, global_step)

  • tag: 數據標識(圖表標題)。
  • scalar_value: 要記錄的標量值。
  • global_step: 訓練步數/迭代次數。
from torch.utils.tensorboard import SummaryWriterwriter = SummaryWriter("logs")  # 日志保存到logs目錄for i in range(100):writer.add_scalar("y=2x", 2*i, i)  # 記錄y=2x函數值writer.close()

? 上述代碼運行后,在當前目錄下會生成 logs 目錄,里面存放 TensorBoard 的可視化數據。

image-20250520011221188

? 進入 Pycharm 終端,在命令行運行如下命令:

tensorboard --logdir=Pytorch教程/logs --port=6006
  • logdir:可視化數據的存儲路徑在哪里。
  • port:從哪個端口打開可視化網頁。
image-20250520011428889

? 在瀏覽器訪問http://localhost:6006即可查看可視化結果。

image-20250520011635433

注意

? 請確保從 cmd 中輸入命令,而不是 Powershell。

? 若出現如下報錯,說明使用 Powershell 打開而不是 cmd。

image-20250520011743283

解決方案

? 打開 Pycharm 的設置選項,進入“終端”頁面,將默認頁簽更改為 cmd.exe,重新在 Pycharm 中打開終端即可。

image-20250520011933512

3.3 圖像可視化(Images)

add_image(tag, img_tensor, global_step, dataformats)

  • tag: 數據標識(圖表標題)。

  • img_tensor: 圖像數據(numpy 數組或 torch tensor)。

  • global_step: 訓練步數/迭代次數。

  • dataformats: 指定數據格式,如 ‘HWC’(高度、寬度、通道)。

from PIL import Image
import numpy as npimg_PIL = Image.open("image.jpg")
img_array = np.array(img_PIL)  # 轉換為numpy數組writer.add_image("train", img_array, 1, dataformats='HWC')

? 上述代碼運行后,在可視化網頁中點擊刷新,即可顯示圖像。

image-20250520012444118

3.4 其他常用功能

  • add_graph(): 可視化模型結構。
  • add_histogram(): 記錄參數分布。
  • add_text(): 記錄文本信息。
  • add_embedding(): 可視化高維數據降維結果。

4 transform

? torchvision.transforms 是 PyTorch 中用于圖像預處理的強大工具包,提供豐富的圖像轉換操作。主要功能包括:

  • 圖像格式轉換(如 PIL Image ? Tensor)。
  • 圖像尺寸調整(縮放、裁剪)。
  • 數據增強(翻轉、旋轉、顏色變換)。
  • 數據標準化。
image-20250520031711124

4.1 ToTensor()

image-20250520032159875
  • 將 PIL/Numpy 圖像轉為 PyTorch Tensor。
  • 將像素值從 [0, 255] 縮放到 [0.0, 1.0]。
  • 調整維度順序為 (C, H, W)。
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transformswriter = SummaryWriter("logs")
img = Image.open("image/pytorch.png")
print(img)# ToTensor
tensor_trans = transforms.ToTensor()
tensor_img = tensor_trans(img)
writer.add_image("Tensor_img", tensor_img)
print(tensor_img)  # 輸出形狀為(C, H, W)的tensor,值范圍[0,1]writer.close()
image-20250520033534663

4.2 Normalize()

image-20250520041253221

? 逐 Channel 對圖像進行標準化。

  • mean:各通道的均值。

  • std:各通道的標準差。

  • inplace:是否原地操作。

  • 使用公式:output = (input - mean) / std

  • 此處將 [0, 1] 范圍的數據轉換到 [-1, 1] 范圍。

  • 注意:必須先轉換為 Tensor 才能使用 Normalize。

from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transformswriter = SummaryWriter("logs")
img = Image.open("image/pytorch.png")
print(img)# ToTensor
tensor_trans = transforms.ToTensor()
tensor_img = tensor_trans(img)# Normalize
normalize = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
normalize_img = normalize(tensor_img)
writer.add_image("Normalize_img", normalize_img)
print(normalize_img)writer.close()
image-20250520033833209

4.3 Resize()

image-20250520034359685
  • 將圖像調整為指定尺寸 (512x512)。
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transformswriter = SummaryWriter("logs")
img = Image.open("image/pytorch.png")
print(img)# ToTensor
tensor_trans = transforms.ToTensor()
tensor_img = tensor_trans(img)# Resize
resize = transforms.Resize((512, 512))
resize_img = resize(tensor_img)
writer.add_image("Resize_img", resize_img)
print(tensor_img)writer.close()
image-20250520034528424

4.4 Compose()

image-20250520034932135
  • 將多個轉換步驟按順序組合。
  • 執行順序:先 Resize 再 ToTensor。
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transformswriter = SummaryWriter("logs")
img = Image.open("image/pytorch.png")
print(img)# Compose
compose = transforms.Compose([transforms.Resize((512, 512)),transforms.ToTensor()
])
compose_img = compose(img)
writer.add_image("Compose_img", compose_img)
print(compose_img)writer.close()
image-20250520035024393

4.5 Crop

RandomCrop()

image-20250520041843554

? 從圖片中隨機裁剪出尺寸為 size 的圖片。

  • size:所需裁剪圖片尺寸。
  • padding:設置填充大小。
    • 當為a時,上下左右均填充 a 個像素。
    • 當為 (a, b) 時,上下填充 b 個像素,左右填充 a 個像素。
    • 當為 (a, b, c, d) 時,左,上,右,下分別填充 a, b, c, d。
  • pad_if_needed:若圖像小于設定 size,則填充。
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transformswriter = SummaryWriter("logs")
img = Image.open("image/pytorch.png")
print(img)# ToTensor
tensor_trans = transforms.ToTensor()
tensor_img = tensor_trans(img)# RandomCrop
random_crop = transforms.RandomCrop((512, 512))
random_crop_img = random_crop(tensor_img)
writer.add_image("RandomCrop_img", random_crop_img)
print(random_crop_img)writer.close()
image-20250520035251328

CenterCrop()

image-20250520042105453

? 從圖像中心裁剪圖片。

? size:所需裁剪圖片尺寸。

RandomResizedCrop()

image-20250520042221052

? 隨機大小、長寬比裁剪圖片。

  • size:所需裁剪圖片尺寸。
  • scale:隨機裁剪面積比例,默認 (0.08, 1)。
  • ratio:隨機長寬比,默認(3/4, 4/3)。
  • interpolation:插值方法。
    • PIL.Image.NEAREST。
    • PIL.Image.BILINEAR。
    • PIL.Image.BICUBIC。

FiveCrop() / TenCrop()

image-20250520042512450 image-20250520042526938

? FiveCrop 在圖像的上下左右以及中心裁剪出尺寸為 size 的 5 張圖片;

? TenCrop 對這 5 張圖片進行水平或者垂直鏡像獲得 10 張圖片.

  • size:所需裁剪圖片尺寸。
  • vertical_flip:是否垂直翻轉。

4.6 RandomHorizontalFlip() / RandomVerticalFlip()

image-20250520042719668

? 依概率水平(左右)或垂直(上下)翻轉圖片。

  • p:翻轉概率。
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transformswriter = SummaryWriter("logs")
img = Image.open("image/pytorch.png")
print(img)# ToTensor
tensor_trans = transforms.ToTensor()
tensor_img = tensor_trans(img)# RandomHorizontalFlip
random_flip = transforms.RandomHorizontalFlip(1)
random_flip_img = random_flip(tensor_img)
writer.add_image("RandomFlip_img", random_flip_img)
print(random_flip_img)writer.close()
image-20250520042812255

4.7 Random

RandomChoice()

? 從一系列 transforms 方法中隨機挑選一個。

transforms.RandomChoice([transforms1, transforms2, transforms3])

RandomApply()

? 依據概率執行一組 transforms 操作。

transforms.RandomApply([transforms1, transforms2, transforms3], p=0.5)

RandomOrder()

? 對一組 transforms 操作打亂順序。

transforms.RandomOrder([transforms1, transforms2, transforms3])

4.8 自定義 transforms

? 自定義 transforms 要素:

  1. __init__():初始化方法。
  2. __call__:執行方法。
class YourTransforms(object):def __init__(self, ...):...def __call__(self, img):...return img

RandomChoice為例:

image-20250520044226420

注意

  • 僅接收一個參數,返回一個參數。
  • 注意上下游的輸出與輸入。

4.9 其他

  • Pad():對圖片邊緣進行填充。

  • ColorJitter():調整亮度、對比度、飽和度和色相。

  • Grayscale() / RandomGrayscale():依概率將圖片轉換為灰度圖。

  • RandomAffine():對圖像進行仿射變換。

    仿射變換是二維的線性變換,由五種基本原子變換構成,分別是旋轉、平移、縮放、錯切和翻轉。

  • RandomErasing():對圖像進行隨機遮擋。

  • Lambda():用戶自定義 Lambda 方法。

5 torchvision 中的數據集

? 官方文檔:Datasets — Torchvision 0.22 documentation。

image-20250521101319393

5.1 CIFAR10 數據集

? 以 CIFAR10 為例:CIFAR10 — Torchvision 0.22 documentation。打開文檔鏈接,以下是 CIFAR10 的創建方法。

? 進入主頁,可觀看數據集詳細介紹。

image-20250521103014615
  • 包含 60,000 張 32×32 像素的 RGB 彩色圖像,分為 10 個類別(飛機、汽車、鳥、貓、鹿、狗、青蛙、馬、船、卡車),每類 6,000 張。

    • 訓練集

      50,000 張圖像,分為 5 個批次(data_batch_1 至 data_batch_5),每批 10,000 張。每個類別在訓練集中共 5,000 張圖像,但單個批次內類別分布可能不均勻。

    • 測試集

      10,000 張圖像(test_batch),每個類別均勻包含 1,000 張隨機選擇的圖像,且與訓練集無重疊。

  • 類別間完全互斥,例如“汽車”與“卡車”不重疊(汽車含轎車 / SUV,卡車僅含大型貨車)。

5.2 數據加載

  • torchvision.datasets.CIFAR10

    PyTorch 內置的 CIFAR-10 數據集加載接口。

    • root='./dataset':數據集存儲路徑(若不存在會自動創建)。
    • train=True/False:分別加載訓練集(50,000 張)或測試集(10,000 張)。
    • transform=None:接收 PIL 圖像并返回轉換后的版本的函數/轉換。
    • target_transform=None:接收目標并對其進行轉換的函數/轉換。
    • download=True:自動下載數據集(若本地不存在)。
import torchvision# 定義數據集的轉換方式
dataset_transform = torchvision.transforms.Compose([torchvision.transforms.ToTensor(),
])# 加載訓練集
train_set = torchvision.datasets.CIFAR10(root='./dataset',  # 數據集的根目錄train=True,  # 是否為訓練集transform=dataset_transform,  # 數據集的轉換方式download=True  # 是否下載數據集
)
# 加載測試集
test_set = torchvision.datasets.CIFAR10(root='./dataset',  # 數據集的根目錄train=False,  # 是否為訓練集transform=dataset_transform,  # 數據集的轉換方式download=True  # 是否下載數據集
)

5.3 數據格式

  • 未啟用transform

    test_set[0]返回 PIL.Image 對象和標簽(整數)。

    # 打印測試集的第一個樣本
    print(test_set[0])# 獲取測試集的第一個樣本的圖像和標簽
    img, target = test_set[0]
    # 打印圖像
    print(img)
    # 打印標簽
    print(target)
    
    image-20250521105057749
  • 啟用transform=ToTensor()

    圖像轉為 Tensor 格式(形狀為 [3, 32, 32],值域 [0, 1])。

    # 獲取測試集的第一個樣本的圖像和標簽
    img, target = test_set[0]
    # 打印圖像
    print(img.shape)
    # 打印標簽
    print(target)
    
    image-20250521105254327
  • test_set.classes:直接輸出 10 個類別的名稱列表。

    # 打印測試集的類別
    print(test_set.classes)
    
    image-20250521105605127

5.4 可視化

# 創建一個SummaryWriter對象,用于記錄訓練過程中的數據
writer = SummaryWriter("logs")# 遍歷測試集
for i in range(10):# 獲取測試集中的第i個樣本img, target = test_set[i]# 將第i個樣本的圖像添加到SummaryWriter中writer.add_image("test_set", img, i)writer.close()
image-20250521110026292

6 DataLoader

image-20250425181735945

? 功能:構建可迭代的數據裝載器。

? 常用參數:

  • dataset:Dataset 類,決定數據從哪讀取及如何讀取。
  • batch_size:批大小。
  • shuffle:每個 Epoch 是否亂序。
  • num_workers:是否多進程讀取數據,0 表示使用主線程讀取。
  • drop_last:當樣本數不能被 batch_size 整除時,是否舍棄最后一批數據。
  • Epoch:所有訓練樣本都已輸入到模型中,稱為一個 Epoch。

  • Iteration:一批樣本輸入到模型中,稱之為一個 Iteration。

  • Batchsize:批大小,決定一個 Epoch 有多少個 Iteration。

樣本總數:80,Batchsize:8

  • 1 Epoch 10 Iteration

樣本總數:87,Batchsize:8

  • drop_last = True:1 Epoch = 10 Iteration
  • drop_last = False:1 Epoch = 11 Iteration

? 其他參數

  • sampler:自定義采樣策略(如按權重采樣,與 shuffle 互斥)。
  • batch_sampler:直接生成批次索引(與 batch_size/shuffle/sampler 互斥)。
  • collate_fn:自定義批次合并邏輯(處理非規則數據,如變長序列)。
  • pin_memory:是否將數據復制到 CUDA 固定內存(加速 GPU 數據傳輸)。
  • timeout:從 worker 收集數據的超時時間(秒,0=無超時)。
  • worker_init_fn:每個 worker 的初始化函數(常用于設置隨機種子)。
  • multiprocessing_context:多進程上下文(如 'spawn'/'fork',影響進程啟動方式)。
  • generator:控制隨機采樣的隨機數生成器(RNG)。
  • prefetch_factor:每個 worker 預加載的批次數量(默認 2,僅 num_workers>0 生效)。
  • persistent_workers:是否保持 worker 進程存活(避免重復初始化開銷)。
  • pin_memory_device:指定固定內存的設備(如 'cuda:0')。
  • in_order:是否強制按 FIFO 順序返回批次(num_workers>0 時生效)。

6.1 讀取數據

? 以 CIFAR10 測試集為例,共包含 10000 個樣本。

import torchvision
from torch.utils.data import DataLoader# 加載CIFAR10測試數據集
test_data = torchvision.datasets.CIFAR10(root='./dataset',  # 數據集的根目錄train=False,  # 是否為訓練集transform=torchvision.transforms.ToTensor(),  # 數據預處理
)

? 設置batch_size=4,即每次讀取 4 個樣本,并且drop_last=False

# 創建數據加載器
test_loader = DataLoader(dataset=test_data,  # 數據集batch_size=4,  # 每個batch的大小shuffle=True,  # 是否打亂數據num_workers=0,  # 加載數據的線程數drop_last=False  # 是否丟棄最后一個batch
)

? 遍歷 test_loader 以獲得每批次的數據,

i = 0
# 遍歷test_loader中的數據
for data in test_loader:i += 1imgs, targets = data  # 獲取每批次的數據與標簽print(i, "  ", imgs.shape)print(targets)
image-20250521111845474
  • 數據集一共 10000 個樣本,每批次取出 4 個,因此序號為 10000 / 4 = 2500。
  • 每個批次的張量形狀為 torch.Size([4, 3, 32, 32]),是 4 個 torch.Size([3, 32, 32]) 的組合。
  • targets 為包含 4 個元素的列表,每個元素表示對應位置的數據標簽。

6.2 可視化

? 設置batch_size=64,并且drop_last=False

import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter# 加載CIFAR10測試數據集
test_data = torchvision.datasets.CIFAR10(root='./dataset',  # 數據集的根目錄train=False,  # 是否為訓練集transform=torchvision.transforms.ToTensor(),  # 數據預處理
)# 創建數據加載器
test_loader = DataLoader(dataset=test_data,  # 數據集batch_size=64,  # 每個batch的大小shuffle=True,  # 是否打亂數據num_workers=0,  # 加載數據的線程數drop_last=False  # 是否丟棄最后一個batch
)

? 使用 tensorboard 可視化每個批次。

writer = SummaryWriter('logs')step = 0
# 遍歷test_loader中的數據
for data in test_loader:# 獲取每批次的數據與標簽imgs, targets = data# 將imgs寫入tensorboardwriter.add_images('test_data', imgs, step)step += 1writer.close()

? 拖動滑動條,可看見第 32 step 的批次圖像如下。

image-20250521113345428

? 將滑動條拖動到最右側,發現該批次只剩余 16 張圖像,因為 10000 % 64 = 16。

image-20250521113614564

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

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

相關文章

5月21日學習筆記

MYSQL三層結構 表1 數據庫DB1 表2 數據庫管理系統 客戶端命令終端(Dos) DBMS 數據庫DB2 表1 表2 數據庫………. Mysql數據庫-表的本質仍然是文件 表的一行稱之為一條記錄->在java程序中一行記錄往往使用對象表示 SQL語…

二十、面向對象底層邏輯-ServiceRegistry接口設計集成注冊中心

一、服務治理的基石接口 在微服務架構中,服務實例的動態注冊與發現是保證系統彈性的關鍵機制。Spring Cloud Commons模塊通過ServiceRegistry與Registration接口定義了服務注冊的標準化模型,為不同服務發現組件(Eureka、Consul、Nacos等&…

DeepSeek:以開源之力,引領AI技術新風潮

在年春節,大語言模型DeepSeek如同一枚震撼彈,在全球范圍內引發了轟動,成功“破圈”,將中國的人工智能(AI)技術成果推向了世界舞臺。 開源策略:打破技術壁壘 在AI行業,OpenAI等巨頭…

完整改進RIME算法,基于修正多項式微分學習算子Rime-ice增長優化器,完整MATLAB代碼獲取

1 簡介 為了有效地利用霧狀冰生長的物理現象,最近開發了一種優化算法——霧狀優化算法(RIME)。它模擬硬霧狀和軟霧狀過程,構建硬霧狀穿刺和軟霧狀搜索機制。在本研究中,引入了一種增強版本,稱為修改的RIME…

PyTorch可視化工具——使用Visdom進行深度學習可視化

文章目錄 前置環境Visdom安裝并啟動VisdomVisdom圖形APIVisdom靜態更新API詳解通用參數說明使用示例Visdom動態更新API詳解1. 使用updateappend參數2. ~~使用vis.updateTrace方法~~3. 完整訓練監控示例 Visdom可視化操作散點圖plot.scatter()散點圖案例線性圖vis.line()vis.lin…

Java使用Collections集合工具類

1、Collections 集合工具類 Java 中的 Collections 是一個非常有用的工具類,它提供了許多靜態方法來操作或返回集合。這個類位于 java.util 包中,主要包含對集合進行操作的方法,比如排序、搜索、線程安全化等。 Java集合工具類的使用&#x…

Unity基礎學習(五)Mono中的重要內容(1)延時函數

目錄 一、Mono中的延時函數Invoke 1. Invoke作用:延遲指定時間后執行一次函數。API: 2. InvokeRepeating作用:延遲后開始重復執行函數。API: 3. CancelInvoke作用:停止所有延時函數,或停止指定函數的延時…

180KHz 60V 5A開關電流升壓/升降壓型DC-DC轉換器XL4019升降壓芯片

介紹 XL6019是一款專為升壓、升降壓設計的 單片集成電路(升壓和降壓是由外圍電路拓撲確定的),可工作在DC5V到40V輸入電 壓范圍,低紋波,內置功率MOS。XL6019內 置固定頻率振蕩器與頻率補償電路,簡化了電 路…

如何暢通需求收集渠道,獲取用戶反饋?

要暢通需求收集渠道、有效獲取用戶反饋,核心在于多樣化反饋入口、閉環反饋機制、用戶分層管理、反饋數據結構化分析等四個方面。其中,多樣化反饋入口至關重要,不同用戶有不同的溝通偏好,只有覆蓋多個反饋路徑,才能捕捉…

Python結合ollama和stramlit開發聊天機器人

Python結合ollama和stramlit開發聊天機器人 一、環境準備1、streamlit安裝2、langchain安裝3、ollama的安裝 二、Ollama平臺聊天機器人實現1、需求2、模型調用3、前端實現頁面呈現代碼實現 三、詳細代碼地址四、參考資源 一、環境準備 1、streamlit安裝 # 通過 pip 安裝 pip …

java jdbc執行Oracle sql文件

執行代碼 import java.io.FileInputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.sql.Connection; import java.sql.DriverManager;import org.apache.ibatis.jdbc.ScriptRunner;public class ExecSqlFileController {pu…

[Java實戰]Spring Boot整合MinIO:分布式文件存儲與管理實戰(三十)

[Java實戰]Spring Boot整合MinIO:分布式文件存儲與管理實戰(三十) 一、MinIO簡介與核心原理 MinIO 是一款高性能、開源的分布式對象存儲系統,兼容 Amazon S3 API,適用于存儲圖片、視頻、日志等非結構化數據。其核心特…

開發指南115-CSS中選擇器關系

1、選擇后代 可以用選擇器1 選擇器2(中間用空格分隔)來表達,也可以在大括號里通過包含關系來表達 舉例 .a .b 舉例.a { .b{} } 注意css本身并不支持嵌套的寫法,是scss等提供的擴展能力。 2、選擇直系后代 選擇器1 > 選擇器2&a…

創建型:抽象工廠模式

目錄 1、核心思想 2、實現方式 2.1 模式結構 2.2 實現案例 3、優缺點分析 4、適用場景 1、核心思想 目的:統一管理相關對象的創建,確保產品兼容性。優先用于需要強約束產品兼容性的場景(如UI主題、跨平臺適配) 概念&#…

乘最多水的容器 | 算法 | 給定一個整數數組。有n條垂線。找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。

在我們日常生活中,蓄水似乎是一個極為樸素的物理行為:兩堵墻之間,注入水,看誰能裝得更多。可如果換個角度,從算法的視角去看這個問題,它會變得怎樣?你是否意識到,這樣一個簡單的問題…

無人機避障——深藍學院浙大Ego-Planner規劃部分

ESDF-free: 被這種類型的障礙物死死卡住的情況: 在一定范圍內建立ESDF: Ego-Planner框架: 找到{p,v} pair: 【注意】:首先根據在障礙物內航跡上的點Q,以及與它相鄰但不在障礙物內的兩個點&#…

零基礎設計模式——大綱匯總

零基礎學設計模式 - 大綱 前言 本教程旨在幫助零基礎的同學快速入門設計模式,理解其核心思想和應用場景。我們將通過清晰的講解和簡單的示例,逐步引導你掌握常用的設計模式。 第一部分:設計模式入門 什么是設計模式? 設計模式…

leetcode 92. Reverse Linked List II

題目描述 92. Reverse Linked List II 是第206題的進階版206. Reverse Linked List 思路很簡單,但一次性通過還是有點難度的。 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(n…

CUDA的設備,流處理器(Streams),核,線程塊(threadblock),線程,網格(?gridDim),塊(block)和多gpu設備同步數據概念

CUDA的設備,流處理器,核,線程塊(threadblock),線程,網格(?gridDim),塊(block)和多gpu設備同步數據概念 CUDA的設備,流處理器,核&…

spring5-配外部文件-spEL-工廠bean-FactoryBean-注解配bean

spring配外部文件 我們先在Spring里配置一個數據源 1.導c3p0包,這里我們先學一下hibernate持久化框架&#xff0c;以后用mybites. <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.2.…