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)
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)
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)
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)
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)
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))
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))
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))
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)
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)
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]))
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
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]))