I bought a book on Pytorch and read that and thought I got it. I even read more forum posts of similar errors but nothing. I found people had this problem with the len function but rarely the getitem function like mine. I did find a typo as I put get_item but changing this to the correct getitem did not solve the problem. I changed the notation from category_id to label as I tried to follow someone elses  class for the same Kaggle competition hoping to solve the problem but alas.
I also slightly tweaked my DataSet code to include the category_ids (labels) in the CreateDataset class too. Hence why def init now has an extra argument compared to the original post.
train_dataset = CreateDataset(train_data, train_data["category_id"], train_transform())

class CreateDataset(Dataset):
    def __init__(self, data, labels, transforms = None):
        self.data = data
        self.transform = train_transform
        self.labels = labels
        
    def __len__(self):
        return len(self.data)
        
    def __getitem__(self, index):
        file_name = self.data["file_name"].values[index]
        image = cv2.imread(train_path + file_name)
        if image is None:
            return None
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB).astype(np.float32)
        image /= 255.0
        label = self.labels.values[index]
        
        if self.transform:
            image = {"image" : image,}
            image = self.transform(**image)   
            
        return image, label
    

Error…
---------------------------------------------------------------------------
NotImplementedError                       Traceback (most recent call last)
<ipython-input-63-d95c0074ab2b> in <module>
      5 train_losses, test_losses = [], []
      6 for epoch in range(epochs):
----> 7     for image, label in train_loader:
      8         steps += 1
      9         label = label.to(device)

/opt/conda/lib/python3.7/site-packages/torch/utils/data/dataloader.py in __next__(self)
    343 
    344     def __next__(self):
--> 345         data = self._next_data()
    346         self._num_yielded += 1
    347         if self._dataset_kind == _DatasetKind.Iterable and \

/opt/conda/lib/python3.7/site-packages/torch/utils/data/dataloader.py in _next_data(self)
    383     def _next_data(self):
    384         index = self._next_index()  # may raise StopIteration
--> 385         data = self._dataset_fetcher.fetch(index)  # may raise StopIteration
    386         if self._pin_memory:
    387             data = _utils.pin_memory.pin_memory(data)

/opt/conda/lib/python3.7/site-packages/torch/utils/data/_utils/fetch.py in fetch(self, possibly_batched_index)
     42     def fetch(self, possibly_batched_index):
     43         if self.auto_collation:
---> 44             data = [self.dataset[idx] for idx in possibly_batched_index]
     45         else:
     46             data = self.dataset[possibly_batched_index]

/opt/conda/lib/python3.7/site-packages/torch/utils/data/_utils/fetch.py in <listcomp>(.0)
     42     def fetch(self, possibly_batched_index):
     43         if self.auto_collation:
---> 44             data = [self.dataset[idx] for idx in possibly_batched_index]
     45         else:
     46             data = self.dataset[possibly_batched_index]

/opt/conda/lib/python3.7/site-packages/torch/utils/data/dataset.py in __getitem__(self, index)
     23 
     24     def __getitem__(self, index):
---> 25         raise NotImplementedError
     26 
     27     def __add__(self, other):

NotImplementedError: 



Thanks.