class_docstr: Class that performs the reading of the csv_input and select the lines
  according to the subject id if available
class_docstr_tok: ["Class","that","performs","the","reading","of","the","csv_input","and","select","the","lines","according","to","the","subject","id","if","available"]
docstr: :return: dict of label shape and label location shape
docstr_tok: [":","return",":","dict","of","label","shape","and","label","location","shape"]
code: def shapes(self):
      """
      :return: dict of label shape and label location shape
      """
      for name in self.names:
          if self.n_samples_per_id == 1:
              self._shapes.update(
                  {
                      name: (1, self.dims_by_task[name], 1, 1, 1, 1),
                      name + "_location": (1, 7),
                  }
              )
          else:
              self._shapes.update(
                  {
                      name: (
                          self.n_samples_per_id,
                          self.dims_by_task[name],
                          1,
                          1,
                          1,
                          1,
                      ),
                      name + "_location": (self.n_samples_per_id, 7),
                  }
              )
      return self._shapes
  
imports: import random
  import numpy
  import pandas
  import tensorflow
  from tensorflow.python.data.util import nest
  from niftynet.layer.base_layer import Layer
  from niftynet.io.image_reader import param_to_dict
label_desc: Use image node_id 8 for calling the CSVReader obj's underlying member method code with example usage: obj.shapes() and returns: self