为什么输入类型会出错
收藏
初学者做了个分类任务,数据集继承Dateset,网络中说输入数据类型应该是恒定的,但是数据集喂不进去,有大佬可以帮我看下
这是网络的代码
class MyNet(paddle.nn.Layer): def __init__(self, num_classes=12): super(MyNet, self).__init__() self.conv1 = paddle.nn.Conv2D(in_channels=3, out_channels=16, kernel_size=(3, 3)) self.pool1 = paddle.nn.MaxPool2D(kernel_size=2, stride=2) self.conv2 = paddle.nn.Conv2D(in_channels=16, out_channels=32, kernel_size=(3,3)) self.pool2 = paddle.nn.MaxPool2D(kernel_size=2, stride=2) self.conv3 = paddle.nn.Conv2D(in_channels=32, out_channels=64, kernel_size=(3,3)) self.pool3 = paddle.nn.MaxPool2D(kernel_size=2, stride=2) self.conv4 = paddle.nn.Conv2D(in_channels=64, out_channels=64, kernel_size=(3,3)) self.pool4 = paddle.nn.MaxPool2D(kernel_size=2, stride=2) self.conv5 = paddle.nn.Conv2D(in_channels=64, out_channels=64, kernel_size=(3,3)) self.pool5 = paddle.nn.MaxPool2D(kernel_size=2, stride=2) self.flatten = paddle.nn.Flatten() self.linear1 = paddle.nn.Linear(in_features=3136, out_features=64) self.linear2 = paddle.nn.Linear(in_features=64, out_features=num_classes) def forward(self, x): x = self.conv1(x) x = F.relu(x) x = self.pool1(x) x = self.conv2(x) x = F.relu(x) x = self.pool2(x) x = self.conv3(x) x = F.relu(x) x = self.pool3(x) x = self.conv4(x) x = F.relu(x) x = self.pool4(x) x = self.conv5(x) x = F.relu(x) x = self.pool5(x) x = self.flatten(x) x = self.linear1(x) x = F.relu(x) x = self.linear2(x) return x
这是网络的结构
数据集的输入和相对应的标签
训练过程
最后遇到的问题
这是数据集的源代码
import paddle import io, os, random from paddle.io import Dataset import numpy as np import matplotlib.pyplot as plt from PIL import Image # paddle.__version__ class MyDatasets(Dataset): def __init__(self, mode = 'train', image_path = "data/data10954/"): super(MyDatasets, self).__init__() self.mode = mode.lower() if self.mode == 'train': self.image_path = os.path.join(image_path, 'train') elif self.mode == 'val': self.image_path = os.path.join(image_path, 'val') else: raise ValueError('mode must be "train" or "val"') # 原始图片的大小 self.crop_size = 300 # 缩放的倍率 self.upscale_factor = 3 # 输入的图片的尺寸 self.input_size = self.crop_size // self.upscale_factor # 通道数 self.channel = 3 # 随机数种子 self.seed = 1337 # 图片集合 self.temp_images = [] # 加载数据 self._parse_dataset() """ 以上定义的是一些变量和一些方法 为接下来的处理以及模型的搭建做准备 """ def transforms(self, img): # 升维度 if len(img.shape) == 2: img = np.expand_dims(img, axis = 2) return img.transpose((2, 0, 1)) def __getitem__(self, idx): """ 返回原始图片和缩放三倍的图片 """ la = self.temp_images[idx].split("/") img = self._load_img(self.temp_images[idx]) img = img.resize([self.crop_size, self.crop_size], Image.BICUBIC) img = np.array(img, dtype='float64').reshape(-1, self.channel, self.crop_size, self.crop_size) / 255.0 label = np.array(la[3], dtype = "int32") # label = paddle.cast(la[3], dtype="int32") return img, label def __len__(self): """ 实现len方法,返回数据集总数目 """ return len(self.temp_images) def _load_datasets(self, img_dir): """ 对文件夹中的图片进行处理 """ files = [] for item in os.listdir(img_dir): for j in os.listdir(img_dir + os.sep + item): files.append(os.path.join(img_dir, item + os.sep + j)) # print(files) return files def _parse_dataset(self): """ 处理数据集 """ self.temp_images = self._load_datasets(self.image_path) random.Random(self.seed).shuffle(self.temp_images) def _load_img(self, path): """ 从磁盘读取文件 """ with open(path, 'rb') as f: img = Image.open(io.BytesIO(f.read())) img = img.convert("RGB") return img
0
收藏
请登录后评论
使用paddle.cast(x, dtype),将输入数据转为float64.
改了,还是有点错,不知道为什么,不过还是感谢大佬回答
没事,你要是解决不了,可以继续把报错信息放上来,大家一起看看~
好的~~
修改了输入的类型,代码如下
依旧报错
你把报错信息贴全,具体是哪一行报错了
完整的报错信息
请问你转换为tensor了吗?
没看到你对标签to tensor,好像只对img用了
def __getitem__(self, idx):
la = self.temp_images[idx].split("/")
img = self._load_img(self.temp_images[idx])
img = img.resize([self.crop_size, self.crop_size], Image.BICUBIC)
img = np.array(img, dtype='float64').reshape(-1, self.channel, self.crop_size, self.crop_size) / 255.0
img = paddle.to_tensor(img, "float64")
img = paddle.cast(img, "float64")
label = np.array(la[3], dtype = "int32")
return img, label
我去试试
感谢大家的帮助,问题已经解决了,就是在数据集加载的时候出现的错误,正确的代码如下
解决就好,看你问题估计是初学者,万事开头难
跑上十个八个模型,基本就摸明白了常见问题