code: def init_from_class_batches(self, class_batches, num_shards=None):
      
      shards_for_submissions = {}
      shard_idx = 0
      for idx, (batch_id, batch_val) in enumerate(iteritems(class_batches)):
        work_id = DEFENSE_WORK_ID_PATTERN.format(idx)
        submission_id = batch_val['submission_id']
        shard_id = None
        if num_shards:
          shard_id = shards_for_submissions.get(submission_id)
          if shard_id is None:
            shard_id = shard_idx % num_shards
            shards_for_submissions[submission_id] = shard_id
            shard_idx += 1
        # Note: defense also might have following fields populated by worker:
        # stat_correct, stat_error, stat_target_class, stat_num_images
        self.work[work_id] = {
            'claimed_worker_id': None,
            'claimed_worker_start_time': None,
            'is_completed': False,
            'error': None,
            'elapsed_time': None,
            'submission_id': submission_id,
            'shard_id': shard_id,
            'output_classification_batch_id': batch_id,
        }
docs: Initializes work pieces from classification batches.
  
      Args:
        class_batches: dict with classification batches, could be obtained
          as ClassificationBatches.data
        num_shards: number of shards to split data into,
          if None then no sharding is done.