首页 Paddle框架 帖子详情
为什么输入类型会出错 已解决
收藏
快速回复
Paddle框架 问答模型训练 1495 11
为什么输入类型会出错 已解决
收藏
快速回复
Paddle框架 问答模型训练 1495 11
初学者做了个分类任务,数据集继承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
Lem-tree
已解决
12# 回复于2022-02
感谢大家的帮助,问题已经解决了,就是在数据集加载的时候出现的错误,正确的代码如下 [代码]
展开
0
收藏
回复
全部评论(11)
时间顺序
十进制到二进制
#2 回复于2022-02

使用paddle.cast(x, dtype),将输入数据转为float64.

0
回复
Lem-tree
#3 回复于2022-02
使用paddle.cast(x, dtype),将输入数据转为float64.

改了,还是有点错,不知道为什么,不过还是感谢大佬回答

0
回复
十进制到二进制
#4 回复于2022-02

没事,你要是解决不了,可以继续把报错信息放上来,大家一起看看~

0
回复
Lem-tree
#6 回复于2022-02
没事,你要是解决不了,可以继续把报错信息放上来,大家一起看看~

好的~~

 

0
回复
Lem-tree
#7 回复于2022-02

修改了输入的类型,代码如下

    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

依旧报错

0
回复
十进制到二进制
#8 回复于2022-02

你把报错信息贴全,具体是哪一行报错了

0
回复
Lem-tree
#9 回复于2022-02

完整的报错信息

0
回复
奔向未来的样子
#10 回复于2022-02

请问你转换为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

1
回复
Lem-tree
#11 回复于2022-02
请问你转换为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
展开

我去试试

0
回复
Lem-tree
#12 回复于2022-02

感谢大家的帮助,问题已经解决了,就是在数据集加载的时候出现的错误,正确的代码如下

 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).astype('float32').reshape(self.channel, self.crop_size, self.crop_size) / 255.0

        label = np.array([la[3]]).astype("int64")
        return img, label
0
回复
奔向未来的样子
#13 回复于2022-02

解决就好,看你问题估计是初学者,万事开头难

跑上十个八个模型,基本就摸明白了常见问题

1
回复
需求/bug反馈?一键提issue告诉我们
发现bug?如果您知道修复办法,欢迎提pr直接参与建设飞桨~
在@后输入用户全名并按空格结束,可艾特全站任一用户