Unverified Commit 43c58511 authored by Patrick von Platen's avatar Patrick von Platen Committed by GitHub
Browse files

[Docs] Outputs.mdx (#422)

* up

* remove bogus file
parent 46013e8e
...@@ -10,19 +10,46 @@ an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express o ...@@ -10,19 +10,46 @@ an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express o
specific language governing permissions and limitations under the License. specific language governing permissions and limitations under the License.
--> -->
# Models # BaseOutputs
Diffusers contains pretrained models for popular algorithms and modules for creating the next set of diffusion models. All models have outputs that are instances of subclasses of [`~utils.BaseOutput`]. Those are
The primary function of these models is to denoise an input sample, by modeling the distribution $p_\theta(\mathbf{x}_{t-1}|\mathbf{x}_t)$. data structures containing all the information returned by the model, but that can also be used as tuples or
The models are built on the base class ['ModelMixin'] that is a `torch.nn.module` with basic functionality for saving and loading models both locally and from the HuggingFace hub. dictionaries.
## API Let's see how this looks in an example:
Models should provide the `def forward` function and initialization of the model. ```python
All saving, loading, and utilities should be in the base ['ModelMixin'] class. from diffusers import DDIMPipeline
## Examples pipeline = DDIMPipeline.from_pretrained("google/ddpm-cifar10-32")
outputs = pipeline()
```
- The ['UNetModel'] was proposed in [TODO](https://arxiv.org/) and has been used in paper1, paper2, paper3. The `outputs` object is a [`~pipeline_utils.ImagePipelineOutput`], as we can see in the
- Extensions of the ['UNetModel'] include the ['UNetGlideModel'] that uses attention and timestep embeddings for the [GLIDE](https://arxiv.org/abs/2112.10741) paper, the ['UNetGradTTS'] model from this [paper](https://arxiv.org/abs/2105.06337) for text-to-speech, ['UNetLDMModel'] for latent-diffusion models in this [paper](https://arxiv.org/abs/2112.10752), and the ['TemporalUNet'] used for time-series prediciton in this reinforcement learning [paper](https://arxiv.org/abs/2205.09991). documentation of that class below, it means it has an image attribute.
- TODO: mention VAE / SDE score estimation
\ No newline at end of file You can access each attribute as you would usually do, and if that attribute has not been returned by the model, you will get `None`:
```python
outputs.images
```
or via keyword lookup
```python
outputs["images"]
```
When considering our `outputs` object as tuple, it only considers the attributes that don't have `None` values.
Here for instance, we could retrieve images via indexing:
```python
outputs[:1]
```
which will return the tuple `(outputs.images)` for instance.
## BaseOutput
[[autodoc]] utils.BaseOutput
- to_tuple
...@@ -59,40 +59,10 @@ class BaseOutput(OrderedDict): ...@@ -59,40 +59,10 @@ class BaseOutput(OrderedDict):
if not len(class_fields): if not len(class_fields):
raise ValueError(f"{self.__class__.__name__} has no fields.") raise ValueError(f"{self.__class__.__name__} has no fields.")
first_field = getattr(self, class_fields[0].name) for field in class_fields:
other_fields_are_none = all(getattr(self, field.name) is None for field in class_fields[1:]) v = getattr(self, field.name)
if v is not None:
if other_fields_are_none and not is_tensor(first_field): self[field.name] = v
if isinstance(first_field, dict):
iterator = first_field.items()
first_field_iterator = True
else:
try:
iterator = iter(first_field)
first_field_iterator = True
except TypeError:
first_field_iterator = False
# if we provided an iterator as first field and the iterator is a (key, value) iterator
# set the associated fields
if first_field_iterator:
for element in iterator:
if (
not isinstance(element, (list, tuple))
or not len(element) == 2
or not isinstance(element[0], str)
):
break
setattr(self, element[0], element[1])
if element[1] is not None:
self[element[0]] = element[1]
elif first_field is not None:
self[class_fields[0].name] = first_field
else:
for field in class_fields:
v = getattr(self, field.name)
if v is not None:
self[field.name] = v
def __delitem__(self, *args, **kwargs): def __delitem__(self, *args, **kwargs):
raise Exception(f"You cannot use ``__delitem__`` on a {self.__class__.__name__} instance.") raise Exception(f"You cannot use ``__delitem__`` on a {self.__class__.__name__} instance.")
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment