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_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_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, 'valid_steps': valid_real_steps_per_epoch } self._test_callbacks_train(params, logs)
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_with_progress_bar_coloring(self): x = torch.rand(ModelFittingTestCase.evaluate_dataset_len, 1) y = torch.rand(ModelFittingTestCase.evaluate_dataset_len, 1) dataset = TensorDataset(x, y) generator = DataLoader(dataset, ModelFittingTestCase.batch_size) _, _ = self.model.evaluate_generator(generator, verbose=True) self.assertStdoutContains(["%", "[32m", "[35m", "[36m", "[94m", "\u2588"])
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(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_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))
valid_y = np.random.randint(num_classes, size=num_valid_samples).astype('int64') num_test_samples = 200 test_x = np.random.randn(num_test_samples, num_features).astype('float32') test_y = np.random.randint(num_classes, size=num_test_samples).astype('int64') cuda_device = 0 device = torch.device("cuda:%d" % cuda_device if torch.cuda.is_available() else "cpu") # Define the network network = nn.Sequential(nn.Linear(num_features, hidden_state_size), nn.ReLU(), nn.Linear(hidden_state_size, num_classes)) # We need to use dataloaders (i.e. an iterable of batches) with Experiment train_loader = DataLoader(TensorDataset(train_x, train_y), batch_size=32) valid_loader = DataLoader(TensorDataset(valid_x, valid_y), batch_size=32) test_loader = DataLoader(TensorDataset(test_x, test_y), batch_size=32) # Everything is saved in ./expt/my_classification_network expt = Experiment('./expt/my_classification_network', network, device=device, optimizer='sgd', task='classif') expt.train(train_loader, valid_loader, epochs=5) expt.test(test_loader)
def _get_data_loader(self, *tensors): return DataLoader(TensorDataset(*tensors), batch_size=SKLearnMetricsTest.batch_size)
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]))