summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2023-05-10 05:20:59 +0000
committerCoprDistGit <infra@openeuler.org>2023-05-10 05:20:59 +0000
commit86c7e365ec70fbe2bfefaed2cc58a2df714974a1 (patch)
treef13d904a11e5b29f2ed4d3f4e674246d61e3c252
parent28e0223ecbf1acffea24b9e53325005ebd62e38e (diff)
automatic import of python-easytorchopeneuler20.03
-rw-r--r--.gitignore1
-rw-r--r--python-easytorch.spec723
-rw-r--r--sources1
3 files changed, 725 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index e69de29..3abf0e3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -0,0 +1 @@
+/easytorch-3.7.6.tar.gz
diff --git a/python-easytorch.spec b/python-easytorch.spec
new file mode 100644
index 0000000..92956c4
--- /dev/null
+++ b/python-easytorch.spec
@@ -0,0 +1,723 @@
+%global _empty_manifest_terminate_build 0
+Name: python-easytorch
+Version: 3.7.6
+Release: 1
+Summary: Easy Neural Network Experiments with pytorch
+License: MIT
+URL: https://github.com/sraashis/easytorch
+Source0: https://mirrors.nju.edu.cn/pypi/web/packages/89/21/59c36fb7e47db93bfd3966aa40c887a013e6f052a57f180006108a41ff9b/easytorch-3.7.6.tar.gz
+BuildArch: noarch
+
+
+%description
+## A very lightweight framework on top of PyTorch with full functionality.
+
+#### **Just one way of doing things means no learning curve.** ✅
+
+![Logo](assets/easytorchlogo.png)
+
+![PyPi version](https://img.shields.io/pypi/v/easytorch)
+[![YourActionName Actions Status](https://github.com/sraashis/easytorch/workflows/build/badge.svg)](https://github.com/sraashis/easytorch/actions)
+![Python versions](https://img.shields.io/pypi/pyversions/pybadges.svg)
+
+<hr />
+
+#### Installation
+
+1. `pip install --upgrade pip`
+2. `Install latest pytorch and torchvision from` [Pytorch](https://pytorch.org/)
+3. `pip install easytorch`
+
+* [MNIST](./examples/MNIST_easytorch_CNN.ipynb) [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github//sraashis/easytorch/blob/master/examples/MNIST_easytorch_CNN.ipynb)
+* [Retinal fundus image transfer learning tasks.](https://github.com/sraashis/retinal-fundus-transfer)
+* [Covid-19 chest x-ray classification.](https://github.com/sraashis/covidxfactory)
+* [DCGAN.](https://github.com/sraashis/gan-easytorch-celeb-faces)
+
+#### Let's start with something simple like MNIST digit classification:
+
+```python
+from easytorch import EasyTorch, ETRunner, ConfusionMatrix, ETMeter
+from torchvision import datasets, transforms
+import torch.nn.functional as F
+import torch
+from examples.models import MNISTNet
+
+transform = transforms.Compose([
+ transforms.ToTensor(),
+ transforms.Normalize((0.1307,), (0.3081,))
+])
+
+
+class MNISTTrainer(ETRunner):
+ def _init_nn_model(self):
+ self.nn['model'] = MNISTNet()
+
+ def iteration(self, batch):
+ inputs, labels = batch[0].to(self.device['gpu']).float(), batch[1].to(self.device['gpu']).long()
+
+ out = self.nn['model'](inputs)
+ loss = F.nll_loss(out, labels)
+ _, pred = torch.max(out, 1)
+
+ meter = self.new_meter()
+ meter.averages.add(loss.item(), len(inputs))
+ meter.metrics['cfm'].add(pred, labels.float())
+
+ return {'loss': loss, 'meter': meter, 'predictions': pred}
+
+ def init_experiment_cache(self):
+ self.cache['log_header'] = 'Loss|Accuracy,F1,Precision,Recall'
+ self.cache.update(monitor_metric='f1', metric_direction='maximize')
+
+ def new_meter(self):
+ return ETMeter(
+ cfm=ConfusionMatrix(num_classes=10)
+ )
+
+
+if __name__ == "__main__":
+ train_dataset = datasets.MNIST('../data', train=True, download=True, transform=transform)
+ val_dataset = datasets.MNIST('../data', train=False, transform=transform)
+
+ dataloader_args = {'train': {'dataset': train_dataset}, 'validation': {'dataset': val_dataset}}
+ runner = EasyTorch(phase='train', batch_size=512,
+ epochs=10, gpus=[0], dataloader_args=dataloader_args)
+ runner.run(MNISTTrainer)
+```
+
+### Run as:
+
+`python script.py -ph train -b 512 -e 10 -gpus 0`
+
+### ... with **20+** useful options. Check [here](./easytorch/config/) for full list.
+
+<hr />
+
+## General use case:
+
+#### 1. Define your trainer
+
+```python
+from easytorch import ETRunner, Prf1a, ETMeter, AUCROCMetrics
+
+
+class MyTrainer(ETRunner):
+
+ def _init_nn_model(self):
+ self.nn['model'] = NeuralNetModel(out_size=self.conf['num_class'])
+
+ def iteration(self, batch):
+ """Handle a single batch"""
+ """Must have loss and meter"""
+ meter = self.new_meter()
+ ...
+ return {'loss': ..., 'meter': ..., 'predictions': ...}
+
+ def new_meter(self):
+ return ETMeter(
+ num_averages=1,
+ prf1a=Prf1a(),
+ auc=AUCROCMetrics()
+ )
+
+ def init_cache(self):
+ """Will plot Loss in one plot, and Accuracy,F1_score in another."""
+ self.cache['log_header'] = 'Loss|Accuracy,F1_score'
+
+ """Model selection using validation set if present"""
+ self.cache.update(monitor_metric='f1', metric_direction='maximize')
+
+````
+
+* Method new_meter() returns ETMeter that takes any implementation of easytorch.meter.ETMetrics. Provided ones:
+ * easytorch.metrics.Prf1a() for binary classification that computes accuracy,f1,precision,recall, overlap/IOU.
+ * easytorch.metrics.ConfusionMatrix(num_classes=...) for multiclass classification that also computes global
+ accuracy,f1,precision,recall.
+ * easytorch.metrics.AUCROCMetrics for binary ROC-AUC score.
+
+#### 2. Define specification for your datasets:
+
+* EasyTorch automatically splits the training data in _**data_source**_ as specified by
+ _**split_ratio(-spl or --split-ratio 0.7, 0.15, 0.15, for train validation and test portion)**_ OR Custom splits in
+ 1. Text files:
+ * data_source = "/some/path/*.txt", where it looks for 'train.txt', 'validation.txt', and 'test.txt' if phase is
+ _train_, and only 'test.txt' if phase is _test_
+ 2. Json files:
+ * data_source = "some/path/split.json", where each split key has list of files as {'train': [], '
+ validation' :[], 'test':[]}
+ 3. Just glob as data_source = "some/path/**/*.txt", must also provide split_ratio if phase = _train_
+
+```python
+from easytorch import ETDataset
+
+
+class MyDataset(ETDataset):
+ def load_index(self, file):
+ """(Optional) Load/Process something and add to diskcache as:
+ self.diskcahe.add(file, value)"""
+ """This method runs in multiple processes by default"""
+
+ self.indices.append([file, 'something_extra'])
+
+ def __getitem__(self, index):
+ file = self.indices[index]
+ """(Optional) Retrieve from diskcache as self.diskcache.get(file)"""
+
+ image = # Todo # Load file/Image.
+ label = # Todo # Load corresponding label.
+
+ # Extra preprocessing, if needed.
+ # Apply transforms, if needed.
+
+ return image, label
+```
+
+#### 3. Entry point (say main.py)
+### Run as:
+
+`python main.py -ph train -b 512 -e 10 -gpus 0`
+
+One can also directly pass arguments as below which overrides all.
+```python
+from easytorch import EasyTorch
+
+runner = EasyTorch(phase="train", batch_size=4, epochs=10,
+ gpus=[0], num_channel=1,
+ num_class=2, data_source="<some_data>/data_split.json")
+runner.run(MyTrainer, MyDataset)
+```
+
+### All the best! Cheers! 🎉
+
+#### Cite the following papers if you use this library:
+
+```
+@article{deepdyn_10.3389/fcomp.2020.00035,
+ title = {Dynamic Deep Networks for Retinal Vessel Segmentation},
+ author = {Khanal, Aashis and Estrada, Rolando},
+ year = 2020,
+ journal = {Frontiers in Computer Science},
+ volume = 2,
+ pages = 35,
+ doi = {10.3389/fcomp.2020.00035},
+ issn = {2624-9898}
+}
+
+@misc{2202.02382,
+ Author = {Aashis Khanal and Saeid Motevali and Rolando Estrada},
+ Title = {Fully Automated Tree Topology Estimation and Artery-Vein Classification},
+ Year = {2022},
+ Eprint = {arXiv:2202.02382},
+}
+```
+
+### Feature Higlights:
+
+* DataHandle that is always available, and decoupled from other modules enabling easy
+ customization ([ETDataHandle](easytorch/data/data.py)).
+ * Use custom & complex data handling mechanism.
+* Simple lightweight logger/plotter.
+ * **Plot:** set log_header = 'Loss,F1,Accuracy' to plot in same plot or set log_header = 'Loss|F1,Accuracy' to plot
+ Loss in one plot, and F1,Accuracy in another plot.
+ * **Logs:** all arguments/generated data will be saved in logs.json file after the experiment finishes.
+* Gradient accumulation, automatic logging/plotting, model checkpointing, save everything.
+* Multiple metrics implementation at easytorch.metrics: Precision, Recall, Accuracy, Overlap, F1, ROC-AUC, Confusion
+ matrix
+* **For advanced training with multiple networks, and complex training steps,
+ click [here](assets/AdvancedTraining.md):**
+* **Implement custom metrics as [here](assets/CustomMetrics.md).**
+
+
+
+%package -n python3-easytorch
+Summary: Easy Neural Network Experiments with pytorch
+Provides: python-easytorch
+BuildRequires: python3-devel
+BuildRequires: python3-setuptools
+BuildRequires: python3-pip
+%description -n python3-easytorch
+## A very lightweight framework on top of PyTorch with full functionality.
+
+#### **Just one way of doing things means no learning curve.** ✅
+
+![Logo](assets/easytorchlogo.png)
+
+![PyPi version](https://img.shields.io/pypi/v/easytorch)
+[![YourActionName Actions Status](https://github.com/sraashis/easytorch/workflows/build/badge.svg)](https://github.com/sraashis/easytorch/actions)
+![Python versions](https://img.shields.io/pypi/pyversions/pybadges.svg)
+
+<hr />
+
+#### Installation
+
+1. `pip install --upgrade pip`
+2. `Install latest pytorch and torchvision from` [Pytorch](https://pytorch.org/)
+3. `pip install easytorch`
+
+* [MNIST](./examples/MNIST_easytorch_CNN.ipynb) [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github//sraashis/easytorch/blob/master/examples/MNIST_easytorch_CNN.ipynb)
+* [Retinal fundus image transfer learning tasks.](https://github.com/sraashis/retinal-fundus-transfer)
+* [Covid-19 chest x-ray classification.](https://github.com/sraashis/covidxfactory)
+* [DCGAN.](https://github.com/sraashis/gan-easytorch-celeb-faces)
+
+#### Let's start with something simple like MNIST digit classification:
+
+```python
+from easytorch import EasyTorch, ETRunner, ConfusionMatrix, ETMeter
+from torchvision import datasets, transforms
+import torch.nn.functional as F
+import torch
+from examples.models import MNISTNet
+
+transform = transforms.Compose([
+ transforms.ToTensor(),
+ transforms.Normalize((0.1307,), (0.3081,))
+])
+
+
+class MNISTTrainer(ETRunner):
+ def _init_nn_model(self):
+ self.nn['model'] = MNISTNet()
+
+ def iteration(self, batch):
+ inputs, labels = batch[0].to(self.device['gpu']).float(), batch[1].to(self.device['gpu']).long()
+
+ out = self.nn['model'](inputs)
+ loss = F.nll_loss(out, labels)
+ _, pred = torch.max(out, 1)
+
+ meter = self.new_meter()
+ meter.averages.add(loss.item(), len(inputs))
+ meter.metrics['cfm'].add(pred, labels.float())
+
+ return {'loss': loss, 'meter': meter, 'predictions': pred}
+
+ def init_experiment_cache(self):
+ self.cache['log_header'] = 'Loss|Accuracy,F1,Precision,Recall'
+ self.cache.update(monitor_metric='f1', metric_direction='maximize')
+
+ def new_meter(self):
+ return ETMeter(
+ cfm=ConfusionMatrix(num_classes=10)
+ )
+
+
+if __name__ == "__main__":
+ train_dataset = datasets.MNIST('../data', train=True, download=True, transform=transform)
+ val_dataset = datasets.MNIST('../data', train=False, transform=transform)
+
+ dataloader_args = {'train': {'dataset': train_dataset}, 'validation': {'dataset': val_dataset}}
+ runner = EasyTorch(phase='train', batch_size=512,
+ epochs=10, gpus=[0], dataloader_args=dataloader_args)
+ runner.run(MNISTTrainer)
+```
+
+### Run as:
+
+`python script.py -ph train -b 512 -e 10 -gpus 0`
+
+### ... with **20+** useful options. Check [here](./easytorch/config/) for full list.
+
+<hr />
+
+## General use case:
+
+#### 1. Define your trainer
+
+```python
+from easytorch import ETRunner, Prf1a, ETMeter, AUCROCMetrics
+
+
+class MyTrainer(ETRunner):
+
+ def _init_nn_model(self):
+ self.nn['model'] = NeuralNetModel(out_size=self.conf['num_class'])
+
+ def iteration(self, batch):
+ """Handle a single batch"""
+ """Must have loss and meter"""
+ meter = self.new_meter()
+ ...
+ return {'loss': ..., 'meter': ..., 'predictions': ...}
+
+ def new_meter(self):
+ return ETMeter(
+ num_averages=1,
+ prf1a=Prf1a(),
+ auc=AUCROCMetrics()
+ )
+
+ def init_cache(self):
+ """Will plot Loss in one plot, and Accuracy,F1_score in another."""
+ self.cache['log_header'] = 'Loss|Accuracy,F1_score'
+
+ """Model selection using validation set if present"""
+ self.cache.update(monitor_metric='f1', metric_direction='maximize')
+
+````
+
+* Method new_meter() returns ETMeter that takes any implementation of easytorch.meter.ETMetrics. Provided ones:
+ * easytorch.metrics.Prf1a() for binary classification that computes accuracy,f1,precision,recall, overlap/IOU.
+ * easytorch.metrics.ConfusionMatrix(num_classes=...) for multiclass classification that also computes global
+ accuracy,f1,precision,recall.
+ * easytorch.metrics.AUCROCMetrics for binary ROC-AUC score.
+
+#### 2. Define specification for your datasets:
+
+* EasyTorch automatically splits the training data in _**data_source**_ as specified by
+ _**split_ratio(-spl or --split-ratio 0.7, 0.15, 0.15, for train validation and test portion)**_ OR Custom splits in
+ 1. Text files:
+ * data_source = "/some/path/*.txt", where it looks for 'train.txt', 'validation.txt', and 'test.txt' if phase is
+ _train_, and only 'test.txt' if phase is _test_
+ 2. Json files:
+ * data_source = "some/path/split.json", where each split key has list of files as {'train': [], '
+ validation' :[], 'test':[]}
+ 3. Just glob as data_source = "some/path/**/*.txt", must also provide split_ratio if phase = _train_
+
+```python
+from easytorch import ETDataset
+
+
+class MyDataset(ETDataset):
+ def load_index(self, file):
+ """(Optional) Load/Process something and add to diskcache as:
+ self.diskcahe.add(file, value)"""
+ """This method runs in multiple processes by default"""
+
+ self.indices.append([file, 'something_extra'])
+
+ def __getitem__(self, index):
+ file = self.indices[index]
+ """(Optional) Retrieve from diskcache as self.diskcache.get(file)"""
+
+ image = # Todo # Load file/Image.
+ label = # Todo # Load corresponding label.
+
+ # Extra preprocessing, if needed.
+ # Apply transforms, if needed.
+
+ return image, label
+```
+
+#### 3. Entry point (say main.py)
+### Run as:
+
+`python main.py -ph train -b 512 -e 10 -gpus 0`
+
+One can also directly pass arguments as below which overrides all.
+```python
+from easytorch import EasyTorch
+
+runner = EasyTorch(phase="train", batch_size=4, epochs=10,
+ gpus=[0], num_channel=1,
+ num_class=2, data_source="<some_data>/data_split.json")
+runner.run(MyTrainer, MyDataset)
+```
+
+### All the best! Cheers! 🎉
+
+#### Cite the following papers if you use this library:
+
+```
+@article{deepdyn_10.3389/fcomp.2020.00035,
+ title = {Dynamic Deep Networks for Retinal Vessel Segmentation},
+ author = {Khanal, Aashis and Estrada, Rolando},
+ year = 2020,
+ journal = {Frontiers in Computer Science},
+ volume = 2,
+ pages = 35,
+ doi = {10.3389/fcomp.2020.00035},
+ issn = {2624-9898}
+}
+
+@misc{2202.02382,
+ Author = {Aashis Khanal and Saeid Motevali and Rolando Estrada},
+ Title = {Fully Automated Tree Topology Estimation and Artery-Vein Classification},
+ Year = {2022},
+ Eprint = {arXiv:2202.02382},
+}
+```
+
+### Feature Higlights:
+
+* DataHandle that is always available, and decoupled from other modules enabling easy
+ customization ([ETDataHandle](easytorch/data/data.py)).
+ * Use custom & complex data handling mechanism.
+* Simple lightweight logger/plotter.
+ * **Plot:** set log_header = 'Loss,F1,Accuracy' to plot in same plot or set log_header = 'Loss|F1,Accuracy' to plot
+ Loss in one plot, and F1,Accuracy in another plot.
+ * **Logs:** all arguments/generated data will be saved in logs.json file after the experiment finishes.
+* Gradient accumulation, automatic logging/plotting, model checkpointing, save everything.
+* Multiple metrics implementation at easytorch.metrics: Precision, Recall, Accuracy, Overlap, F1, ROC-AUC, Confusion
+ matrix
+* **For advanced training with multiple networks, and complex training steps,
+ click [here](assets/AdvancedTraining.md):**
+* **Implement custom metrics as [here](assets/CustomMetrics.md).**
+
+
+
+%package help
+Summary: Development documents and examples for easytorch
+Provides: python3-easytorch-doc
+%description help
+## A very lightweight framework on top of PyTorch with full functionality.
+
+#### **Just one way of doing things means no learning curve.** ✅
+
+![Logo](assets/easytorchlogo.png)
+
+![PyPi version](https://img.shields.io/pypi/v/easytorch)
+[![YourActionName Actions Status](https://github.com/sraashis/easytorch/workflows/build/badge.svg)](https://github.com/sraashis/easytorch/actions)
+![Python versions](https://img.shields.io/pypi/pyversions/pybadges.svg)
+
+<hr />
+
+#### Installation
+
+1. `pip install --upgrade pip`
+2. `Install latest pytorch and torchvision from` [Pytorch](https://pytorch.org/)
+3. `pip install easytorch`
+
+* [MNIST](./examples/MNIST_easytorch_CNN.ipynb) [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github//sraashis/easytorch/blob/master/examples/MNIST_easytorch_CNN.ipynb)
+* [Retinal fundus image transfer learning tasks.](https://github.com/sraashis/retinal-fundus-transfer)
+* [Covid-19 chest x-ray classification.](https://github.com/sraashis/covidxfactory)
+* [DCGAN.](https://github.com/sraashis/gan-easytorch-celeb-faces)
+
+#### Let's start with something simple like MNIST digit classification:
+
+```python
+from easytorch import EasyTorch, ETRunner, ConfusionMatrix, ETMeter
+from torchvision import datasets, transforms
+import torch.nn.functional as F
+import torch
+from examples.models import MNISTNet
+
+transform = transforms.Compose([
+ transforms.ToTensor(),
+ transforms.Normalize((0.1307,), (0.3081,))
+])
+
+
+class MNISTTrainer(ETRunner):
+ def _init_nn_model(self):
+ self.nn['model'] = MNISTNet()
+
+ def iteration(self, batch):
+ inputs, labels = batch[0].to(self.device['gpu']).float(), batch[1].to(self.device['gpu']).long()
+
+ out = self.nn['model'](inputs)
+ loss = F.nll_loss(out, labels)
+ _, pred = torch.max(out, 1)
+
+ meter = self.new_meter()
+ meter.averages.add(loss.item(), len(inputs))
+ meter.metrics['cfm'].add(pred, labels.float())
+
+ return {'loss': loss, 'meter': meter, 'predictions': pred}
+
+ def init_experiment_cache(self):
+ self.cache['log_header'] = 'Loss|Accuracy,F1,Precision,Recall'
+ self.cache.update(monitor_metric='f1', metric_direction='maximize')
+
+ def new_meter(self):
+ return ETMeter(
+ cfm=ConfusionMatrix(num_classes=10)
+ )
+
+
+if __name__ == "__main__":
+ train_dataset = datasets.MNIST('../data', train=True, download=True, transform=transform)
+ val_dataset = datasets.MNIST('../data', train=False, transform=transform)
+
+ dataloader_args = {'train': {'dataset': train_dataset}, 'validation': {'dataset': val_dataset}}
+ runner = EasyTorch(phase='train', batch_size=512,
+ epochs=10, gpus=[0], dataloader_args=dataloader_args)
+ runner.run(MNISTTrainer)
+```
+
+### Run as:
+
+`python script.py -ph train -b 512 -e 10 -gpus 0`
+
+### ... with **20+** useful options. Check [here](./easytorch/config/) for full list.
+
+<hr />
+
+## General use case:
+
+#### 1. Define your trainer
+
+```python
+from easytorch import ETRunner, Prf1a, ETMeter, AUCROCMetrics
+
+
+class MyTrainer(ETRunner):
+
+ def _init_nn_model(self):
+ self.nn['model'] = NeuralNetModel(out_size=self.conf['num_class'])
+
+ def iteration(self, batch):
+ """Handle a single batch"""
+ """Must have loss and meter"""
+ meter = self.new_meter()
+ ...
+ return {'loss': ..., 'meter': ..., 'predictions': ...}
+
+ def new_meter(self):
+ return ETMeter(
+ num_averages=1,
+ prf1a=Prf1a(),
+ auc=AUCROCMetrics()
+ )
+
+ def init_cache(self):
+ """Will plot Loss in one plot, and Accuracy,F1_score in another."""
+ self.cache['log_header'] = 'Loss|Accuracy,F1_score'
+
+ """Model selection using validation set if present"""
+ self.cache.update(monitor_metric='f1', metric_direction='maximize')
+
+````
+
+* Method new_meter() returns ETMeter that takes any implementation of easytorch.meter.ETMetrics. Provided ones:
+ * easytorch.metrics.Prf1a() for binary classification that computes accuracy,f1,precision,recall, overlap/IOU.
+ * easytorch.metrics.ConfusionMatrix(num_classes=...) for multiclass classification that also computes global
+ accuracy,f1,precision,recall.
+ * easytorch.metrics.AUCROCMetrics for binary ROC-AUC score.
+
+#### 2. Define specification for your datasets:
+
+* EasyTorch automatically splits the training data in _**data_source**_ as specified by
+ _**split_ratio(-spl or --split-ratio 0.7, 0.15, 0.15, for train validation and test portion)**_ OR Custom splits in
+ 1. Text files:
+ * data_source = "/some/path/*.txt", where it looks for 'train.txt', 'validation.txt', and 'test.txt' if phase is
+ _train_, and only 'test.txt' if phase is _test_
+ 2. Json files:
+ * data_source = "some/path/split.json", where each split key has list of files as {'train': [], '
+ validation' :[], 'test':[]}
+ 3. Just glob as data_source = "some/path/**/*.txt", must also provide split_ratio if phase = _train_
+
+```python
+from easytorch import ETDataset
+
+
+class MyDataset(ETDataset):
+ def load_index(self, file):
+ """(Optional) Load/Process something and add to diskcache as:
+ self.diskcahe.add(file, value)"""
+ """This method runs in multiple processes by default"""
+
+ self.indices.append([file, 'something_extra'])
+
+ def __getitem__(self, index):
+ file = self.indices[index]
+ """(Optional) Retrieve from diskcache as self.diskcache.get(file)"""
+
+ image = # Todo # Load file/Image.
+ label = # Todo # Load corresponding label.
+
+ # Extra preprocessing, if needed.
+ # Apply transforms, if needed.
+
+ return image, label
+```
+
+#### 3. Entry point (say main.py)
+### Run as:
+
+`python main.py -ph train -b 512 -e 10 -gpus 0`
+
+One can also directly pass arguments as below which overrides all.
+```python
+from easytorch import EasyTorch
+
+runner = EasyTorch(phase="train", batch_size=4, epochs=10,
+ gpus=[0], num_channel=1,
+ num_class=2, data_source="<some_data>/data_split.json")
+runner.run(MyTrainer, MyDataset)
+```
+
+### All the best! Cheers! 🎉
+
+#### Cite the following papers if you use this library:
+
+```
+@article{deepdyn_10.3389/fcomp.2020.00035,
+ title = {Dynamic Deep Networks for Retinal Vessel Segmentation},
+ author = {Khanal, Aashis and Estrada, Rolando},
+ year = 2020,
+ journal = {Frontiers in Computer Science},
+ volume = 2,
+ pages = 35,
+ doi = {10.3389/fcomp.2020.00035},
+ issn = {2624-9898}
+}
+
+@misc{2202.02382,
+ Author = {Aashis Khanal and Saeid Motevali and Rolando Estrada},
+ Title = {Fully Automated Tree Topology Estimation and Artery-Vein Classification},
+ Year = {2022},
+ Eprint = {arXiv:2202.02382},
+}
+```
+
+### Feature Higlights:
+
+* DataHandle that is always available, and decoupled from other modules enabling easy
+ customization ([ETDataHandle](easytorch/data/data.py)).
+ * Use custom & complex data handling mechanism.
+* Simple lightweight logger/plotter.
+ * **Plot:** set log_header = 'Loss,F1,Accuracy' to plot in same plot or set log_header = 'Loss|F1,Accuracy' to plot
+ Loss in one plot, and F1,Accuracy in another plot.
+ * **Logs:** all arguments/generated data will be saved in logs.json file after the experiment finishes.
+* Gradient accumulation, automatic logging/plotting, model checkpointing, save everything.
+* Multiple metrics implementation at easytorch.metrics: Precision, Recall, Accuracy, Overlap, F1, ROC-AUC, Confusion
+ matrix
+* **For advanced training with multiple networks, and complex training steps,
+ click [here](assets/AdvancedTraining.md):**
+* **Implement custom metrics as [here](assets/CustomMetrics.md).**
+
+
+
+%prep
+%autosetup -n easytorch-3.7.6
+
+%build
+%py3_build
+
+%install
+%py3_install
+install -d -m755 %{buildroot}/%{_pkgdocdir}
+if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi
+if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi
+if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi
+if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi
+pushd %{buildroot}
+if [ -d usr/lib ]; then
+ find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/lib64 ]; then
+ find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/bin ]; then
+ find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/sbin ]; then
+ find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+touch doclist.lst
+if [ -d usr/share/man ]; then
+ find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst
+fi
+popd
+mv %{buildroot}/filelist.lst .
+mv %{buildroot}/doclist.lst .
+
+%files -n python3-easytorch -f filelist.lst
+%dir %{python3_sitelib}/*
+
+%files help -f doclist.lst
+%{_docdir}/*
+
+%changelog
+* Wed May 10 2023 Python_Bot <Python_Bot@openeuler.org> - 3.7.6-1
+- Package Spec generated
diff --git a/sources b/sources
new file mode 100644
index 0000000..30aa765
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+1e796023ea5af780bb99e9b5d6250caa easytorch-3.7.6.tar.gz