| |
| |
| |
| |
|
|
| import torch |
| from torch import nn |
| from open_flamingo import Flamingo |
| from einops import rearrange |
|
|
|
|
| class TimeSeriesFlamingoWithTrainableEncoder(Flamingo): |
| def __init__( |
| self, |
| vision_encoder: nn.Module, |
| lang_encoder: nn.Module, |
| eoc_token_id: int, |
| media_token_id: int, |
| vis_dim: int, |
| cross_attn_every_n_layers: int = 1, |
| gradient_checkpointing: bool = False, |
| ): |
| super().__init__(vision_encoder, lang_encoder, eoc_token_id, media_token_id, vis_dim, cross_attn_every_n_layers, gradient_checkpointing) |
|
|
| |
| |
| |
| def _encode_vision_x(self, vision_x): |
| |
| if vision_x.ndim == 4: |
| b, T, F, features = vision_x.shape |
| |
| |
| vision_x = rearrange(vision_x, "b T F c -> (b T F) c") |
| |
| |
| |
| vision_x = self.vision_encoder(vision_x) |
| |
| |
| |
| vision_x = rearrange(vision_x, "(b T F) p d -> b T F p d", b=b, T=T, F=F) |
| |
| |
| vision_x = self.perceiver(vision_x) |
| |
| else: |
| |
| assert vision_x.ndim == 6, "vision_x should be of shape (b, T_img, F, C, H, W)" |
| b, T, F = vision_x.shape[:3] |
| assert F == 1, "Only single frame supported" |
|
|
| vision_x = rearrange(vision_x, "b T F c h w -> (b T F) c h w") |
| |
| vision_x = self.vision_encoder(vision_x)[1] |
| vision_x = rearrange(vision_x, "(b T F) v d -> b T F v d", b=b, T=T, F=F) |
| vision_x = self.perceiver(vision_x) |
|
|
| for layer in self.lang_encoder._get_decoder_layers(): |
| layer.condition_vis_x(vision_x) |
|
|