{"id":15297315,"url":"https://github.com/codeamt/pytorchswift","last_synced_at":"2025-04-13T23:15:51.931Z","repository":{"id":201923669,"uuid":"197704612","full_name":"codeamt/PyTorchSwift","owner":"codeamt","description":"A Swift Wrapper for PyTorch and Torchvision.","archived":false,"fork":false,"pushed_at":"2019-07-19T16:22:11.000Z","size":75,"stargazers_count":15,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-04-13T23:15:38.231Z","etag":null,"topics":["deep-learning","python-3-6","swift5","torch","torchvision"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/codeamt.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2019-07-19T04:57:51.000Z","updated_at":"2025-03-14T08:43:54.000Z","dependencies_parsed_at":null,"dependency_job_id":"27e8fb9b-e2bb-4172-b86c-60dab09b21b3","html_url":"https://github.com/codeamt/PyTorchSwift","commit_stats":null,"previous_names":["codeamt/pytorchswift"],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codeamt%2FPyTorchSwift","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codeamt%2FPyTorchSwift/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codeamt%2FPyTorchSwift/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codeamt%2FPyTorchSwift/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/codeamt","download_url":"https://codeload.github.com/codeamt/PyTorchSwift/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248794568,"owners_count":21162615,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["deep-learning","python-3-6","swift5","torch","torchvision"],"created_at":"2024-09-30T19:16:40.706Z","updated_at":"2025-04-13T23:15:51.894Z","avatar_url":"https://github.com/codeamt.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=center\u003e\u003cimg src=\"pt4slogo.png\" width=\"50%\" /\u003e\u003c/p\u003e\n\u003cp align=center\u003eA Swift Wrapper for  PyTorch and Torchvision.\u003c/p\u003e\n\n\n## Getting Started \n**Note**: This project is not affiliated with PyTorch and is still in early development. \n\n### Prerequisites:  \nThis library requires Xcode toolchain Swift for [Tensorflow release/Swift 5](https://swift.org/download/)\n\n### Installing with Swift Package Manager: \nAdd the following line to your dependencies in `Package.swift` file\n```\n.package(url: \"https://github.com/codeamt/PyTorchSwift.git\", .branch(\"master\")),\n\n```\n\n## Usage\n\n### Importing: \n\n```\nimport Foundation \nimport Python\nimport PyTorch4Swift \n\nlet torch = PyTorchSwift()\nlet torchvision = TorchVisionSwift()\n\n```\n**Note**: If you have trouble or get errors importing Python (even after upgrading your toolchain), try changing your build system to legacy: File \u003e Project Settings\u003e Build System -\u003e Legacy\n### Data Preprocessing:  \n```\nvar transforms_list:[PythonObject] = [torchvision.transforms.ToTensor(),\n                                      torchvision.transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])]\n\nlet transforms = torchvision.transforms.Compose(transforms_list)\n\n\nlet trainset = torchvision.datasets.CIFAR10(root:\"./data\", train:true, download:true, transform:transforms)\nlet trainloader = torch.utils.data.DataLoader(trainset, batch_size:4, shuffle:true, num_workers:2)\n\nlet testset = torchvision.datasets.CIFAR10(root:\"./data\", train:false, download:true, transform:transforms)\nlet testloader = torch.utils.data.DataLoader(testset, batch_size:4, shuffle:false, num_workers:2)\n\nlet labels = (\"plane\", \"car\", \"bird\", \"cat\",\"deer\", \"dog\", \"frog\", \"horse\", \"ship\", \"truck\")\n```\n\n### Setting Up Transfer Learning:\n```\nlet arch = torchvision.models.resnet18(pretrained=True)\n\nif (torch.cuda.is_available() == true){\n   let device = torch.device(\"cuda:0\")\n   arch.to(device)\n   print(device)\n} else {\n   print( \"using cpu\")\n}\n\nlet criterion = torch.nn.CrossEntropyLoss()\nlet optimizer = torch.optim.SGD(arch.parameters(), lr:0.001, momentum:0.9)\n\nvar  runningLoss = 0.0\n```\n\n### Training:\n```\nfor epoch in 0...50 {\n  runningLoss = 0.0\n  \n  let trainIter:PythonObject = Python.enumerate(trainloader)\n  \n  for idx in trainloader.indices{\n     let data = trainIter.next()\n\n    \n     let inputs = data[0]\n     let labels = data[1]\n                \n     //  zero the parameter gradients\n     optimizer.zero_grad()\n\n     //  forward + backward + optimize\n     let outputs = arch(inputs)\n     let loss = criterion(outputs, labels)\n     loss.backward()\n     optimizer.step()\n\n     // print statistics\n     runningLoss += Double(loss.item())!\n                \n     //print every 2000 mini-batches\n     if (Int(idx)! % 2000 == 1999){\n        print(\"[epoch:\\(epoch), \\(idx + 1)] loss: \\(runningLoss / 2000)\")\n     }\n  }\n  \n  runningLoss = 0.0\n  print(\"Finished Training\")\n}\n```\n### Testing:\n```\n// Test network\nlet testiter = Python.enumerate(testloader)\nlet data = testiter.next()\nlet images = data[0]\nlet labels = data[1]\n        \nlet outputs = arch(images)\n\nlet (_, predicted) = torch.`max`(outputs)\nprint(\"predicted: \",predicted)\nprint(\"test images: \",images)\nprint(\"test labels: \",labels)\nprint(\"nn outputs: \",outputs)\n```\n## Additional Notes: \n\nThis library was inspired by this [repo](https://github.com/johndpope/SwiftTorch) (an executable project) and learnings from the [Fast.ai Live Course (2019) - Part 2](https://course.fast.ai/videos/?lesson=13) with the intention diversifying the DL/ML libraries available to Swift developers working on ML/DL projects and research. To report bugs please submit an issue. To contribute, please make a pull request!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodeamt%2Fpytorchswift","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcodeamt%2Fpytorchswift","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodeamt%2Fpytorchswift/lists"}