怎么做公司網(wǎng)站推廣免費(fèi)正規(guī)的接單平臺(tái)
人這輩子千萬(wàn)不要馬虎兩件事
一是找對(duì)愛(ài)人、二是選對(duì)事業(yè)
因?yàn)樘?yáng)升起時(shí)要投身事業(yè)
太陽(yáng)落山時(shí)要與愛(ài)人相擁
一、準(zhǔn)備數(shù)據(jù)集
螞蟻蜜蜂數(shù)據(jù)集
螞蟻蜜蜂的圖片,文件名就是數(shù)據(jù)的label
二、使用Dataset加載數(shù)據(jù)
打開(kāi)pycharm,選擇Anaconda創(chuàng)建的pytorch環(huán)境
將數(shù)據(jù)集放在項(xiàng)目的根目錄下,并修改文件名
?新建 read_data.py文件,編寫(xiě)如下代碼
from torch.utils.data import Dataset
from PIL import Image
import osclass MyData(Dataset):# 獲取訓(xùn)練數(shù)據(jù)的listdef __init__(self, root_dir, label_dir):self.root_dir = root_dirself.label_dir = label_dirself.path = os.path.join(self.root_dir, self.label_dir)self.img_path = os.listdir(self.path)# 獲取每一張圖片及其labeldef __getitem__(self, idx):img_name = self.img_path[idx]img_item_path = os.path.join(self.root_dir, self.label_dir, img_name)img = Image.open(img_item_path)label = self.label_dirreturn img, labeldef __len__(self):return len(self.img_path)root_dir = "dataset/train"
ant_label_dir = "ants"
bee_label_dir = "bees"
ants_dataset = MyData(root_dir, ant_label_dir)
bees_dataset = MyData(root_dir, bee_label_dir)train_dataset = ants_dataset + bees_dataset
解釋:
1. MyData繼承Dataset類(lèi)
2. 重寫(xiě)里面的__init__方法,在MyData類(lèi)初始化時(shí),通過(guò)拼接數(shù)據(jù)路徑,os.listdir()加載出數(shù)據(jù)的list列表
3. 重寫(xiě)里面的__getitem__方法,將一張一張地將list的圖片和對(duì)應(yīng)的label加載出來(lái)
4.train_dataset = ants_dataset + bees_dataset,得到訓(xùn)練數(shù)據(jù)集
三、TensorBoard的使用
安裝TensorBoard需要的包
pip install?tensorboard
編寫(xiě)如下代碼:
from torch.utils.tensorboard import SummaryWriter# 指定log文件生成的位置
writer = SummaryWriter("logs")for i in range(100):'''第一個(gè)參數(shù):圖像的title第二個(gè)參數(shù):縱坐標(biāo)的值 第三個(gè)參數(shù):橫坐標(biāo)的值'''writer.add_scalar("y=3x", 3 * i, i)# 關(guān)閉資源
writer.close()
運(yùn)行代碼,會(huì)在SummaryWriter指定的位置生成log文件
在Terminal運(yùn)行下面語(yǔ)句:
可以自己指定端口,防止沖突
tensorboard --logdir=logs --port=6007
運(yùn)行輸出
在瀏覽器打開(kāi)
使用?writer.add_image 加載圖片
編寫(xiě)下面代碼:
from torch.utils.tensorboard import SummaryWriter
from PIL import Image
import numpy as np# 指定log文件生成的位置
writer = SummaryWriter("logs")image_path = "dataset/train/ants/7759525_1363d24e88.jpg"
image_PIL = Image.open(image_path)
image_array = np.array(image_PIL)'''
第一個(gè)參數(shù):圖像的title
第二個(gè)參數(shù):圖片的numpy值
第三個(gè)參數(shù):步數(shù)
第四個(gè)參數(shù):將圖片進(jìn)行轉(zhuǎn)換,3通道放在前面
'''
writer.add_image("test", image_array, 1, dataformats='HWC')for i in range(100):'''第一個(gè)參數(shù):圖像的title第二個(gè)參數(shù):縱坐標(biāo)的值 第三個(gè)參數(shù):橫坐標(biāo)的值'''writer.add_scalar("y=3x", 3 * i, i)# 關(guān)閉資源
writer.close()
?同樣在控制臺(tái)打開(kāi)運(yùn)行生成的日志文件
四、Transforms的使用
圖片轉(zhuǎn)換工具
ToTensor() 把 PIL格式或者numpy格式轉(zhuǎn)換成tensor
編寫(xiě)如下代碼:
from PIL import Image
from torchvision import transformsimg_path = "dataset/train/ants/0013035.jpg"
img = Image.open(img_path)# 使用transforms
tensor_trans = transforms.ToTensor()
tensor_img = tensor_trans(img)print(tensor_img)
輸出:
tensor([[[0.3137, 0.3137, 0.3137, ..., 0.3176, 0.3098, 0.2980],[0.3176, 0.3176, 0.3176, ..., 0.3176, 0.3098, 0.2980],[0.3216, 0.3216, 0.3216, ..., 0.3137, 0.3098, 0.3020],...,[0.3412, 0.3412, 0.3373, ..., 0.1725, 0.3725, 0.3529],[0.3412, 0.3412, 0.3373, ..., 0.3294, 0.3529, 0.3294],[0.3412, 0.3412, 0.3373, ..., 0.3098, 0.3059, 0.3294]],[[0.5922, 0.5922, 0.5922, ..., 0.5961, 0.5882, 0.5765],[0.5961, 0.5961, 0.5961, ..., 0.5961, 0.5882, 0.5765],[0.6000, 0.6000, 0.6000, ..., 0.5922, 0.5882, 0.5804],...,[0.6275, 0.6275, 0.6235, ..., 0.3608, 0.6196, 0.6157],[0.6275, 0.6275, 0.6235, ..., 0.5765, 0.6275, 0.5961],[0.6275, 0.6275, 0.6235, ..., 0.6275, 0.6235, 0.6314]],[[0.9137, 0.9137, 0.9137, ..., 0.9176, 0.9098, 0.8980],[0.9176, 0.9176, 0.9176, ..., 0.9176, 0.9098, 0.8980],[0.9216, 0.9216, 0.9216, ..., 0.9137, 0.9098, 0.9020],...,[0.9294, 0.9294, 0.9255, ..., 0.5529, 0.9216, 0.8941],[0.9294, 0.9294, 0.9255, ..., 0.8863, 1.0000, 0.9137],[0.9294, 0.9294, 0.9255, ..., 0.9490, 0.9804, 0.9137]]])
常見(jiàn)的Transforms
在機(jī)器學(xué)習(xí)和深度學(xué)習(xí)中,數(shù)據(jù)轉(zhuǎn)換(Transforms)是一種常見(jiàn)的操作,用于對(duì)數(shù)據(jù)進(jìn)行預(yù)處理、增強(qiáng)或標(biāo)準(zhǔn)化。下面是一些常見(jiàn)的數(shù)據(jù)轉(zhuǎn)換操作:
1. 數(shù)據(jù)標(biāo)準(zhǔn)化(Normalization):將數(shù)據(jù)按比例縮放,使其落在特定的范圍內(nèi),通常是將數(shù)據(jù)映射到0到1之間或者使用均值為0、方差為1的分布(更快收斂)。這可以通過(guò)以下方法實(shí)現(xiàn):
- Min - Max標(biāo)準(zhǔn)化:將數(shù)據(jù)縮放到指定的最小值和最大值之間。
- Z-Score標(biāo)準(zhǔn)化:將數(shù)據(jù)轉(zhuǎn)化為均值為0、標(biāo)準(zhǔn)差為1的分布。
2. 數(shù)據(jù)增強(qiáng)(Data Augmentation):用于擴(kuò)充訓(xùn)練數(shù)據(jù)集,增強(qiáng)樣本的多樣性,提高模型的泛華能力。常見(jiàn)的數(shù)據(jù)增強(qiáng)操作包括:
- 隨機(jī)裁剪(Random Crop):隨機(jī)裁剪圖像的一部分,以減少位置的依賴(lài)性。
- 隨機(jī)翻轉(zhuǎn)(Random Filp):隨機(jī)水平或垂直翻轉(zhuǎn)圖像,增加數(shù)據(jù)的多樣性。
- 隨機(jī)旋轉(zhuǎn)(Random Rotation):隨機(jī)旋轉(zhuǎn)圖像的角度,增加數(shù)據(jù)的多樣性。
3. 圖像預(yù)處理:用于對(duì)圖像進(jìn)行預(yù)處理,以減少噪聲、增強(qiáng)特征或改變圖像的外觀。一些常見(jiàn)的圖像預(yù)處理操作包括:
- 圖像平滑(Image Smoothing):使用濾波器對(duì)圖像進(jìn)行平滑處理,減少噪聲。
- 直方圖均衡化(Histogram Equalization):增強(qiáng)圖像的對(duì)比度,使得圖像中的像素值更加均勻分布。
- 圖像縮放(Image Resizing):改變圖像的尺寸,通常用于將圖像調(diào)整為模型輸入的大小。
4. 文本預(yù)處理:用于對(duì)文本數(shù)據(jù)進(jìn)行預(yù)處理和清洗,以便更好地適應(yīng)模型的輸入要求。一些常見(jiàn)的文本預(yù)處理操作包括:
- 分詞(Tokenization):將文本分割成單個(gè)的詞或字符。
- 去除停用詞(Stopword Removal):去除常見(jiàn)的無(wú)意義詞語(yǔ),如“a”,“the”等。
- 文本向量化(Text Vectorzation):將文本轉(zhuǎn)換為數(shù)值形式,如使用詞袋模型或詞嵌入。
以上只是一些常見(jiàn)的數(shù)據(jù)轉(zhuǎn)換操作示例,實(shí)際應(yīng)用中可能會(huì)根據(jù)任務(wù)和數(shù)據(jù)的特點(diǎn)進(jìn)行適當(dāng)?shù)恼{(diào)整和組合。在使用轉(zhuǎn)換操作時(shí),可以使用各種機(jī)器學(xué)習(xí)框架(如PyTorch、TensorFlow)提供的相關(guān)庫(kù)或函數(shù)來(lái)實(shí)現(xiàn)這些操作。
示例代碼如下:
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transformsimg_path = "hymenoptera_data/16.jpg"
img = Image.open(img_path)writer = SummaryWriter("logs")# totensor使用
tensor_trans = transforms.ToTensor()
tensor_img = tensor_trans(img)
writer.add_image("lyy", tensor_img)# Normalize 使用
trans_norm = transforms.Normalize([111,111,111],[10,10,10])
img_norm = trans_norm(tensor_img)
writer.add_image("normalize", img_norm, 2)# resize
trans_resize = transforms.Resize( (512, 512))
img_resize = trans_resize(img) # 輸入的是Image類(lèi)型的圖像
img_resize_tensor = transforms.ToTensor()tensor_img = tensor_trans(img_resize)
writer.add_image("resize", tensor_img, 0)# compose 用法
trans_resize_2 =transforms.Resize(123)
trans_compose = transforms.Compose([trans_resize_2, tensor_trans])
img_resize_2 = trans_compose(img)
writer.add_image("resize2", img_resize_2,1)# randomCrop
trans_random = transforms.RandomCrop((20,50))
trans_compose_2 = transforms.Compose([trans_random, tensor_trans])
for i in range(10):img_crop = trans_compose_2(img)writer.add_image("randomCrop", img_crop, i)writer.close()print("end")
五、torchvision中數(shù)據(jù)集使用
pytorch提供了很多的數(shù)據(jù)集,提供給我們學(xué)習(xí)使用。
進(jìn)入官網(wǎng)
?選擇Dataset數(shù)據(jù)集
下面就是常用的數(shù)據(jù)集
?CIFAR10數(shù)據(jù)集使用示例:
?代碼示例:
import torchvision
from torch.utils.tensorboard import SummaryWriterdataset_transfrom = torchvision.transforms.Compose([torchvision.transforms.ToTensor])train_set = torchvision.datasets.CIFAR10(root="./cifar10", train=True, transform=dataset_transfrom, download=True)
test_set = torchvision.datasets.CIFAR10(root="./cifar10", train=False, transform=dataset_transfrom, download=True)writer = SummaryWriter("test_torchvision")
for i in range(10):img, target = test_set[i]writer.add_image("test_torchvision", img, i)writer.close()
?提示:這樣下載數(shù)據(jù)集很慢,可以使用迅雷下載, ctrl + CIFAR10? 進(jìn)入類(lèi)里面,里面有下載地址,如下:
?把下載好的數(shù)據(jù)集壓縮包,放在指定路徑下即可。
?然后再tensorboard面板就能看到下載的數(shù)據(jù)集
六、DataLoader使用
Dataset是整理好的數(shù)據(jù)集
DataLoader是把這個(gè)數(shù)據(jù)集加載到神經(jīng)網(wǎng)絡(luò)中去訓(xùn)練
使用示例:
import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWritertest_data = torchvision.datasets.CIFAR10("./cifar10", train=False, transform=torchvision.transforms.ToTensor())
test_loader = DataLoader(dataset=test_data, batch_size=64, shuffle=True, num_workers=0, drop_last=False)writer = SummaryWriter("dataloader")step = 0
for data in test_loader:imgs, targets = datawriter.add_images("dataloader", imgs, step)step = step + 1writer.close()
解釋:
通過(guò)創(chuàng)建?test_loader
,您可以使用?for
?循環(huán)迭代它來(lái)逐批獲取測(cè)試數(shù)據(jù)
dataset
: 指定要加載的數(shù)據(jù)集test_data
。batch_size
: 指定每個(gè)批次中的樣本數(shù)量。在這里,每個(gè)批次中有64個(gè)樣本。shuffle
: 指定是否對(duì)數(shù)據(jù)進(jìn)行洗牌(隨機(jī)重排)。如果設(shè)置為?True
,每個(gè) epoch(訓(xùn)練周期)開(kāi)始時(shí),數(shù)據(jù)將被隨機(jī)打亂順序。這對(duì)于增加數(shù)據(jù)的隨機(jī)性、減少模型對(duì)輸入順序的依賴(lài)性很有用。num_workers
: 指定用于數(shù)據(jù)加載的子進(jìn)程數(shù)量。在這里,設(shè)置為0表示在主進(jìn)程中加載數(shù)據(jù),沒(méi)有額外的子進(jìn)程參與。如果設(shè)置為大于0的值,將使用多個(gè)子進(jìn)程并行加載數(shù)據(jù),可以加快數(shù)據(jù)加載速度。drop_last
: 指定當(dāng)數(shù)據(jù)樣本數(shù)量不能被?batch_size
?整除時(shí),是否丟棄最后一個(gè)不完整的批次。如果設(shè)置為?True
,最后一個(gè)不完整的批次將被丟棄;如果設(shè)置為?False
,最后一個(gè)不完整的批次將保留。
運(yùn)行之后在tensorboard面板查看