首页 > 解决方案 > Python/Pytorch - 如何使用图像数组?

问题描述

我想将图像数据放入神经网络,但在使用 Image 数据类型时遇到问题。我在这里使用 Pytorch 读取了我的数据;

import torch
import torchvision
import numpy as np
from settings import Settings

class Data_Read:
    @staticmethod
    def getTrain():
        train_dataset = torchvision.datasets.ImageFolder(
            root=Settings.pathTrainImagesCopy,
            transform=torchvision.transforms.ToTensor()
        )
        train_loader = torch.utils.data.DataLoader(
            train_dataset,
            batch_size=64,
            num_workers=0,
            shuffle=True
        )
        return train_loader

    @staticmethod
    def getTest():
        test_dataset = torchvision.datasets.ImageFolder(
            root=Settings.pathTestImagesCopy,
            transform=torchvision.transforms.ToTensor()
        )
        test_loader = torch.utils.data.DataLoader(
            test_dataset,
            batch_size=64,
            num_workers=0,
            shuffle=True
        )
        return test_loader

以下代码创建一维图像列;

class Imagez:
    @staticmethod
    def Get(arr):
        imageData = []
        for item in arr:
            filePath = item
            img = Image.open(filePath).convert('LA')
            imageData.append(img)

        return imageData

这些方法是从主类调用的,如下所示;

trainData = Data_Read.getTrain()
testData = Data_Read.getTest()

arrTrain = np.array(trainData.dataset.imgs)[:,0]
labelTrain = trainData.dataset.targets

arrTest = np.array(testData.dataset.imgs)[:,0]
labelTest = testData.dataset.targets

X_Train = Imagez.Get(arrTest)

我发现每当我尝试在 X_Train 中使用 Images 数据类型时,都会遇到错误消息。例如;

mlp = MLPClassifier(hidden_layer_sizes=(10,10,10), max_iter=1000 )
mlp.fit(X_Train, labelTrain)

会给我这个错误信息;

回溯(最后一次调用):文件“c:\Users\hijik.vscode\extensions\ms-python.python-2019.11.50794\pythonFiles\ptvsd_launcher.py”,第 43 行,在 main(ptvsdArgs) 文件“c: \Users\hijik.vscode\extensions\ms-python.python-2019.11.50794\pythonFiles\lib\python\old_ptvsd\ptvsd__main__.py”,第 432 行,在 main run() 文件“c:\Users\hijik.vscode \extensions\ms-python.python-2019.11.50794\pythonFiles\lib\python\old_ptvsd\ptvsd__main__.py",第 316 行,在 run_file runpy.run_path(target, run_name=' main') 文件“C:\Users\hijik\AppData\Local\Continuum\anaconda3\lib\runpy.py”,第 263 行,run_path pkg_name=pkg_name, script_name=fname) 文件“C:\Users\hijik\AppData\ Local\Continuum\anaconda3\lib\runpy.py",第 96 行,在 _run_module_code mod_name、mod_spec、pkg_name、script_name) 文件“C:\Users\hijik\AppData\Local\Continuum\anaconda3\lib\runpy.py”中,第 85 行,在 _run_code exec(code, run_globals) 文件“d:\702\702-Coursework-Task-5\src\Main.py”中,第 74 行,在 mlp.fit(X_Train, Y_TrainLabels) 文件“C:\ Users\hijik\AppData\Local\Continuum\anaconda3\lib\site-packages\sklearn\neural_network\multilayer_perceptron.py",第 981 行,适合
return self._fit(X, y, incremental=(self.warm_start and File "C:\Users\hijik\AppData\Local\Continuum\anaconda3\lib\site-packages\sklearn\neural_network\multilayer_perceptron.py",第 323 行, 在 _fit X, y = self._validate_input(X, y, incremental) 文件“C:\Users\hijik\AppData\Local\Continuum\anaconda3\lib\site-packages\sklearn\neural_network\multilayer_perceptron.py”,行919,在 _validate_input multi_output=True) 文件 "C:\Users\hijik\AppData\Local\Continuum\anaconda3\lib\site-packages\sklearn\utils\validation.py",第 719 行,在 check_X_y estimator=estimator) 文件中“C:\Users\hijik\AppData\Local\Continuum\anaconda3\lib\site-packages\sklearn\utils\validation.py”,第 496 行,在 check_array 数组 = np.asarray(array, dtype=dtype, order=订单)文件“C:\Users\hijik\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\core\numeric.py",第 538 行,在 asarray 中返回数组(a,dtype,copy=False,order=order)类型错误: int() 参数必须是字符串、类似字节的对象或数字,而不是“图像”

我在想我需要将我的图像转换为另一种数据类型。你会给什么建议?

编辑 - 这是最小的可重现错误;

X_Train = []
filePath = '..\\images\\Train\\anger\\S010_004_00000014.png'
img = Image.open(filePath).convert('LA')
X_Train.append(img)
Y_TrainLabels = ["0"]
mlp = MLPClassifier(hidden_layer_sizes=(10,10,10), max_iter=1000 )
mlp.fit(X_Train, Y_TrainLabels)

标签: pythonpytorch

解决方案


首先,您的Imagez课程返回PIL图像列表,这些图像不能用于训练,因为您需要数字表示。

简单的解决方法是:

import torchvision


class Imagez:
    @staticmethod
    def Get(arr):
        imageData = []
        for item in arr:
            filePath = item
            # This transforms below
            img = torchvision.transforms.functional.to_tensor(
                Image.open(filePath).convert("LA")
            )
            imageData.append(img)

        return imageData

请参阅convert文档以及您是否真的需要它。

其次,如果你想要sklearnMLPClassifier,你已经将这些数组转换为np.array.

对于每一个,您都可以调用.numpy()pytorch 张量来转换它,然后将其堆叠成一个数组。

此外,您的输入和输出似乎是图像,您要么必须将flatten它们放入单个向量中以用于完全连接的层,要么使用卷积神经网络和 PyTorch,例如下面的网络:

import torch

model = torch.nn.Sequential(
    torch.nn.Conv2d(3, 64, kernel_size=3),
    torch.nn.Conv2d(64, 128, kernel_size=3),
    torch.nn.Conv2d(128, 128, kernel_size=3),
    torch.nn.Conv2d(128, 128, kernel_size=3),
    torch.nn.Conv2d(128, 1, kernel_size=3),
)

你可以在 PyTorch 网站上找到一些基本教程,60 分钟闪电战对你来说似乎是一个很好的起点,因为这里有很多需要修复的地方。


推荐阅读