我目前正在为回归目的在 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 是姿势信息根据下面的链接,在使用逆变换之前,我需要将缩放器适合我的数据集。
那么,如何在我的预测中使用缩放器的逆变换呢?模型训练代码如下图
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 进行了缩放。现在我想在模型测试/评估期间撤消缩放。