def forward_actor(self, obs, cells=None):
        '''
            forward pass actor to generate policy with option to use z-filter
            Args:
                obs: dictionary of batched observations
                cells: tuple of hidden and cell state for LSTM stem. optional
            Returns:
                The output of actor network
        '''
        obs_list = []
        obs_flat = self._gather_low_dim_input(obs)
        if self.use_z_filter:
            obs_flat = self.z_filter.forward(obs_flat)
        obs_list.append(obs_flat)

        if self.if_pixel_input:
            # right now assumes only one camera angle.
            obs_pixel = obs['pixel']['camera0']
            obs_pixel = self._scale_image(obs_pixel)
            obs_pixel = self.cnn_stem(obs_pixel)
            obs_list.append(obs_pixel)

        obs = torch.cat([ob for ob in obs_list if ob is not None], dim=-1)
            
        if self.rnn_config.if_rnn_policy:
            obs, _ = self.rnn_stem(obs, cells)
            obs = obs.contiguous()

        action = self.actor(obs)
        return action

            forward pass actor to generate policy with option to use z-filter
            Args:
                obs: dictionary of batched observations
                cells: tuple of hidden and cell state for LSTM stem. optional
            Returns:
                The output of actor network
        
surreal/model/ppo_net.py