python - 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)
解决方案
首先,您的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
文档以及您是否真的需要它。
其次,如果你想要sklearn
它MLPClassifier
,你已经将这些数组转换为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 分钟闪电战对你来说似乎是一个很好的起点,因为这里有很多需要修复的地方。
推荐阅读
- elasticsearch - 我想将无痛脚本查询转换为 java1.8 和 RestHighLevelClient
- node.js - 无法在 Node Express 中删除 x-powered-by 标头
- mongodb - 是否可以使用 esp8266 将数据发送到 mongodb 集群?
- css - 无边距双行列表项
- python - 施工图的图案识别工具
- javascript - 如何在角度 8 中导航到下一个组件时保存组件的先前状态
- java - 在打印错误消息后,我如何将用户困在一个循环中,直到给出有效输入?
- laravel - Laravel 5.7 验证仍然无效
- reactjs - 在 React 上使用 axios 删除本地服务器(JSON 文件)上的条目
- python - 如何在重载保存中更新 m2m 连接