{"library":"pytorch-revgrad","title":"PyTorch Gradient Reversal Layer","description":"pytorch-revgrad is a minimalist PyTorch package that provides a gradient reversal layer (GRL) as both a module and a function. This layer is commonly used in domain adaptation techniques, such as Domain-Adversarial Neural Networks (DANN), to encourage feature extractors to learn domain-invariant representations by reversing the gradient signal for a subsequent domain classifier. The current version, `0.2.0`, was released in January 2021, and the library maintains a low release cadence, indicating stability for its core functionality.","language":"python","status":"maintenance","last_verified":"Sun May 17","install":{"commands":["pip install pytorch-revgrad"],"cli":null},"imports":["from pytorch_revgrad import RevGrad"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import torch\nfrom torch import nn\nfrom pytorch_revgrad import RevGrad\n\n# Define a simple feature extractor\nclass FeatureExtractor(nn.Module):\n    def __init__(self):\n        super().__init__()\n        self.fc1 = nn.Linear(10, 5)\n\n    def forward(self, x):\n        return torch.relu(self.fc1(x))\n\n# Define a domain classifier with a RevGrad layer\nclass DomainClassifier(nn.Module):\n    def __init__(self):\n        super().__init__()\n        self.revgrad = RevGrad()\n        self.fc1 = nn.Linear(5, 5)\n        self.fc2 = nn.Linear(5, 1)\n\n    def forward(self, x):\n        x = self.revgrad(x)\n        x = torch.relu(self.fc1(x))\n        return torch.sigmoid(self.fc2(x))\n\n# Example usage\nfeature_extractor = FeatureExtractor()\ndomain_classifier = DomainClassifier()\n\ninput_data = torch.randn(64, 10, requires_grad=True)\n\n# Forward pass\nfeatures = feature_extractor(input_data)\ndomain_output = domain_classifier(features)\n\nprint(f\"Input shape: {input_data.shape}\")\nprint(f\"Features shape: {features.shape}\")\nprint(f\"Domain output shape: {domain_output.shape}\")\n\n# Simulate a loss and backward pass (conceptual)\n# In a real scenario, you'd define a combined loss for source and target, \n# and optimize both feature_extractor and domain_classifier.\n# For demonstration, we'll just show a dummy backward pass.\n\ndummy_loss = domain_output.mean()\ndummy_loss.backward()\n\n# Check if gradients are flowing (should be for input_data and features)\nprint(f\"Gradient for input data exists: {input_data.grad is not None}\")\nprint(f\"Gradient for feature_extractor.fc1.weight exists: {feature_extractor.fc1.weight.grad is not None}\")\nprint(f\"Gradient for domain_classifier.fc1.weight exists: {domain_classifier.fc1.weight.grad is not None}\")","lang":"python","description":"This quickstart demonstrates how to integrate `RevGrad` into a simple PyTorch model architecture, typical for domain adaptation. It shows a `FeatureExtractor` and a `DomainClassifier` where `RevGrad` is placed before the classifier's layers to reverse gradients for domain classification.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-17","installed_version":"0.2.0","pypi_latest":"0.2.0","is_stale":false,"summary":{"python_range":"3.10–3.9","success_rate":40,"avg_install_s":67.8,"avg_import_s":5.94,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"pytorch-revgrad","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"pytorch-revgrad","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":76.8,"import_time_s":3.94,"mem_mb":63.8,"disk_size":"4.7G"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"pytorch-revgrad","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"pytorch-revgrad","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":69.2,"import_time_s":6.49,"mem_mb":68.8,"disk_size":"4.8G"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"pytorch-revgrad","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"pytorch-revgrad","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":65.2,"import_time_s":7.7,"mem_mb":67.7,"disk_size":"4.7G"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"pytorch-revgrad","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"pytorch-revgrad","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":59.9,"import_time_s":5.64,"mem_mb":68.2,"disk_size":"4.7G"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"pytorch-revgrad","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"pytorch-revgrad","exit_code":1,"wheel_type":null,"failure_reason":"timeout","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null}]}}