deep-learning - 如何组合图像 id 图像并使用 pytorch 转换为张量
问题描述
我是 PyTorch 的新手,我正在使用 PyTorch 进行图像分类。我有一个单独的图像文件夹,并使用图像 ID 和标签训练和测试 csv 文件。我对如何组合这些图像和 ide 并转换为张量一无所知。我试过了,但它不起作用,请帮助如何为 CNN 模型准备数据。
这里我的数据:
train.head()
image_names emergency_or_not
0 1503.jpg 0
1 1420.jpg 0
2 1764.jpg 0
3 1356.jpg 0
4 1117.jpg 0
这是我的数据文件夹
!ls train_SOaYf6m/
images test_vc2kHdQ.csv train.csv
这是我的代码:
批量大小 = 128
validation_split = .3
shuffle_dataset = True
random_seed= 42
dataset_size = len(train)
indices = list(range(dataset_size))
split = int(np.floor(validation_split * dataset_size))
if shuffle_dataset :
np.random.seed(random_seed)
np.random.shuffle(indices)
train_indices, val_indices = indices[split:], indices[:split]
class clf_Dataset(Dataset):
def __init__(self, img_data,img_path,transfrom=None):
self.img_path=img_path
self.transfrom=transform
self.img_data=img_data
def __len__(self):
return len(self.img_data)
def __getitem__(self, index):
img_name = os.path.join(self.img_path,self.img_data.loc[index, 'labels'],
self.img_data.loc[index, 'Images'])
image = Image.open(img_name)
#image = image.convert('RGB')
image = image.resize((300,300))
label = torch.tensor(self.img_data.loc[index, 'encoded_labels'])
if self.transform is not None:
image = self.transform(image)
return image, label
dataset = clf_Dataset(train,Base_Path,transform)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-33-e7543361b139> in <module>()
----> 1 dataset = clf_Dataset(train,Base_Path,transform)
NameError: name 'Base_Path' is not defined
解决方案
首先,我强烈推荐这个youtube系列来了解 PyTorch 以及与之相关的所有内容
然后你可以这样做,首先你需要将图像分类到这样的文件夹中:
- 火车文件夹
- classe_1_folder
- classe_2_folder
- ...
- 测试文件夹
- classe_1_folder
- classe_2_folder
- ...
然后你可以使用下面的函数来加载你的训练集并对你的测试文件夹做同样的事情
train_data = torchvision.datasets.ImageFolder(root= (absolute_path + "train_folder"))
之后,您可以像这样传递train_data
给加载器:
train_loader = torch.utils.data.DataLoader(train_data , ...)
然后用一个简单的 for 循环训练你的模型:
for batch in train_loader:
***
train_your_model()
***
编辑:如果你真的需要创建一个类,你可以这样做:
df = pd.read_csv("path_to_fic.csv")
df['label'] = df['label'].astype('category')
encode_map = {
'label_0': 0
'label_1': 1,
...
}
df['label'].replace(encode_map, inplace=True)
class TrainData(Dataset):
def __init__(self, images, labels):
# Add a transform here if you need
# load your images here if you prefer
images = ...
self.images = images
self.labels = labels
def __getitem__(self, index):
return self.images[index], self.labels[index]
def __len__ (self):
return len(self.images)
# images = Im.open() # probably need a for loop to load all your images
# images = df[path_to_csv]
images = ... # you can load here or in the class
# depends if you want to pass the dataframe containing the location or the images themselves
labels = df['label']
train_data = TrainData(torch.FloatTensor(images),
torch.FloatTensor(labels))
train_loader = DataLoader(dataset=train_data, batch_size=BATCH_SIZE, shuffle=True)
推荐阅读
- r - 长格式的新数据帧取决于条件
- html - 平板电脑大小的设备、媒体查询的边距未对齐
- javascript - 如何在 index.html angular 8 中使用 *ngIf
- firebase - 在 Firebase 中检索当前登录的用户是否需要付费
- java - 以编程方式在 viewpager 内的 SupportMapFragment 上的按钮
- javascript - html中select中的PHP动态选项
- node.js - NodeJS 生成 pdf 并保存到 firebase 存储。无法打开文件
- z3 - 在 smtlib 中定义列表 concat
- r - R包插入符号使用recipe和bak进行数据预处理
- android - 我可以一次上传 3 个 APK 到 Play 商店吗?