Repository: voxel51/fiftyone
Issue: [BUG] Torch datasets not loading

Torch datasets are not loading in `0.14.2` and `0.14.1` it seems. `0.14.0` seems to not have the issue.

```py
import fiftyone as fo

dataset = foz.load_zoo_dataset("cifar10", split="test")
```

Output:
```
Downloading split 'test' to '/home/ben/fiftyone/cifar10/test'
Files already downloaded and verified
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-a56cbfe97d58> in <module>
----> 1 dataset = foz.load_zoo_dataset("cifar10", split="test")

~/venvs/fnew/lib/python3.6/site-packages/fiftyone/zoo/datasets/__init__.py in load_zoo_dataset(name, split, splits, label_field, dataset_name, dataset_dir, download_if_necessary, drop_existing_dataset, overwrite, cleanup, **kwargs)
    201             overwrite=overwrite,
    202             cleanup=cleanup,
--> 203             **download_kwargs,
    204         )
    205         zoo_dataset = info.get_zoo_dataset()

~/venvs/fnew/lib/python3.6/site-packages/fiftyone/zoo/datasets/__init__.py in download_zoo_dataset(name, split, splits, dataset_dir, overwrite, cleanup, **kwargs)
    119         splits=splits,
    120         overwrite=overwrite,
--> 121         cleanup=cleanup,
    122     )
    123 

~/venvs/fnew/lib/python3.6/site-packages/fiftyone/zoo/datasets/__init__.py in download_and_prepare(self, dataset_dir, split, splits, overwrite, cleanup)
   1002                     num_samples,
   1003                     classes,
-> 1004                 ) = self._download_and_prepare(split_dir, scratch_dir, split)
   1005 
   1006                 # Add split to ZooDatasetInfo

~/venvs/fnew/lib/python3.6/site-packages/fiftyone/zoo/datasets/torch.py in _download_and_prepare(self, dataset_dir, scratch_dir, split)
    196             download_fcn,
    197             get_class_labels_fcn,
--> 198             sample_parser,
    199         )
    200 

~/venvs/fnew/lib/python3.6/site-packages/fiftyone/zoo/datasets/torch.py in _download_and_prepare(dataset_dir, scratch_dir, download_fcn, get_class_labels_fcn, sample_parser)
    534         )
    535     else:
--> 536         raise ValueError("Unsupported label class %s" % label_cls)
    537 
    538     # Write the formatted dataset to `dataset_dir`

TypeError: not all arguments converted during string formatting
```

`label_cls` is now a tuple in this case and the loging in `_download_and_prepare` no longer works.

Changed files:
fiftyone/zoo/datasets/tf.py, fiftyone/zoo/datasets/torch.py

diff --git a/fiftyone/zoo/datasets/tf.py b/fiftyone/zoo/datasets/tf.py
index 7a1475861..69cd007a0 100644
--- a/fiftyone/zoo/datasets/tf.py
+++ b/fiftyone/zoo/datasets/tf.py
@@ -605,18 +605,21 @@ def _download_and_prepare(
     sample_parser.classes = classes
     label_cls = sample_parser.label_cls
 
-    if label_cls is fol.Classification:
+    if not isinstance(label_cls, (list, tuple)):
+        label_cls = [label_cls]
+
+    if fol.Classification in label_cls:
         dataset_type = fot.FiftyOneImageClassificationDataset()
         dataset_exporter = foud.FiftyOneImageClassificationDatasetExporter(
             dataset_dir, classes=classes
         )
-    elif label_cls is fol.Detections:
+    elif fol.Detections in label_cls:
         dataset_type = fot.FiftyOneImageDetectionDataset()
         dataset_exporter = foud.FiftyOneImageDetectionDatasetExporter(
             dataset_dir, classes=classes
         )
     else:
-        raise ValueError("Unsupported label class %s" % label_cls)
+        raise ValueError("Unsupported sample parser %s" % type(sample_parser))
 
     try:
         samples = dataset.as_numpy_iterator()
diff --git a/fiftyone/zoo/datasets/torch.py b/fiftyone/zoo/datasets/torch.py
index 5ff23e50d..e49439dee 100644
--- a/fiftyone/zoo/datasets/torch.py
+++ b/fiftyone/zoo/datasets/torch.py
@@ -522,18 +522,21 @@ def _download_and_prepare(
     sample_parser.classes = classes
     label_cls = sample_parser.label_cls
 
-    if label_cls is fol.Classification:
+    if not isinstance(label_cls, (list, tuple)):
+        label_cls = [label_cls]
+
+    if fol.Classification in label_cls:
         dataset_type = fot.FiftyOneImageClassificationDataset()
         dataset_exporter = foud.FiftyOneImageClassificationDatasetExporter(
             dataset_dir, classes=classes
         )
-    elif label_cls is fol.Detections:
+    elif fol.Detections in label_cls:
         dataset_type = fot.FiftyOneImageDetectionDataset()
         dataset_exporter = foud.FiftyOneImageDetectionDatasetExporter(
             dataset_dir, classes=classes
         )
     else:
-        raise ValueError("Unsupported label class %s" % label_cls)
+        raise ValueError("Unsupported sample parser %s" % type(sample_parser))
 
     # Write the formatted dataset to `dataset_dir`
     foud.write_dataset(