0

我目前正在为回归目的在 pytorch 中训练一个模型(该模型由一些密集层组成)。

我在由图像和地面实况回归目标组成的数据上使用了 sklearn 的标准缩放器。数据集模块如下所示

class BlenderPoseDataset(Dataset):
    
    def __init__(self,paths,batch_size=16):
        self.img_dir='blender_data_1/images_blender/*'
        self.pose_files=paths
        self.batch_size=batch_size
        self.scalar=StandardScaler()
        self.transforms=None
        self.image_shape=(224,224)
        self.data=[]
        img_list=glob.glob(self.img_dir)
        for img_path in img_list:
            for file in self.pose_files:
                self.data.append([img_path,file])
    def __len__(self):
        return len(self.data)
    
    def image_process(self,rgb_img):
        rgb_img=np.transpose(rgb_img.astype('float32'),(2,0,1))/255.0
        return rgb_img
    
    
    def __getitem__(self,idx):
        if self.transforms is not None:
            self.image=self.transform(self.image)
        img_path,pose_path=self.data[idx]
        img=cv2.imread(img_path)
        img=cv2.resize(img,self.image_shape)[:,:,::-1].astype(np.float32)
        img=self.image_process(img)
        img=torch.from_numpy(img).float()
        gt_pose=np.load(pose_path).astype(np.float32)
        gt_pose=self.scalar.fit_transform(gt_pose)
        gt_pose=gt_pose.ravel()
        gt_pose=torch.from_numpy(gt_pose).float()
        return img,gt_pose

img 是标准的 224x224 图像,pose 是姿势信息根据下面的链接,在使用逆变换之前,我需要将缩放器适合我的数据集。

https://datascience.stackexchange.com/questions/80014/notfittederror-says-this-standardscaler-instance-is-not-fitted-yet-while-using-i

那么,如何在我的预测中使用缩放器的逆变换呢?模型训练代码如下图

for epoch in range(num_epochs):
  model.train()
  for batch_idx,(img,gt_pose) in enumerate(train_loader):
    img=img.to(device)
    gt_pose=gt_pose.to(device)
    pred_pose=model(img)
    train_loss=loss(pred_pose,gt_pose)
    train_loss=train_loss/accum_iter
    train_loss.backward()
    if((batch_idx+1)%accum_iter==0) or (batch_idx+1==len(train_loader)):
      optimizer.step()
      optimizer.zero_grad()
    
    print ('Epoch: %03d/%03d | Batch %04d/%04d | Training loss: %.4f' 
                   %(epoch, num_epochs, batch_idx, 
                     len(train_loader), train_loss))
    train_losses.append(train_loss.item())
  model.eval()
  for batch_idx,(img_val,gt_pose_val) in enumerate(val_loader):
    img_val=img_val.to(device)
    gt_pose_val=gt_pose.to(device)
    pred_pose_val=model(img_val)
    loss_val=loss(pred_pose_val,gt_pose_val)
    print ('Epoch: %03d/%03d | Batch %04d/%04d | Validation loss: %.4f' 
                   %(epoch, num_epochs, batch_idx, 
                     len(train_loader), loss_val))
    valid_losses.append(loss_val.item())

预测/评估代码如下

sc=StandardScaler()
img=img.to(device)#same transformations applied on image as during training
torch.manual_seed(123)
with torch.no_grad():
  pred=model(img)
  pred=pred.detach().cpu().numpy()
#sc.inverse_transform(pred) gives an error

为了重复,我训练了一个模型来预测图像中的某些姿势相关信息。姿势数据已使用 StandardScaler 进行了缩放。现在我想在模型测试/评估期间撤消缩放。

4

0 回答 0