예제 #1
0
    def test_fitting_generator_calls_with_longer_validation_set(self):
        train_real_steps_per_epoch = 30
        train_batch_size = ModelTest.batch_size
        train_final_batch_missing_samples = 7
        train_size = train_real_steps_per_epoch * train_batch_size - \
                     train_final_batch_missing_samples
        train_x = torch.rand(train_size, 1)
        train_y = torch.rand(train_size, 1)
        train_dataset = TensorDataset(train_x, train_y)
        train_generator = DataLoader(train_dataset, train_batch_size)

        valid_real_steps_per_epoch = 40
        valid_batch_size = 15
        valid_final_batch_missing_samples = 3
        valid_size = valid_real_steps_per_epoch * valid_batch_size - \
                     valid_final_batch_missing_samples
        valid_x = torch.rand(valid_size, 1)
        valid_y = torch.rand(valid_size, 1)
        valid_dataset = TensorDataset(valid_x, valid_y)
        valid_generator = DataLoader(valid_dataset, valid_batch_size)

        mock_train_generator = IterableMock(train_generator)
        mock_valid_generator = IterableMock(valid_generator)
        self.model.fit_generator(mock_train_generator, mock_valid_generator, epochs=ModelTest.epochs)
        expected_train_calls = ['__len__'] + \
            (['__iter__'] + ['__next__'] * train_real_steps_per_epoch) * ModelTest.epochs
        expected_valid_calls = ['__len__'] + \
            (['__iter__'] + ['__next__'] * valid_real_steps_per_epoch) * ModelTest.epochs
        self.assertEqual(mock_train_generator.calls, expected_train_calls)
        self.assertEqual(mock_valid_generator.calls, expected_valid_calls)
예제 #2
0
    def test_list_of_tensors(self):
        range20 = np.expand_dims(np.arange(20), 1)
        dataset = TensorDataset((range20, range20 * 2), range20 * 3)
        self.assertEqual(len(dataset), 20)
        self.assertEqual(type(dataset[0]), tuple)
        self.assertEqual(type(dataset[0][0]), tuple)
        self.assertEqual(type(dataset[0][-1]), np.ndarray)
        for i in range(20):
            self.assertEqual(dataset[i][0][0], i)
            self.assertEqual(dataset[i][0][1], i * 2)
            self.assertEqual(dataset[i][1], i * 3)

        dataset = TensorDataset((range20, range20 * 2),
                                (range20 * 3, range20 * 4))
        self.assertEqual(len(dataset), 20)

        self.assertEqual(type(dataset[0]), tuple)
        self.assertEqual(type(dataset[1]), tuple)
        self.assertEqual(type(dataset[0][0]), tuple)
        self.assertEqual(type(dataset[0][1]), tuple)
        for i in range(20):
            self.assertEqual(type(dataset[i][0][0]), np.ndarray)
            self.assertEqual(type(dataset[i][0][1]), np.ndarray)
            self.assertEqual(dataset[i][0][0], i)
            self.assertEqual(dataset[i][0][1], i * 2)
            self.assertEqual(type(dataset[i][1][0]), np.ndarray)
            self.assertEqual(type(dataset[i][1][1]), np.ndarray)
            self.assertEqual(dataset[i][1][0], i * 3)
            self.assertEqual(dataset[i][1][1], i * 4)
예제 #3
0
    def test_fitting_with_data_loader(self):
        train_real_steps_per_epoch = 30
        train_batch_size = ModelTest.batch_size
        train_final_batch_missing_samples = 7
        train_size = train_real_steps_per_epoch * train_batch_size - \
                     train_final_batch_missing_samples
        train_x = torch.rand(train_size, 1)
        train_y = torch.rand(train_size, 1)
        train_dataset = TensorDataset(train_x, train_y)
        train_generator = DataLoader(train_dataset, train_batch_size)

        valid_real_steps_per_epoch = 10
        valid_batch_size = 15
        valid_final_batch_missing_samples = 3
        valid_size = valid_real_steps_per_epoch * valid_batch_size - \
                     valid_final_batch_missing_samples
        valid_x = torch.rand(valid_size, 1)
        valid_y = torch.rand(valid_size, 1)
        valid_dataset = TensorDataset(valid_x, valid_y)
        valid_generator = DataLoader(valid_dataset, valid_batch_size)

        logs = self.model.fit_generator(train_generator,
                                        valid_generator,
                                        epochs=ModelTest.epochs,
                                        steps_per_epoch=None,
                                        validation_steps=None,
                                        callbacks=[self.mock_callback])
        params = {
            'epochs': ModelTest.epochs,
            'steps': train_real_steps_per_epoch
        }
        self._test_callbacks_train(params, logs)
예제 #4
0
    def test_fitting_generator_calls(self):
        train_real_steps_per_epoch = 30
        train_batch_size = ModelTest.batch_size
        train_final_batch_missing_samples = 7
        train_size = train_real_steps_per_epoch * train_batch_size - \
                     train_final_batch_missing_samples
        train_x = torch.rand(train_size, 1)
        train_y = torch.rand(train_size, 1)
        train_dataset = TensorDataset(train_x, train_y)
        train_generator = DataLoader(train_dataset, train_batch_size)

        valid_real_steps_per_epoch = 10
        valid_batch_size = 15
        valid_final_batch_missing_samples = 3
        valid_size = valid_real_steps_per_epoch * valid_batch_size - \
                     valid_final_batch_missing_samples
        valid_x = torch.rand(valid_size, 1)
        valid_y = torch.rand(valid_size, 1)
        valid_dataset = TensorDataset(valid_x, valid_y)
        valid_generator = DataLoader(valid_dataset, valid_batch_size)

        class IterableMock:
            def __init__(self, iterable):
                self.iterable = iterable
                self.iter = None
                self.calls = []

            def __iter__(self):
                self.calls.append('__iter__')
                self.iter = iter(self.iterable)
                return self

            def __next__(self):
                self.calls.append('__next__')
                return next(self.iter)

            def __len__(self):
                self.calls.append('__len__')
                return len(self.iterable)

        mock_train_generator = IterableMock(train_generator)
        mock_valid_generator = IterableMock(valid_generator)
        self.model.fit_generator(mock_train_generator,
                                 mock_valid_generator,
                                 epochs=ModelTest.epochs)
        expected_train_calls = ['__len__'] + \
            (['__iter__'] + ['__next__'] * train_real_steps_per_epoch) * ModelTest.epochs
        expected_valid_calls = ['__len__'] + \
            (['__iter__'] + ['__next__'] * valid_real_steps_per_epoch) * ModelTest.epochs
        self.assertEqual(mock_train_generator.calls, expected_train_calls)
        self.assertEqual(mock_valid_generator.calls, expected_valid_calls)
예제 #5
0
 def test_multiple_tensors(self):
     range20 = np.expand_dims(np.arange(20), 1)
     dataset = TensorDataset(range20, range20 * 2, range20 * 3)
     self.assertEqual(len(dataset), 20)
     self.assertEqual(type(dataset[0]), tuple)
     for i in range(20):
         self.assertEqual(dataset[i][0], i)
         self.assertEqual(dataset[i][1], i * 2)
         self.assertEqual(dataset[i][2], i * 3)
예제 #6
0
 def test_evaluate_data_loader(self):
     x = torch.rand(ModelTest.evaluate_dataset_len, 1)
     y = torch.rand(ModelTest.evaluate_dataset_len, 1)
     dataset = TensorDataset(x, y)
     generator = DataLoader(dataset, ModelTest.batch_size)
     loss, metrics, pred_y = self.model.evaluate_generator(generator, return_pred=True)
     self.assertEqual(type(loss), float)
     self.assertEqual(type(metrics), np.ndarray)
     self.assertEqual(metrics.tolist(), self.batch_metrics_values + self.epoch_metrics_values)
     self.assertEqual(pred_y.shape, (ModelTest.evaluate_dataset_len, 1))
예제 #7
0
 def test_evaluate_data_loader_multi_input(self):
     x1 = torch.rand(ModelMultiInputTest.evaluate_dataset_len, 1)
     x2 = torch.rand(ModelMultiInputTest.evaluate_dataset_len, 1)
     y = torch.rand(ModelMultiInputTest.evaluate_dataset_len, 1)
     dataset = TensorDataset((x1, x2), y)
     generator = DataLoader(dataset, ModelMultiInputTest.batch_size)
     loss, pred_y = self.model.evaluate_generator(generator,
                                                  return_pred=True)
     self.assertEqual(type(loss), float)
     self.assertEqual(pred_y.shape,
                      (ModelMultiInputTest.evaluate_dataset_len, 1))
예제 #8
0
 def test_evaluate_data_loader_multi_output(self):
     x = torch.rand(ModelMultiOutputTest.evaluate_dataset_len, 1)
     y1 = torch.rand(ModelMultiOutputTest.evaluate_dataset_len, 1)
     y2 = torch.rand(ModelMultiOutputTest.evaluate_dataset_len, 1)
     dataset = TensorDataset(x, (y1, y2))
     generator = DataLoader(dataset, ModelMultiOutputTest.batch_size)
     loss, pred_y = self.model.evaluate_generator(generator, return_pred=True)
     self.assertEqual(type(loss), float)
     for pred in pred_y:
         self.assertEqual(type(pred), np.ndarray)
         self.assertEqual(pred.shape, (ModelMultiOutputTest.evaluate_dataset_len, 1))
예제 #9
0
 def test_multiple_tensors(self):
     dataset = TensorDataset(
         np.arange(20)[:, None],
         np.arange(20)[:, None] * 2,
         np.arange(20)[:, None] * 3,
     )
     self.assertEqual(len(dataset), 20)
     self.assertEqual(type(dataset[0]), tuple)
     for i in range(20):
         self.assertEqual(dataset[i][0], i)
         self.assertEqual(dataset[i][1], i * 2)
         self.assertEqual(dataset[i][2], i * 3)
예제 #10
0
    def test_list_of_tensors(self):
        dataset = TensorDataset(
            (
                np.arange(20)[:, None],
                np.arange(20)[:, None] * 2,
            ),
            np.arange(20)[:, None] * 3,
        )
        self.assertEqual(len(dataset), 20)
        self.assertEqual(type(dataset[0]), tuple)
        self.assertEqual(type(dataset[0][0]), tuple)
        self.assertEqual(type(dataset[0][-1]), np.ndarray)
        for i in range(20):
            self.assertEqual(dataset[i][0][0], i)
            self.assertEqual(dataset[i][0][1], i * 2)
            self.assertEqual(dataset[i][1], i * 3)

        dataset = TensorDataset((
            np.arange(20)[:, None],
            np.arange(20)[:, None] * 2,
        ), (
            np.arange(20)[:, None] * 3,
            np.arange(20)[:, None] * 4,
        ))
        self.assertEqual(len(dataset), 20)

        self.assertEqual(type(dataset[0]), tuple)
        self.assertEqual(type(dataset[1]), tuple)
        self.assertEqual(type(dataset[0][0]), tuple)
        self.assertEqual(type(dataset[0][1]), tuple)
        for i in range(20):
            self.assertEqual(type(dataset[i][0][0]), np.ndarray)
            self.assertEqual(type(dataset[i][0][1]), np.ndarray)
            self.assertEqual(dataset[i][0][0], i)
            self.assertEqual(dataset[i][0][1], i * 2)
            self.assertEqual(type(dataset[i][1][0]), np.ndarray)
            self.assertEqual(type(dataset[i][1][1]), np.ndarray)
            self.assertEqual(dataset[i][1][0], i * 3)
            self.assertEqual(dataset[i][1][1], i * 4)
예제 #11
0
 def test_one_tensor(self):
     range20 = np.expand_dims(np.arange(20), 1)
     dataset = TensorDataset(range20)
     self.assertEqual(len(dataset), 20)
     for i in range(20):
         self.assertEqual(dataset[i], np.array([i]))
예제 #12
0
 def _dataloader_from_data(self, args, batch_size):
     args = numpy_to_torch(args)
     dataset = TensorDataset(*args) if len(args) > 1 else args[0]
     generator = DataLoader(dataset, batch_size)
     return generator
예제 #13
0
 def test_one_tensor(self):
     dataset = TensorDataset(np.arange(20)[:, None])
     self.assertEqual(len(dataset), 20)
     for i in range(20):
         self.assertEqual(dataset[i], np.array([i]))