code: def test_epoch_metrics_with_str_str_tuple(self):
      dataset_size = (
          MetricsModelIntegrationTest.batch_size
          * MetricsModelIntegrationTest.steps_per_epoch
      )
      torch.manual_seed(42)
      train_x = torch.rand(dataset_size, 1)
      train_y = torch.randint(10, (dataset_size,))
      valid_x = torch.rand(dataset_size, 1)
      valid_y = torch.randint(10, (dataset_size,))
  
      model = Model(
          nn.Linear(1, 10),
          "sgd",
          "cross_entropy",
          epoch_metrics=["f1", ("f1_2", "f1")],
      )
      names = ["fscore_macro", "f1_2"]
      history = model.fit(
          train_x,
          train_y,
          validation_data=(valid_x, valid_y),
          batch_size=MetricsModelIntegrationTest.batch_size,
          epochs=MetricsModelIntegrationTest.epochs,
      )
      for logs in history:
          for name in names:
              self.assertIn(name, logs)
              self.assertEqual(ANY, logs[name])
              self.assertIn("val_" + name, logs)
              self.assertEqual(ANY, logs["val_" + name])
  
imports: import os
  import unittest
  from unittest import skipIf
  from unittest.mock import ANY
  import numpy
  import torch
  import torch.nn
  import torchmetrics
  from poutyne import Metric, Model, do_register_metric_class, rename_doubles, unregister_metric_class
label_desc: Use image node_id 27 for calling the MetricsModelIntegrationTest obj's underlying member method code with example usage: obj.test_epoch_metrics_with_str_str_tuple() without return types