code: def test_no_channels(self, mock_board, _):
      mock_board.return_value = Mock()
      mock_board.return_value.add_embedding = Mock()
  
      state = {
          torchbearer.X: torch.ones(18, 10, 10),
          torchbearer.EPOCH: 0,
          torchbearer.MODEL: nn.Sequential(nn.Conv2d(3, 3, 3)),
          torchbearer.Y_TRUE: torch.ones(18),
          torchbearer.BATCH: 0,
      }
  
      tboard = TensorBoardProjector(
          num_images=18,
          avg_data_channels=False,
          write_data=True,
          write_features=False,
      )
  
      tboard.on_start(state)
      tboard.on_step_validation(state)
  
      mock_board.return_value.add_embedding.assert_called_once_with(
          ANY, metadata=ANY, label_img=ANY, tag="data", global_step=-1
      )
      self.assertTrue(
          mock_board.return_value.add_embedding.call_args[0][0].size()
          == torch.Size([18, 100])
      )
      self.assertTrue(
          mock_board.return_value.add_embedding.call_args[1][
              "metadata"
          ].size()
          == state[torchbearer.Y_TRUE].size()
      )
      self.assertTrue(
          mock_board.return_value.add_embedding.call_args[1][
              "label_img"
          ].size()
          == torch.Size([18, 1, 10, 10])
      )
      tboard.on_end({})
  
imports: import os
  from unittest import TestCase
  import warnings
  import torch
  import torch.nn
  from mock import patch, Mock, ANY, MagicMock
  import torchbearer
  from torchbearer.callbacks import TensorBoard, TensorBoardImages, TensorBoardProjector, TensorBoardText
label_desc: Use image node_id 8 for calling the TestTensorBoardProjector obj's underlying member method code with example usage: obj.test_no_channels(mock_board, _) without return types