为什么输入类型会出错
收藏
初学者做了个分类任务,数据集继承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
我去试试
感谢大家的帮助,问题已经解决了,就是在数据集加载的时候出现的错误,正确的代码如下
解决就好,看你问题估计是初学者,万事开头难
跑上十个八个模型,基本就摸明白了常见问题