├── README.md ├── Swift4TF_Augmentation.ipynb ├── Swift4TF_CIFAR10.ipynb ├── Swift4TF_DeepDream.ipynb ├── Swift4TF_Intro.ipynb ├── Swift4TF_MNIST.ipynb ├── Swift4TF_Matplotlib.ipynb └── Swift4TF_TransferLearning.ipynb /README.md: -------------------------------------------------------------------------------- 1 | ## Swift4TF 2 | 3 | Swift for TensorFlow is a next generation platform for deep learning and differentiable programming. 4 | 5 | In general Swift for TF tries to resolve the drawbacks of Python 6 | 7 | * Performance 8 | * Concurrency 9 | * Deployment 10 | * Custom Ops 11 | 12 | Swift has many advantages 13 | 14 | * First-class autodiff 15 | * Next-generation APIs 16 | * High-quality tooling 17 | * Python Integrability 18 | * Performance of graphs + flexibility of Eager execution 19 | 20 | ## Notebooks 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 34 | 35 | 36 | 37 | 38 | 41 | 42 | 43 | 44 | 45 | 46 | 49 | 50 | 51 | 52 | 53 | 54 | 57 | 58 | 59 | 60 | 61 | 62 | 65 | 66 | 67 | 68 | 69 | 70 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 82 | 83 |
NameDescriptionNotebook
IntroductionA basic introduction to Swift and its basic syntax 32 | 33 |
VisualizationHow to use Matplotlib in Swift For TensorFlow. 39 | 40 |
AugmentationHow to use do basic augmentations like flipping and cropping 47 | 48 |
MNISTUsing Swift for TensorFlow for training MNIST. 55 | 56 |
CIFAR10Using Swift for TensorFlow for training CIFAR10. 63 | 64 |
Transfer LearningA basic transfer learning tutorial using VGG 71 | 72 |
Deep DreamImplementation of deep dream using a VGG model. 80 | 81 |
-------------------------------------------------------------------------------- /Swift4TF_CIFAR10.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "Swift4TF_CIFAR10.ipynb", 7 | "version": "0.3.2", 8 | "provenance": [], 9 | "collapsed_sections": [], 10 | "include_colab_link": true 11 | }, 12 | "kernelspec": { 13 | "name": "swift", 14 | "display_name": "Swift" 15 | }, 16 | "accelerator": "GPU" 17 | }, 18 | "cells": [ 19 | { 20 | "cell_type": "markdown", 21 | "metadata": { 22 | "id": "view-in-github", 23 | "colab_type": "text" 24 | }, 25 | "source": [ 26 | "\"Open" 27 | ] 28 | }, 29 | { 30 | "cell_type": "code", 31 | "metadata": { 32 | "id": "2Rw1ZBHPxdsX", 33 | "colab_type": "code", 34 | "colab": {} 35 | }, 36 | "source": [ 37 | "import Python\n", 38 | "import TensorFlow" 39 | ], 40 | "execution_count": 0, 41 | "outputs": [] 42 | }, 43 | { 44 | "cell_type": "markdown", 45 | "metadata": { 46 | "id": "J2RItu06_wQJ", 47 | "colab_type": "text" 48 | }, 49 | "source": [ 50 | "Import some python libraries that we need " 51 | ] 52 | }, 53 | { 54 | "cell_type": "code", 55 | "metadata": { 56 | "id": "SslxOdhg3Num", 57 | "colab_type": "code", 58 | "colab": {} 59 | }, 60 | "source": [ 61 | "%include \"EnableIPythonDisplay.swift\"\n", 62 | "IPythonDisplay.shell.enable_matplotlib(\"inline\")\n", 63 | "\n", 64 | "let plt = Python.import(\"matplotlib.pyplot\")\n", 65 | "let np = Python.import(\"numpy\")\n", 66 | "let subprocess = Python.import(\"subprocess\")\n", 67 | "let path = Python.import(\"os.path\")" 68 | ], 69 | "execution_count": 0, 70 | "outputs": [] 71 | }, 72 | { 73 | "cell_type": "markdown", 74 | "metadata": { 75 | "id": "02PhB9dg_09o", 76 | "colab_type": "text" 77 | }, 78 | "source": [ 79 | "Download cifar 10 " 80 | ] 81 | }, 82 | { 83 | "cell_type": "code", 84 | "metadata": { 85 | "id": "sGzbZdJH3F9B", 86 | "colab_type": "code", 87 | "colab": { 88 | "base_uri": "https://localhost:8080/", 89 | "height": 54 90 | }, 91 | "outputId": "ae7aa258-70c2-4b80-df3e-c27c7429c4a5" 92 | }, 93 | "source": [ 94 | "//https://github.com/tensorflow/swift-models/tree/master/CIFAR\n", 95 | "\n", 96 | "let filepath = \"./cifar-10-batches-py\"\n", 97 | "let isdir = Bool(path.isdir(filepath))!\n", 98 | "if !isdir {\n", 99 | " print(\"Downloading CIFAR data...\")\n", 100 | " let command = \"wget -nv -O- https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz | tar xzf - -C .\"\n", 101 | " subprocess.call(command, shell: true)\n", 102 | "}" 103 | ], 104 | "execution_count": 3, 105 | "outputs": [ 106 | { 107 | "output_type": "stream", 108 | "text": [ 109 | "Downloading CIFAR data...\n", 110 | "2019-05-05 22:15:06 URL:https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz [170498071/170498071] -> \"-\" [1]\n" 111 | ], 112 | "name": "stdout" 113 | } 114 | ] 115 | }, 116 | { 117 | "cell_type": "markdown", 118 | "metadata": { 119 | "id": "C1iYm9INCh2A", 120 | "colab_type": "text" 121 | }, 122 | "source": [ 123 | "Setup the dataset " 124 | ] 125 | }, 126 | { 127 | "cell_type": "code", 128 | "metadata": { 129 | "id": "1aiJm7Ht1S9c", 130 | "colab_type": "code", 131 | "colab": {} 132 | }, 133 | "source": [ 134 | "//https://github.com/tensorflow/swift-models/tree/master/CIFAR\n", 135 | "\n", 136 | "var batchSize:Int = 64 \n", 137 | "\n", 138 | "func loadCIFARFile(named name: String, in directory: String = \".\") -> (Tensor, Tensor) {\n", 139 | " let np = Python.import(\"numpy\")\n", 140 | " let pickle = Python.import(\"pickle\")\n", 141 | " let path = \"\\(directory)/cifar-10-batches-py/\\(name)\"\n", 142 | " let f = Python.open(path, \"rb\")\n", 143 | " let res = pickle.load(f, encoding: \"bytes\")\n", 144 | "\n", 145 | " let bytes = res[Python.bytes(\"data\", encoding: \"utf8\")]\n", 146 | " let labels = res[Python.bytes(\"labels\", encoding: \"utf8\")]\n", 147 | "\n", 148 | " let labelTensor = Tensor(numpy: np.array(labels))!\n", 149 | " let images = Tensor(numpy: bytes)!\n", 150 | " let imageCount = images.shape[0]\n", 151 | "\n", 152 | " // reshape and transpose from the provided N(CHW) to TF default NHWC\n", 153 | " let imageTensor = Tensor(images\n", 154 | " .reshaped(to: [imageCount, 3, 32, 32])\n", 155 | " .transposed(withPermutations: [0, 2, 3, 1]))\n", 156 | "\n", 157 | " let mean = Tensor([0.485, 0.456, 0.406])\n", 158 | " let std = Tensor([0.229, 0.224, 0.225])\n", 159 | " let imagesNormalized = ((imageTensor / 255.0) - mean) / std\n", 160 | "\n", 161 | " return (imagesNormalized, Tensor(labelTensor))\n", 162 | "}\n", 163 | "\n", 164 | "/// helper functions \n", 165 | "\n", 166 | "// report accuracy of a batch \n", 167 | "func getAccuracy(y:Tensor, logits:Tensor) -> Float{\n", 168 | " let out = Tensor(logits.argmax(squeezingAxis: 1) .== y).sum().scalarized()\n", 169 | " return Float(out) / Float(y.shape[0])\n", 170 | "}\n", 171 | "\n", 172 | "//round two decimal places \n", 173 | "func roundTwo(_ input:Float) -> Float{\n", 174 | " return (input*100).rounded()/100\n", 175 | "}\n", 176 | "\n", 177 | "//crop to a certain size \n", 178 | "func crop(_ tensor:Tensor, _ size:Int) -> Tensor {\n", 179 | " let i = Int.random(in: 0..<32-size)\n", 180 | " let j = Int.random(in: 0..<32-size)\n", 181 | " let N = Int(tensor.shape[0])\n", 182 | " \n", 183 | " return tensor[0..) -> Tensor {\n", 188 | " var out = tensor\n", 189 | " \n", 190 | " //maybe flip\n", 191 | " if Float.random(in:0...1) < 0.5{\n", 192 | " out = tensor.transposed(withPermutations: [0, 1, 2, 3])\n", 193 | " }\n", 194 | " //maybe crop and resize \n", 195 | " if Float.random(in:0...1) < 0.5{\n", 196 | " let cropped = crop(tensor, 25)\n", 197 | " out = Raw.resizeArea(images:cropped , size:[32, 32] )\n", 198 | " }\n", 199 | " \n", 200 | " return out\n", 201 | "}" 202 | ], 203 | "execution_count": 0, 204 | "outputs": [] 205 | }, 206 | { 207 | "cell_type": "markdown", 208 | "metadata": { 209 | "id": "RQCTZq_VC90x", 210 | "colab_type": "text" 211 | }, 212 | "source": [ 213 | "Create a dataset " 214 | ] 215 | }, 216 | { 217 | "cell_type": "code", 218 | "metadata": { 219 | "id": "h9nh7E_i7A9C", 220 | "colab_type": "code", 221 | "colab": {} 222 | }, 223 | "source": [ 224 | "struct Element: TensorGroup {\n", 225 | " var x: Tensor\n", 226 | " var y: Tensor\n", 227 | "}\n", 228 | "\n", 229 | "//cifar 10 training comes in 6 files we load/concatenate them [5000, 32, 32, 3]\n", 230 | "let train_data = (1..<6).map { loadCIFARFile(named: \"data_batch_\\($0)\") }\n", 231 | "\n", 232 | "let trainX = Raw.concat(concatDim: Tensor(0), train_data.map { $0.0})\n", 233 | "let trainY = Raw.concat(concatDim: Tensor(0), train_data.map { $0.1})\n", 234 | "\n", 235 | "//load testing images size [1000, 32, 32, 3]\n", 236 | "let (testX, testY) = loadCIFARFile(named: \"test_batch\")\n", 237 | "\n", 238 | "//create a dataset for training and testing \n", 239 | "let trainDataset = Dataset(elements: Element(x: trainX, y:trainY))\n", 240 | "let testDataset = Dataset(elements: Element(x:testX, y:testY))" 241 | ], 242 | "execution_count": 0, 243 | "outputs": [] 244 | }, 245 | { 246 | "cell_type": "markdown", 247 | "metadata": { 248 | "id": "8f_A1GMKDmsW", 249 | "colab_type": "text" 250 | }, 251 | "source": [ 252 | "Create the basic parts of the mode [convblocks + classifier]" 253 | ] 254 | }, 255 | { 256 | "cell_type": "code", 257 | "metadata": { 258 | "id": "EiFHwXwiGohF", 259 | "colab_type": "code", 260 | "colab": {} 261 | }, 262 | "source": [ 263 | "struct ConvBlock:Layer{\n", 264 | "\n", 265 | " typealias Input = Tensor\n", 266 | " typealias Output = Tensor\n", 267 | " \n", 268 | " var conv1: Conv2D\n", 269 | " var conv2: Conv2D\n", 270 | " var pool: MaxPool2D\n", 271 | " var norm: BatchNorm\n", 272 | " \n", 273 | " init(filterShape:(Int, Int))\n", 274 | " {\n", 275 | " self.conv1 = Conv2D(filterShape: (3, 3,filterShape.0, filterShape.1), \n", 276 | " strides: (1, 1), padding : .same, activation: relu)\n", 277 | " \n", 278 | " self.conv2 = Conv2D(filterShape: (3, 3,filterShape.1, filterShape.1), \n", 279 | " strides: (1, 1), padding : .same, activation: relu)\n", 280 | " \n", 281 | " self.norm = BatchNorm(featureCount: filterShape.1)\n", 282 | " self.pool = MaxPool2D(poolSize: (2, 2), strides: (2, 2))\n", 283 | " }\n", 284 | " \n", 285 | " @differentiable\n", 286 | " func call(_ input: Input) -> Output {\n", 287 | " return input.sequenced(through: conv1, conv2, norm, pool)\n", 288 | " }\n", 289 | "}\n", 290 | "\n", 291 | "struct Classifier:Layer{\n", 292 | "\n", 293 | " typealias Input = Tensor\n", 294 | " typealias Output = Tensor\n", 295 | " \n", 296 | " var dense1: Dense\n", 297 | " var dense2: Dense\n", 298 | " var dropout: Dropout\n", 299 | " \n", 300 | " init(input:Int, mid:Int)\n", 301 | " {\n", 302 | " self.dense1 = Dense(inputSize: input , outputSize: mid, activation: relu)\n", 303 | " self.dropout = Dropout(probability: 0.5)\n", 304 | " self.dense2 = Dense(inputSize: mid , outputSize: 10)\n", 305 | " }\n", 306 | " \n", 307 | " @differentiable\n", 308 | " func call(_ input: Input) -> Output {\n", 309 | " return input.sequenced(through: dense1, dropout, dense2) \n", 310 | " }\n", 311 | "}" 312 | ], 313 | "execution_count": 0, 314 | "outputs": [] 315 | }, 316 | { 317 | "cell_type": "markdown", 318 | "metadata": { 319 | "id": "g8JIXXijD2kV", 320 | "colab_type": "text" 321 | }, 322 | "source": [ 323 | "Create the overall model" 324 | ] 325 | }, 326 | { 327 | "cell_type": "code", 328 | "metadata": { 329 | "id": "3cwhwVuJcenw", 330 | "colab_type": "code", 331 | "colab": {} 332 | }, 333 | "source": [ 334 | "struct CNN: Layer {\n", 335 | " typealias Input = Tensor\n", 336 | " typealias Output = Tensor\n", 337 | "\n", 338 | " var conv1 = ConvBlock(filterShape:(3, 16))\n", 339 | " var conv2 = ConvBlock(filterShape:(16, 32))\n", 340 | " var conv3 = ConvBlock(filterShape:(32, 64))\n", 341 | " var conv4 = ConvBlock(filterShape:(64, 64))\n", 342 | " \n", 343 | " var dropout = Dropout(probability: 0.5)\n", 344 | " \n", 345 | " var flatten = Flatten()\n", 346 | " var classifier = Classifier(input:2*2*64, mid:128)\n", 347 | " \n", 348 | " @differentiable\n", 349 | " func call(_ input: Input) -> Output {\n", 350 | " let convolved = input.sequenced(through: conv1, conv2, conv3, conv4)\n", 351 | " return convolved.sequenced(through:dropout, flatten, classifier)\n", 352 | " }\n", 353 | "}" 354 | ], 355 | "execution_count": 0, 356 | "outputs": [] 357 | }, 358 | { 359 | "cell_type": "code", 360 | "metadata": { 361 | "id": "iqnb1PSJavPO", 362 | "colab_type": "code", 363 | "outputId": "3c95e9ea-5f1a-4daa-9af7-66e99f19afb5", 364 | "colab": { 365 | "base_uri": "https://localhost:8080/", 366 | "height": 35 367 | } 368 | }, 369 | "source": [ 370 | "var model = CNN()\n", 371 | "let optimizer = Adam(for: model)\n", 372 | "\n", 373 | "//warmup \n", 374 | "let tensor = Tensor(zeros: [1, 32, 32, 3])\n", 375 | "print(model(tensor))" 376 | ], 377 | "execution_count": 12, 378 | "outputs": [ 379 | { 380 | "output_type": "stream", 381 | "text": [ 382 | "[[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]]\r\n" 383 | ], 384 | "name": "stdout" 385 | } 386 | ] 387 | }, 388 | { 389 | "cell_type": "markdown", 390 | "metadata": { 391 | "id": "mEBAvChZD7DS", 392 | "colab_type": "text" 393 | }, 394 | "source": [ 395 | "Training and reporting the results" 396 | ] 397 | }, 398 | { 399 | "cell_type": "code", 400 | "metadata": { 401 | "id": "FSF0UUasAXVN", 402 | "colab_type": "code", 403 | "outputId": "612d10c9-97b8-4d55-a2de-23a3a54a5302", 404 | "colab": { 405 | "base_uri": "https://localhost:8080/", 406 | "height": 926 407 | } 408 | }, 409 | "source": [ 410 | "var trainLoss:Float = 0.0\n", 411 | "var trainAcc :Float = 0.0\n", 412 | "var testLoss:Float = 0.0\n", 413 | "var testAcc:Float = 0.0 \n", 414 | "\n", 415 | "var batchCount: Float = 0.0\n", 416 | "\n", 417 | "for epoch in 0..<50{\n", 418 | " \n", 419 | " //evaluate metrics\n", 420 | " trainLoss = 0.0\n", 421 | " trainAcc = 0.0\n", 422 | " batchCount = 0.0 \n", 423 | " \n", 424 | " let shuffled = trainDataset.shuffled(sampleCount:50000 , randomSeed: Int64(epoch))\n", 425 | " \n", 426 | " for batch in shuffled.batched(batchSize) {\n", 427 | " \n", 428 | " //get batches\n", 429 | " let X = augment(batch.x)\n", 430 | " let y = batch.y\n", 431 | " \n", 432 | " //calculate the loss and gradient\n", 433 | " let (loss, grads) = valueWithGradient(at: model) { model -> Tensor in\n", 434 | " let logits = model(X)\n", 435 | " return softmaxCrossEntropy(logits: logits, labels: y)\n", 436 | " }\n", 437 | "\n", 438 | " //make an optimizer step \n", 439 | " optimizer.update(&model.allDifferentiableVariables, along: grads) \n", 440 | " \n", 441 | " let logits = model(X) //this is slowing down ? \n", 442 | " let acc = getAccuracy(y:y, logits:logits)\n", 443 | " \n", 444 | " trainLoss += Float(loss.scalarized())\n", 445 | " trainAcc += acc\n", 446 | " batchCount += 1\n", 447 | " } \n", 448 | " \n", 449 | " trainLoss /= batchCount\n", 450 | " trainAcc /= batchCount\n", 451 | " \n", 452 | " //training\n", 453 | " testLoss = 0.0\n", 454 | " testAcc = 0.0\n", 455 | " \n", 456 | " let logits = model(testX)\n", 457 | " let loss = softmaxCrossEntropy(logits: logits, labels: testY)\n", 458 | " let acc = getAccuracy(y:testY, logits:logits)\n", 459 | "\n", 460 | " testLoss += Float(loss.scalarized())\n", 461 | " testAcc += acc\n", 462 | " print(\"epoch: \\(epoch+1), train_loss: \\(roundTwo(trainLoss)), test_loss: \\(roundTwo(testLoss)), train_acc: \\(roundTwo(trainAcc)), test_acc: \\(roundTwo(testAcc))\" )\n", 463 | "\n", 464 | "}" 465 | ], 466 | "execution_count": 13, 467 | "outputs": [ 468 | { 469 | "output_type": "stream", 470 | "text": [ 471 | "epoch: 1, train_loss: 1.64, test_loss: 1.3, train_acc: 0.41, test_acc: 0.53\n", 472 | "epoch: 2, train_loss: 1.23, test_loss: 1.1, train_acc: 0.58, test_acc: 0.61\n", 473 | "epoch: 3, train_loss: 1.04, test_loss: 0.94, train_acc: 0.66, test_acc: 0.67\n", 474 | "epoch: 4, train_loss: 0.92, test_loss: 0.83, train_acc: 0.7, test_acc: 0.71\n", 475 | "epoch: 5, train_loss: 0.84, test_loss: 0.87, train_acc: 0.73, test_acc: 0.7\n", 476 | "epoch: 6, train_loss: 0.78, test_loss: 0.76, train_acc: 0.76, test_acc: 0.74\n", 477 | "epoch: 7, train_loss: 0.74, test_loss: 0.76, train_acc: 0.77, test_acc: 0.74\n", 478 | "epoch: 8, train_loss: 0.69, test_loss: 0.77, train_acc: 0.79, test_acc: 0.73\n", 479 | "epoch: 9, train_loss: 0.66, test_loss: 0.72, train_acc: 0.8, test_acc: 0.75\n", 480 | "epoch: 10, train_loss: 0.63, test_loss: 0.69, train_acc: 0.81, test_acc: 0.77\n", 481 | "epoch: 11, train_loss: 0.61, test_loss: 0.67, train_acc: 0.82, test_acc: 0.77\n", 482 | "epoch: 12, train_loss: 0.59, test_loss: 0.7, train_acc: 0.82, test_acc: 0.76\n", 483 | "epoch: 13, train_loss: 0.58, test_loss: 0.71, train_acc: 0.83, test_acc: 0.77\n", 484 | "epoch: 14, train_loss: 0.56, test_loss: 0.69, train_acc: 0.84, test_acc: 0.77\n", 485 | "epoch: 15, train_loss: 0.55, test_loss: 0.71, train_acc: 0.84, test_acc: 0.77\n", 486 | "epoch: 16, train_loss: 0.52, test_loss: 0.69, train_acc: 0.85, test_acc: 0.78\n", 487 | "epoch: 17, train_loss: 0.51, test_loss: 0.68, train_acc: 0.86, test_acc: 0.78\n", 488 | "epoch: 18, train_loss: 0.51, test_loss: 0.66, train_acc: 0.85, test_acc: 0.78\n", 489 | "epoch: 19, train_loss: 0.5, test_loss: 0.7, train_acc: 0.86, test_acc: 0.77\n", 490 | "epoch: 20, train_loss: 0.5, test_loss: 0.7, train_acc: 0.86, test_acc: 0.78\n", 491 | "epoch: 21, train_loss: 0.48, test_loss: 0.66, train_acc: 0.86, test_acc: 0.79\n", 492 | "epoch: 22, train_loss: 0.48, test_loss: 0.7, train_acc: 0.86, test_acc: 0.78\n", 493 | "epoch: 23, train_loss: 0.46, test_loss: 0.67, train_acc: 0.87, test_acc: 0.79\n", 494 | "epoch: 24, train_loss: 0.45, test_loss: 0.69, train_acc: 0.87, test_acc: 0.79\n", 495 | "epoch: 25, train_loss: 0.44, test_loss: 0.72, train_acc: 0.88, test_acc: 0.78\n", 496 | "epoch: 26, train_loss: 0.44, test_loss: 0.69, train_acc: 0.88, test_acc: 0.78\n", 497 | "epoch: 27, train_loss: 0.43, test_loss: 0.72, train_acc: 0.88, test_acc: 0.78\n", 498 | "epoch: 28, train_loss: 0.42, test_loss: 0.68, train_acc: 0.88, test_acc: 0.79\n", 499 | "epoch: 29, train_loss: 0.43, test_loss: 0.67, train_acc: 0.88, test_acc: 0.8\n", 500 | "epoch: 30, train_loss: 0.42, test_loss: 0.71, train_acc: 0.89, test_acc: 0.78\n", 501 | "epoch: 31, train_loss: 0.4, test_loss: 0.72, train_acc: 0.89, test_acc: 0.78\n", 502 | "epoch: 32, train_loss: 0.41, test_loss: 0.69, train_acc: 0.89, test_acc: 0.79\n", 503 | "epoch: 33, train_loss: 0.39, test_loss: 0.73, train_acc: 0.9, test_acc: 0.79\n", 504 | "epoch: 34, train_loss: 0.39, test_loss: 0.7, train_acc: 0.9, test_acc: 0.79\n", 505 | "epoch: 35, train_loss: 0.38, test_loss: 0.7, train_acc: 0.9, test_acc: 0.79\n", 506 | "epoch: 36, train_loss: 0.38, test_loss: 0.71, train_acc: 0.9, test_acc: 0.79\n", 507 | "epoch: 37, train_loss: 0.37, test_loss: 0.68, train_acc: 0.9, test_acc: 0.8\n", 508 | "epoch: 38, train_loss: 0.37, test_loss: 0.69, train_acc: 0.9, test_acc: 0.8\n", 509 | "epoch: 39, train_loss: 0.37, test_loss: 0.72, train_acc: 0.9, test_acc: 0.8\n", 510 | "epoch: 40, train_loss: 0.36, test_loss: 0.72, train_acc: 0.91, test_acc: 0.79\n", 511 | "epoch: 41, train_loss: 0.34, test_loss: 0.71, train_acc: 0.91, test_acc: 0.79\n", 512 | "epoch: 42, train_loss: 0.35, test_loss: 0.74, train_acc: 0.91, test_acc: 0.79\n", 513 | "epoch: 43, train_loss: 0.35, test_loss: 0.73, train_acc: 0.91, test_acc: 0.79\n", 514 | "epoch: 44, train_loss: 0.35, test_loss: 0.74, train_acc: 0.91, test_acc: 0.79\n", 515 | "epoch: 45, train_loss: 0.34, test_loss: 0.74, train_acc: 0.91, test_acc: 0.79\n", 516 | "epoch: 46, train_loss: 0.34, test_loss: 0.72, train_acc: 0.91, test_acc: 0.8\n", 517 | "epoch: 47, train_loss: 0.34, test_loss: 0.71, train_acc: 0.91, test_acc: 0.8\n", 518 | "epoch: 48, train_loss: 0.32, test_loss: 0.73, train_acc: 0.92, test_acc: 0.79\n", 519 | "epoch: 49, train_loss: 0.34, test_loss: 0.69, train_acc: 0.91, test_acc: 0.8\n", 520 | "epoch: 50, train_loss: 0.32, test_loss: 0.73, train_acc: 0.92, test_acc: 0.8\n" 521 | ], 522 | "name": "stdout" 523 | } 524 | ] 525 | } 526 | ] 527 | } -------------------------------------------------------------------------------- /Swift4TF_Intro.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "Swift4TF_Intro.ipynb", 7 | "version": "0.3.2", 8 | "provenance": [], 9 | "collapsed_sections": [] 10 | }, 11 | "kernelspec": { 12 | "display_name": "Swift", 13 | "language": "swift", 14 | "name": "swift" 15 | }, 16 | "accelerator": "GPU" 17 | }, 18 | "cells": [ 19 | { 20 | "cell_type": "markdown", 21 | "metadata": { 22 | "id": "yaRlEIvpBamB", 23 | "colab_type": "text" 24 | }, 25 | "source": [ 26 | "\n", 27 | "Swift for TensorFlow is a next generation platform for deep learning and differentiable programming.\n", 28 | "\n", 29 | "In general Swift for TF tries to resolve the drawbacks of Python\n", 30 | "\n", 31 | "* Performance\n", 32 | "* Concurrency\n", 33 | "* Deployment\n", 34 | "* Custom Ops\n", 35 | "\n", 36 | "Swift has many advantages \n", 37 | "\n", 38 | "* First-class autodiff\n", 39 | "* Next-generation APIs\n", 40 | "* High-quality tooling\n", 41 | "* Python Integerability\n", 42 | "* Performance of graphs + flexibility of Eager execution\n", 43 | "\n" 44 | ] 45 | }, 46 | { 47 | "cell_type": "markdown", 48 | "metadata": { 49 | "id": "IRoey45xwv0w", 50 | "colab_type": "text" 51 | }, 52 | "source": [ 53 | "# SWIFT" 54 | ] 55 | }, 56 | { 57 | "cell_type": "markdown", 58 | "metadata": { 59 | "id": "OihtZA6QhEZS", 60 | "colab_type": "text" 61 | }, 62 | "source": [ 63 | "## Constants and Variables" 64 | ] 65 | }, 66 | { 67 | "cell_type": "code", 68 | "metadata": { 69 | "id": "p_pjyevTdE18", 70 | "colab_type": "code", 71 | "colab": {} 72 | }, 73 | "source": [ 74 | "let x = 2.0 //constant\n", 75 | "var y = 2 //variable\n", 76 | "\n", 77 | "\n", 78 | "//define types inline \n", 79 | "let w:Double = 2.0\n", 80 | "var z:Float = 3.0" 81 | ], 82 | "execution_count": 0, 83 | "outputs": [] 84 | }, 85 | { 86 | "cell_type": "code", 87 | "metadata": { 88 | "id": "j-W3HyT9ZBOF", 89 | "colab_type": "code", 90 | "outputId": "0dc348d0-20f7-4947-a5c9-1a3de3c49bcd", 91 | "colab": { 92 | "base_uri": "https://localhost:8080/", 93 | "height": 34 94 | } 95 | }, 96 | "source": [ 97 | "\"I have \\(y) apples.\"" 98 | ], 99 | "execution_count": 2, 100 | "outputs": [ 101 | { 102 | "output_type": "execute_result", 103 | "data": { 104 | "text/plain": [ 105 | "\"I have 2 apples.\"\n" 106 | ] 107 | }, 108 | "metadata": { 109 | "tags": [] 110 | }, 111 | "execution_count": 2 112 | } 113 | ] 114 | }, 115 | { 116 | "cell_type": "markdown", 117 | "metadata": { 118 | "id": "yTka2hG9lM_D", 119 | "colab_type": "text" 120 | }, 121 | "source": [ 122 | "## Arrays and Dictionaries \n", 123 | "\n", 124 | "Initialize arrays and dictionaries" 125 | ] 126 | }, 127 | { 128 | "cell_type": "code", 129 | "metadata": { 130 | "id": "BI46PGfQdE2I", 131 | "colab_type": "code", 132 | "colab": {} 133 | }, 134 | "source": [ 135 | "var numbersArry = [1, 2]\n", 136 | "var numbersDict = [\"one\":1, \"two\":2]" 137 | ], 138 | "execution_count": 0, 139 | "outputs": [] 140 | }, 141 | { 142 | "cell_type": "markdown", 143 | "metadata": { 144 | "id": "4l-kIpID_x9N", 145 | "colab_type": "text" 146 | }, 147 | "source": [ 148 | "You can also define empty arrays and dictionaries" 149 | ] 150 | }, 151 | { 152 | "cell_type": "code", 153 | "metadata": { 154 | "id": "pZ0hFNzXdE2M", 155 | "colab_type": "code", 156 | "outputId": "20555aeb-98c4-48f3-be8c-cb8964443ae9", 157 | "colab": { 158 | "base_uri": "https://localhost:8080/", 159 | "height": 85 160 | } 161 | }, 162 | "source": [ 163 | "var langs = [String]()\n", 164 | "\n", 165 | "langs.append(\"Python\")\n", 166 | "langs.append(\"Csharp\")\n", 167 | "langs.append(\"Buisct\") //not sure if that exists \n", 168 | "langs" 169 | ], 170 | "execution_count": 4, 171 | "outputs": [ 172 | { 173 | "output_type": "execute_result", 174 | "data": { 175 | "text/plain": [ 176 | "▿ 3 elements\n", 177 | " - 0 : \"Python\"\n", 178 | " - 1 : \"Csharp\"\n", 179 | " - 2 : \"Buisct\"\n" 180 | ] 181 | }, 182 | "metadata": { 183 | "tags": [] 184 | }, 185 | "execution_count": 4 186 | } 187 | ] 188 | }, 189 | { 190 | "cell_type": "code", 191 | "metadata": { 192 | "id": "5anS2uUesaiV", 193 | "colab_type": "code", 194 | "outputId": "e7788e68-de07-4f10-9123-b738afaa1761", 195 | "colab": { 196 | "base_uri": "https://localhost:8080/", 197 | "height": 136 198 | } 199 | }, 200 | "source": [ 201 | "var gpaStudent = [String:Float]()\n", 202 | "\n", 203 | "gpaStudent[\"Zaid\"] = 3.8\n", 204 | "gpaStudent[\"Zyan\"] = 3.9\n", 205 | "gpaStudent" 206 | ], 207 | "execution_count": 5, 208 | "outputs": [ 209 | { 210 | "output_type": "execute_result", 211 | "data": { 212 | "text/plain": [ 213 | "▿ 2 elements\n", 214 | " ▿ 0 : 2 elements\n", 215 | " - key : \"Zyan\"\n", 216 | " - value : 3.9\n", 217 | " ▿ 1 : 2 elements\n", 218 | " - key : \"Zaid\"\n", 219 | " - value : 3.8\n" 220 | ] 221 | }, 222 | "metadata": { 223 | "tags": [] 224 | }, 225 | "execution_count": 5 226 | } 227 | ] 228 | }, 229 | { 230 | "cell_type": "markdown", 231 | "metadata": { 232 | "id": "IcyJIWOqdE2T", 233 | "colab_type": "text" 234 | }, 235 | "source": [ 236 | "## Loops" 237 | ] 238 | }, 239 | { 240 | "cell_type": "code", 241 | "metadata": { 242 | "id": "QhcmCbQydE2U", 243 | "colab_type": "code", 244 | "outputId": "cb692d1a-9779-44a4-a858-aeeea5526455", 245 | "colab": { 246 | "base_uri": "https://localhost:8080/", 247 | "height": 51 248 | } 249 | }, 250 | "source": [ 251 | "let numbers = [1, 2, 3, 4]\n", 252 | "\n", 253 | "for x in numbers {\n", 254 | " if x > 2{\n", 255 | " print(\"\\(x) > 2\")\n", 256 | " }\n", 257 | "}" 258 | ], 259 | "execution_count": 6, 260 | "outputs": [ 261 | { 262 | "output_type": "stream", 263 | "text": [ 264 | "3 > 2\r\n", 265 | "4 > 2\r\n" 266 | ], 267 | "name": "stdout" 268 | } 269 | ] 270 | }, 271 | { 272 | "cell_type": "code", 273 | "metadata": { 274 | "id": "tt54-NuJdE2m", 275 | "colab_type": "code", 276 | "outputId": "c9e52bea-f3b2-42cd-c410-7ac4677b282c", 277 | "colab": { 278 | "base_uri": "https://localhost:8080/", 279 | "height": 34 280 | } 281 | }, 282 | "source": [ 283 | "var n = 2\n", 284 | "while n < 100 {\n", 285 | " n = n * 2\n", 286 | "}\n", 287 | "\n", 288 | "n" 289 | ], 290 | "execution_count": 7, 291 | "outputs": [ 292 | { 293 | "output_type": "execute_result", 294 | "data": { 295 | "text/plain": [ 296 | "128\n" 297 | ] 298 | }, 299 | "metadata": { 300 | "tags": [] 301 | }, 302 | "execution_count": 7 303 | } 304 | ] 305 | }, 306 | { 307 | "cell_type": "code", 308 | "metadata": { 309 | "id": "LKkJ4co_dE2r", 310 | "colab_type": "code", 311 | "outputId": "95e24ea1-e57d-4931-842d-c4fefdf8697f", 312 | "colab": { 313 | "base_uri": "https://localhost:8080/", 314 | "height": 34 315 | } 316 | }, 317 | "source": [ 318 | "var total = 0\n", 319 | "for i in 0...4 {\n", 320 | " total += i\n", 321 | "}\n", 322 | "\n", 323 | "total" 324 | ], 325 | "execution_count": 8, 326 | "outputs": [ 327 | { 328 | "output_type": "execute_result", 329 | "data": { 330 | "text/plain": [ 331 | "10\n" 332 | ] 333 | }, 334 | "metadata": { 335 | "tags": [] 336 | }, 337 | "execution_count": 8 338 | } 339 | ] 340 | }, 341 | { 342 | "cell_type": "markdown", 343 | "metadata": { 344 | "id": "W7H3ptGaiEcB", 345 | "colab_type": "text" 346 | }, 347 | "source": [ 348 | "## Functions\n", 349 | "\n", 350 | "Here we define a function that adds two integers. By using _ we don't have to use the variable names for function calls " 351 | ] 352 | }, 353 | { 354 | "cell_type": "code", 355 | "metadata": { 356 | "id": "sgYex6gigH87", 357 | "colab_type": "code", 358 | "outputId": "a4da5729-fdea-431e-855e-142e09ebf4ed", 359 | "colab": { 360 | "base_uri": "https://localhost:8080/", 361 | "height": 34 362 | } 363 | }, 364 | "source": [ 365 | "func add(_ x: Int , _ y: Int) -> Int{\n", 366 | " return x + y\n", 367 | "}\n", 368 | "print(add(2, 3))" 369 | ], 370 | "execution_count": 9, 371 | "outputs": [ 372 | { 373 | "output_type": "stream", 374 | "text": [ 375 | "5\r\n" 376 | ], 377 | "name": "stdout" 378 | } 379 | ] 380 | }, 381 | { 382 | "cell_type": "markdown", 383 | "metadata": { 384 | "id": "aAdSAMNmHGP-", 385 | "colab_type": "text" 386 | }, 387 | "source": [ 388 | "You can also add labels to add make the function call more expressive " 389 | ] 390 | }, 391 | { 392 | "cell_type": "code", 393 | "metadata": { 394 | "id": "_GmR2pwxHNGq", 395 | "colab_type": "code", 396 | "outputId": "cb103108-5fb5-4c6a-a255-c327cd47729e", 397 | "colab": { 398 | "base_uri": "https://localhost:8080/", 399 | "height": 102 400 | } 401 | }, 402 | "source": [ 403 | "func range(from start:Int , to end:Int) -> [Int]{\n", 404 | " var out = [Int]()\n", 405 | " \n", 406 | " for num in start...end{\n", 407 | " out.append(num)\n", 408 | " }\n", 409 | " return out\n", 410 | "}\n", 411 | "\n", 412 | "range(from:2, to:5)" 413 | ], 414 | "execution_count": 10, 415 | "outputs": [ 416 | { 417 | "output_type": "execute_result", 418 | "data": { 419 | "text/plain": [ 420 | "▿ 4 elements\n", 421 | " - 0 : 2\n", 422 | " - 1 : 3\n", 423 | " - 2 : 4\n", 424 | " - 3 : 5\n" 425 | ] 426 | }, 427 | "metadata": { 428 | "tags": [] 429 | }, 430 | "execution_count": 10 431 | } 432 | ] 433 | }, 434 | { 435 | "cell_type": "markdown", 436 | "metadata": { 437 | "id": "pifd8IZzH4mg", 438 | "colab_type": "text" 439 | }, 440 | "source": [ 441 | "You can also return many multiple values from a function" 442 | ] 443 | }, 444 | { 445 | "cell_type": "code", 446 | "metadata": { 447 | "id": "wuDe6FtwXP58", 448 | "colab_type": "code", 449 | "colab": {} 450 | }, 451 | "source": [ 452 | "func mean_variance(scores: [Double]) -> (mean: Double, variance: Double){\n", 453 | " \n", 454 | " var mean: Double = 0\n", 455 | " var variance: Double = 0\n", 456 | " let count: Double = Double(scores.count)\n", 457 | " \n", 458 | " for x in scores{\n", 459 | " mean += (x/count)\n", 460 | " }\n", 461 | " \n", 462 | " for x in scores{\n", 463 | " variance += (x - mean)*(x - mean)/count\n", 464 | " }\n", 465 | " \n", 466 | " return (mean, variance)\n", 467 | "}" 468 | ], 469 | "execution_count": 0, 470 | "outputs": [] 471 | }, 472 | { 473 | "cell_type": "code", 474 | "metadata": { 475 | "id": "cgCxSLrBaBtV", 476 | "colab_type": "code", 477 | "outputId": "053571d1-1f63-462c-900a-62d9fedf1be2", 478 | "colab": { 479 | "base_uri": "https://localhost:8080/", 480 | "height": 68 481 | } 482 | }, 483 | "source": [ 484 | "mean_variance(scores: [2.0 , 3.0 , 4.0])" 485 | ], 486 | "execution_count": 12, 487 | "outputs": [ 488 | { 489 | "output_type": "execute_result", 490 | "data": { 491 | "text/plain": [ 492 | "▿ 2 elements\n", 493 | " - mean : 3.0\n", 494 | " - variance : 0.6666666666666666\n" 495 | ] 496 | }, 497 | "metadata": { 498 | "tags": [] 499 | }, 500 | "execution_count": 12 501 | } 502 | ] 503 | }, 504 | { 505 | "cell_type": "markdown", 506 | "metadata": { 507 | "id": "lLPjckUyOcFk", 508 | "colab_type": "text" 509 | }, 510 | "source": [ 511 | "Use `inout` to update the value of a variable and use `&` to pass by reference " 512 | ] 513 | }, 514 | { 515 | "cell_type": "code", 516 | "metadata": { 517 | "id": "jF9jqUjxObp7", 518 | "colab_type": "code", 519 | "outputId": "4a0b0760-f1ee-41c4-ab6d-79aa663749c4", 520 | "colab": { 521 | "base_uri": "https://localhost:8080/", 522 | "height": 34 523 | } 524 | }, 525 | "source": [ 526 | "func increment(_ x:inout Int){\n", 527 | " x = x + 1\n", 528 | "}\n", 529 | "\n", 530 | "var x:Int = 0\n", 531 | "increment(&x)\n", 532 | "\n", 533 | "print(x)" 534 | ], 535 | "execution_count": 13, 536 | "outputs": [ 537 | { 538 | "output_type": "stream", 539 | "text": [ 540 | "1\r\n" 541 | ], 542 | "name": "stdout" 543 | } 544 | ] 545 | }, 546 | { 547 | "cell_type": "markdown", 548 | "metadata": { 549 | "id": "BfV1d5HpdE3K", 550 | "colab_type": "text" 551 | }, 552 | "source": [ 553 | "## Classes\n" 554 | ] 555 | }, 556 | { 557 | "cell_type": "code", 558 | "metadata": { 559 | "id": "mzyk2iV7atrl", 560 | "colab_type": "code", 561 | "colab": {} 562 | }, 563 | "source": [ 564 | "class Student {\n", 565 | " var name: String = \"\"\n", 566 | " var age : Int = 0 \n", 567 | " \n", 568 | " init(name: String, age: Int){\n", 569 | " self.name = name\n", 570 | " self.age = age \n", 571 | " }\n", 572 | "}" 573 | ], 574 | "execution_count": 0, 575 | "outputs": [] 576 | }, 577 | { 578 | "cell_type": "code", 579 | "metadata": { 580 | "id": "0N8uUPD1bMBo", 581 | "colab_type": "code", 582 | "outputId": "7aef63e9-e8db-4810-b9e9-1aaf1ccff2d2", 583 | "colab": { 584 | "base_uri": "https://localhost:8080/", 585 | "height": 34 586 | } 587 | }, 588 | "source": [ 589 | "let person = Student(name:\"Zaid\", age: 3)\n", 590 | "print(person.name)" 591 | ], 592 | "execution_count": 15, 593 | "outputs": [ 594 | { 595 | "output_type": "stream", 596 | "text": [ 597 | "Zaid\r\n" 598 | ], 599 | "name": "stdout" 600 | } 601 | ] 602 | }, 603 | { 604 | "cell_type": "markdown", 605 | "metadata": { 606 | "id": "2dHlqpeQSfvX", 607 | "colab_type": "text" 608 | }, 609 | "source": [ 610 | "## Protocols\n", 611 | "\n", 612 | "Protocols are just like interfaces where you can extend them using a class" 613 | ] 614 | }, 615 | { 616 | "cell_type": "code", 617 | "metadata": { 618 | "id": "T419e6qcTpYZ", 619 | "colab_type": "code", 620 | "colab": {} 621 | }, 622 | "source": [ 623 | "protocol Person{\n", 624 | " func getWage()-> Int\n", 625 | "}" 626 | ], 627 | "execution_count": 0, 628 | "outputs": [] 629 | }, 630 | { 631 | "cell_type": "markdown", 632 | "metadata": { 633 | "id": "ItBzguGBUpv1", 634 | "colab_type": "text" 635 | }, 636 | "source": [ 637 | "Any function that extends the protcol must implement the rules of the protocol" 638 | ] 639 | }, 640 | { 641 | "cell_type": "code", 642 | "metadata": { 643 | "id": "Acn4N3MAT6Se", 644 | "colab_type": "code", 645 | "colab": {} 646 | }, 647 | "source": [ 648 | "class Worker:Person {\n", 649 | " var name: String = \"\"\n", 650 | " var age : Int = 0 \n", 651 | " \n", 652 | " init(name: String, age: Int){\n", 653 | " self.name = name\n", 654 | " self.age = age \n", 655 | " }\n", 656 | " \n", 657 | " func getWage() -> Int{\n", 658 | " return self.age * 10\n", 659 | " }\n", 660 | "}" 661 | ], 662 | "execution_count": 0, 663 | "outputs": [] 664 | }, 665 | { 666 | "cell_type": "code", 667 | "metadata": { 668 | "id": "Sb_SZiplUO6N", 669 | "colab_type": "code", 670 | "outputId": "b2bf8ee9-dfb0-4e4f-adf3-163275c2b289", 671 | "colab": { 672 | "base_uri": "https://localhost:8080/", 673 | "height": 34 674 | } 675 | }, 676 | "source": [ 677 | "let p = Worker(name:\"Zaid\", age: 3)\n", 678 | "p.getWage()" 679 | ], 680 | "execution_count": 18, 681 | "outputs": [ 682 | { 683 | "output_type": "execute_result", 684 | "data": { 685 | "text/plain": [ 686 | "30\n" 687 | ] 688 | }, 689 | "metadata": { 690 | "tags": [] 691 | }, 692 | "execution_count": 18 693 | } 694 | ] 695 | }, 696 | { 697 | "cell_type": "markdown", 698 | "metadata": { 699 | "id": "OuMb_W7SrPXT", 700 | "colab_type": "text" 701 | }, 702 | "source": [ 703 | "## Structs and Extensions " 704 | ] 705 | }, 706 | { 707 | "cell_type": "code", 708 | "metadata": { 709 | "id": "0fPJQwSArYCI", 710 | "colab_type": "code", 711 | "outputId": "256c8801-7cfe-4d8c-995c-6c0b28b411bb", 712 | "colab": { 713 | "base_uri": "https://localhost:8080/", 714 | "height": 85 715 | } 716 | }, 717 | "source": [ 718 | "struct Complex{\n", 719 | " var real:Float\n", 720 | " var imag:Float\n", 721 | "}\n", 722 | "\n", 723 | "Complex(real:3 , imag: 2)" 724 | ], 725 | "execution_count": 19, 726 | "outputs": [ 727 | { 728 | "output_type": "execute_result", 729 | "data": { 730 | "text/plain": [ 731 | "expression produced error: error: /tmp/expr178-0f0ece..swift:1:65: error: use of undeclared type '__lldb_expr_171'\n", 732 | "Swift._DebuggerSupport.stringForPrintObject(Swift.UnsafePointer<__lldb_expr_171.Complex>(bitPattern: 0x7f747ea34a20)!.pointee)\n", 733 | " ^~~~~~~~~~~~~~~\n", 734 | "\n" 735 | ] 736 | }, 737 | "metadata": { 738 | "tags": [] 739 | }, 740 | "execution_count": 19 741 | } 742 | ] 743 | }, 744 | { 745 | "cell_type": "markdown", 746 | "metadata": { 747 | "id": "IAEOl7xkvVc-", 748 | "colab_type": "text" 749 | }, 750 | "source": [ 751 | "You can also extend struct properties" 752 | ] 753 | }, 754 | { 755 | "cell_type": "code", 756 | "metadata": { 757 | "id": "ZvztduYtrrcG", 758 | "colab_type": "code", 759 | "outputId": "7deefb28-6308-481c-a2fa-828d4164afc2", 760 | "colab": { 761 | "base_uri": "https://localhost:8080/", 762 | "height": 34 763 | } 764 | }, 765 | "source": [ 766 | "extension Complex{\n", 767 | " func getReal() -> Float{\n", 768 | " return real\n", 769 | " }\n", 770 | "}\n", 771 | "\n", 772 | "var a = Complex(real:3 , imag: 2)\n", 773 | "print(a.getReal())" 774 | ], 775 | "execution_count": 20, 776 | "outputs": [ 777 | { 778 | "output_type": "stream", 779 | "text": [ 780 | "3.0\r\n" 781 | ], 782 | "name": "stdout" 783 | } 784 | ] 785 | }, 786 | { 787 | "cell_type": "markdown", 788 | "metadata": { 789 | "id": "2trelwkSU5j3", 790 | "colab_type": "text" 791 | }, 792 | "source": [ 793 | "## Closures \n", 794 | "\n", 795 | "According to Swift documentation \"*Closures are self-contained blocks of functionality that can be passed around and used in your code*\". \n", 796 | "Let us create a closure where we square an integer input" 797 | ] 798 | }, 799 | { 800 | "cell_type": "code", 801 | "metadata": { 802 | "id": "3WIjqV_HYWlw", 803 | "colab_type": "code", 804 | "outputId": "38bcdaae-9d74-4291-b17d-ed0c32056db3", 805 | "colab": { 806 | "base_uri": "https://localhost:8080/", 807 | "height": 34 808 | } 809 | }, 810 | "source": [ 811 | "var squareClosure = {\n", 812 | " (num:Int) -> Int in \n", 813 | " return num*num\n", 814 | "}\n", 815 | "\n", 816 | "squareClosure(2)" 817 | ], 818 | "execution_count": 21, 819 | "outputs": [ 820 | { 821 | "output_type": "execute_result", 822 | "data": { 823 | "text/plain": [ 824 | "4\n" 825 | ] 826 | }, 827 | "metadata": { 828 | "tags": [] 829 | }, 830 | "execution_count": 21 831 | } 832 | ] 833 | }, 834 | { 835 | "cell_type": "markdown", 836 | "metadata": { 837 | "id": "BrqDWuebavjX", 838 | "colab_type": "text" 839 | }, 840 | "source": [ 841 | "Closures can be used as inputs to functions" 842 | ] 843 | }, 844 | { 845 | "cell_type": "code", 846 | "metadata": { 847 | "id": "kwGSDYAHayUY", 848 | "colab_type": "code", 849 | "outputId": "e251bf65-8a26-4c12-8c47-f9d661ac3a17", 850 | "colab": { 851 | "base_uri": "https://localhost:8080/", 852 | "height": 85 853 | } 854 | }, 855 | "source": [ 856 | "func squareNumbers(numbers:[Int], closure:(_ num:Int) -> Int) -> [Int]{\n", 857 | " \n", 858 | " var result = [Int]()\n", 859 | " \n", 860 | " for num in numbers{\n", 861 | " result.append(closure(num))\n", 862 | " }\n", 863 | " \n", 864 | " return result\n", 865 | "}\n", 866 | "\n", 867 | "squareNumbers(numbers:[2, 3, 4], closure:squareClosure)" 868 | ], 869 | "execution_count": 22, 870 | "outputs": [ 871 | { 872 | "output_type": "execute_result", 873 | "data": { 874 | "text/plain": [ 875 | "▿ 3 elements\n", 876 | " - 0 : 4\n", 877 | " - 1 : 9\n", 878 | " - 2 : 16\n" 879 | ] 880 | }, 881 | "metadata": { 882 | "tags": [] 883 | }, 884 | "execution_count": 22 885 | } 886 | ] 887 | }, 888 | { 889 | "cell_type": "markdown", 890 | "metadata": { 891 | "id": "TwVeTx3pL1y5", 892 | "colab_type": "text" 893 | }, 894 | "source": [ 895 | "`map` accepts closures and applies the closure to a sequence of elements " 896 | ] 897 | }, 898 | { 899 | "cell_type": "code", 900 | "metadata": { 901 | "id": "llJzEDAcLXRN", 902 | "colab_type": "code", 903 | "outputId": "c7ff502b-c424-459c-f16f-eada31f246d6", 904 | "colab": { 905 | "base_uri": "https://localhost:8080/", 906 | "height": 102 907 | } 908 | }, 909 | "source": [ 910 | "var numbers = [1, 2, 3, 4]\n", 911 | "\n", 912 | "numbers.map({(num:Int) in \n", 913 | " return num * num \n", 914 | "})" 915 | ], 916 | "execution_count": 23, 917 | "outputs": [ 918 | { 919 | "output_type": "execute_result", 920 | "data": { 921 | "text/plain": [ 922 | "▿ 4 elements\n", 923 | " - 0 : 1\n", 924 | " - 1 : 4\n", 925 | " - 2 : 9\n", 926 | " - 3 : 16\n" 927 | ] 928 | }, 929 | "metadata": { 930 | "tags": [] 931 | }, 932 | "execution_count": 23 933 | } 934 | ] 935 | }, 936 | { 937 | "cell_type": "markdown", 938 | "metadata": { 939 | "id": "2dXDTcVgM0aj", 940 | "colab_type": "text" 941 | }, 942 | "source": [ 943 | "## Operator Overloading" 944 | ] 945 | }, 946 | { 947 | "cell_type": "code", 948 | "metadata": { 949 | "id": "3r_t9dTRM3WA", 950 | "colab_type": "code", 951 | "outputId": "b0388719-bf17-4c25-914f-1eeeea2289af", 952 | "colab": { 953 | "base_uri": "https://localhost:8080/", 954 | "height": 51 955 | } 956 | }, 957 | "source": [ 958 | "struct Vector2D {\n", 959 | " var x = 0.0, y = 0.0\n", 960 | "}\n", 961 | "\n", 962 | "extension Vector2D {\n", 963 | " static func +(left: Vector2D, right: Vector2D) -> Vector2D {\n", 964 | " return Vector2D(x: left.x + right.x, y: left.y + right.y)\n", 965 | " }\n", 966 | " \n", 967 | " static prefix func -(arg: Vector2D) -> Vector2D{\n", 968 | " return Vector2D(x: -arg.x, y: -arg.y)\n", 969 | " }\n", 970 | "}\n", 971 | "\n", 972 | "var w = Vector2D(x:1.0, y:1.5)\n", 973 | "var z = Vector2D(x:1.2, y:4.0)\n", 974 | "\n", 975 | "print(-w)\n", 976 | "print(w + z)" 977 | ], 978 | "execution_count": 24, 979 | "outputs": [ 980 | { 981 | "output_type": "stream", 982 | "text": [ 983 | "Vector2D(x: -1.0, y: -1.5)\r\n", 984 | "Vector2D(x: 2.2, y: 5.5)\r\n" 985 | ], 986 | "name": "stdout" 987 | } 988 | ] 989 | }, 990 | { 991 | "cell_type": "markdown", 992 | "metadata": { 993 | "id": "BCpWt8IYJbPi", 994 | "colab_type": "text" 995 | }, 996 | "source": [ 997 | "## Generics\n", 998 | "\n", 999 | "Generics are used to construct generic types. Use `<>` to represent a generic type " 1000 | ] 1001 | }, 1002 | { 1003 | "cell_type": "code", 1004 | "metadata": { 1005 | "id": "hzqlVzFeJizO", 1006 | "colab_type": "code", 1007 | "outputId": "4713d5f1-e2b2-4125-a2ad-b4f834351d69", 1008 | "colab": { 1009 | "base_uri": "https://localhost:8080/", 1010 | "height": 187 1011 | } 1012 | }, 1013 | "source": [ 1014 | "//convert a list of generic type to a dictionary of generic type\n", 1015 | "func makeDict(_ array: [T]) -> [T:T] {\n", 1016 | " var out = [T:T]()\n", 1017 | " \n", 1018 | " \n", 1019 | " for a in array{\n", 1020 | " out[a] = a\n", 1021 | " }\n", 1022 | " return out\n", 1023 | "}\n", 1024 | "\n", 1025 | "makeDict([2, 3, 4])" 1026 | ], 1027 | "execution_count": 25, 1028 | "outputs": [ 1029 | { 1030 | "output_type": "execute_result", 1031 | "data": { 1032 | "text/plain": [ 1033 | "▿ 3 elements\n", 1034 | " ▿ 0 : 2 elements\n", 1035 | " - key : 4\n", 1036 | " - value : 4\n", 1037 | " ▿ 1 : 2 elements\n", 1038 | " - key : 2\n", 1039 | " - value : 2\n", 1040 | " ▿ 2 : 2 elements\n", 1041 | " - key : 3\n", 1042 | " - value : 3\n" 1043 | ] 1044 | }, 1045 | "metadata": { 1046 | "tags": [] 1047 | }, 1048 | "execution_count": 25 1049 | } 1050 | ] 1051 | }, 1052 | { 1053 | "cell_type": "markdown", 1054 | "metadata": { 1055 | "id": "ifoYXlSLc9np", 1056 | "colab_type": "text" 1057 | }, 1058 | "source": [ 1059 | "## Python Integeration\n", 1060 | "\n", 1061 | "It is easy to call python modules in Swift" 1062 | ] 1063 | }, 1064 | { 1065 | "cell_type": "code", 1066 | "metadata": { 1067 | "id": "GKS7nCmcb1Bo", 1068 | "colab_type": "code", 1069 | "colab": {} 1070 | }, 1071 | "source": [ 1072 | "import Python\n", 1073 | "let np = Python.import(\"numpy\")" 1074 | ], 1075 | "execution_count": 0, 1076 | "outputs": [] 1077 | }, 1078 | { 1079 | "cell_type": "code", 1080 | "metadata": { 1081 | "id": "8RHA4_u6dc9S", 1082 | "colab_type": "code", 1083 | "outputId": "32b97321-b58c-465c-b5e3-d07ba9808b44", 1084 | "colab": { 1085 | "base_uri": "https://localhost:8080/", 1086 | "height": 34 1087 | } 1088 | }, 1089 | "source": [ 1090 | "np.exp(0)" 1091 | ], 1092 | "execution_count": 27, 1093 | "outputs": [ 1094 | { 1095 | "output_type": "execute_result", 1096 | "data": { 1097 | "text/plain": [ 1098 | "1.0\n" 1099 | ] 1100 | }, 1101 | "metadata": { 1102 | "tags": [] 1103 | }, 1104 | "execution_count": 27 1105 | } 1106 | ] 1107 | }, 1108 | { 1109 | "cell_type": "markdown", 1110 | "metadata": { 1111 | "id": "WK9y9eKfaab6", 1112 | "colab_type": "text" 1113 | }, 1114 | "source": [ 1115 | "## Differentiation\n", 1116 | "\n", 1117 | "We can easily define a differentiable function by using `@differentiable`" 1118 | ] 1119 | }, 1120 | { 1121 | "cell_type": "code", 1122 | "metadata": { 1123 | "id": "N1zx_B_VaeRd", 1124 | "colab_type": "code", 1125 | "colab": {} 1126 | }, 1127 | "source": [ 1128 | "@differentiable\n", 1129 | "func frac(_ x:Double) -> Double{\n", 1130 | " return 1/x\n", 1131 | "}" 1132 | ], 1133 | "execution_count": 0, 1134 | "outputs": [] 1135 | }, 1136 | { 1137 | "cell_type": "code", 1138 | "metadata": { 1139 | "id": "E4jvO7Rratfh", 1140 | "colab_type": "code", 1141 | "outputId": "75a9d6fa-81e2-4ddc-fa92-962f9084dec6", 1142 | "colab": { 1143 | "base_uri": "https://localhost:8080/", 1144 | "height": 34 1145 | } 1146 | }, 1147 | "source": [ 1148 | "gradient(at:0.5) {x in frac(x)}" 1149 | ], 1150 | "execution_count": 29, 1151 | "outputs": [ 1152 | { 1153 | "output_type": "execute_result", 1154 | "data": { 1155 | "text/plain": [ 1156 | "-4.0\n" 1157 | ] 1158 | }, 1159 | "metadata": { 1160 | "tags": [] 1161 | }, 1162 | "execution_count": 29 1163 | } 1164 | ] 1165 | }, 1166 | { 1167 | "cell_type": "markdown", 1168 | "metadata": { 1169 | "id": "DIg0cI_yvaCJ", 1170 | "colab_type": "text" 1171 | }, 1172 | "source": [ 1173 | "# TenosrFlow" 1174 | ] 1175 | }, 1176 | { 1177 | "cell_type": "code", 1178 | "metadata": { 1179 | "id": "YmV1Nk_Nvd2g", 1180 | "colab_type": "code", 1181 | "colab": {} 1182 | }, 1183 | "source": [ 1184 | "import TensorFlow" 1185 | ], 1186 | "execution_count": 0, 1187 | "outputs": [] 1188 | }, 1189 | { 1190 | "cell_type": "markdown", 1191 | "metadata": { 1192 | "id": "y_n538Im0_bY", 1193 | "colab_type": "text" 1194 | }, 1195 | "source": [ 1196 | "## Neural Network (NN)\n", 1197 | "\n", 1198 | "We create a simple XOR classifier example using NN" 1199 | ] 1200 | }, 1201 | { 1202 | "cell_type": "markdown", 1203 | "metadata": { 1204 | "id": "p8GpL0gRlZUY", 1205 | "colab_type": "text" 1206 | }, 1207 | "source": [ 1208 | "### Tensors" 1209 | ] 1210 | }, 1211 | { 1212 | "cell_type": "code", 1213 | "metadata": { 1214 | "id": "w7Nq3qUzmLXc", 1215 | "colab_type": "code", 1216 | "colab": {} 1217 | }, 1218 | "source": [ 1219 | "var X: Tensor = [[0.0, 0.0], [1.0, 0.0], [0.0, 1.0], [1.0, 1.0]]\n", 1220 | "var y: Tensor = [0, 1, 1, 0]" 1221 | ], 1222 | "execution_count": 0, 1223 | "outputs": [] 1224 | }, 1225 | { 1226 | "cell_type": "markdown", 1227 | "metadata": { 1228 | "id": "W2sICW4PlbsG", 1229 | "colab_type": "text" 1230 | }, 1231 | "source": [ 1232 | "### Model\n", 1233 | "\n", 1234 | "Create a nerual network with one hidden layer" 1235 | ] 1236 | }, 1237 | { 1238 | "cell_type": "code", 1239 | "metadata": { 1240 | "id": "Wk4fHfPun9MS", 1241 | "colab_type": "code", 1242 | "colab": {} 1243 | }, 1244 | "source": [ 1245 | "let hiddenSize: Int = 10\n", 1246 | "\n", 1247 | "struct NN: Layer {\n", 1248 | " var layer1 = Dense(inputSize: 2, outputSize: hiddenSize, activation: relu)\n", 1249 | " var layer2 = Dense(inputSize: hiddenSize, outputSize: 2)\n", 1250 | " \n", 1251 | " @differentiable\n", 1252 | " func call(_ input: Tensor) -> Tensor {\n", 1253 | " return input.sequenced(through: layer1, layer2)\n", 1254 | " }\n", 1255 | "}" 1256 | ], 1257 | "execution_count": 0, 1258 | "outputs": [] 1259 | }, 1260 | { 1261 | "cell_type": "code", 1262 | "metadata": { 1263 | "id": "Qx5fu_JfpPpz", 1264 | "colab_type": "code", 1265 | "colab": {} 1266 | }, 1267 | "source": [ 1268 | "var model = NN()\n", 1269 | "let optimizer = SGD(for: model)" 1270 | ], 1271 | "execution_count": 0, 1272 | "outputs": [] 1273 | }, 1274 | { 1275 | "cell_type": "markdown", 1276 | "metadata": { 1277 | "id": "4t1JAQf8ldme", 1278 | "colab_type": "text" 1279 | }, 1280 | "source": [ 1281 | "### Training" 1282 | ] 1283 | }, 1284 | { 1285 | "cell_type": "code", 1286 | "metadata": { 1287 | "id": "e9zlOYUzpBt6", 1288 | "colab_type": "code", 1289 | "outputId": "3692e0c2-be66-482c-ad1a-0acebd4b75ea", 1290 | "colab": { 1291 | "base_uri": "https://localhost:8080/", 1292 | "height": 204 1293 | } 1294 | }, 1295 | "source": [ 1296 | "for i in 0...1000 {\n", 1297 | " \n", 1298 | " //calculate the loss and gradient\n", 1299 | " let (loss, grads) = valueWithGradient(at: model) { model -> Tensor in\n", 1300 | " let logits = model(X)\n", 1301 | " return softmaxCrossEntropy(logits: logits, labels: y)\n", 1302 | " }\n", 1303 | "\n", 1304 | " //make an optimizer step \n", 1305 | " optimizer.update(&model.allDifferentiableVariables, along: grads)\n", 1306 | "\n", 1307 | " if i % 100 == 0 {\n", 1308 | " print(\"epoch \\(i) train_loss: \\(loss)\")\n", 1309 | " }\n", 1310 | " \n", 1311 | "}" 1312 | ], 1313 | "execution_count": 35, 1314 | "outputs": [ 1315 | { 1316 | "output_type": "stream", 1317 | "text": [ 1318 | "epoch 0 train_loss: 0.7282258\n", 1319 | "epoch 100 train_loss: 0.68459517\n", 1320 | "epoch 200 train_loss: 0.65157473\n", 1321 | "epoch 300 train_loss: 0.61996853\n", 1322 | "epoch 400 train_loss: 0.5887139\n", 1323 | "epoch 500 train_loss: 0.55819345\n", 1324 | "epoch 600 train_loss: 0.5246029\n", 1325 | "epoch 700 train_loss: 0.48887122\n", 1326 | "epoch 800 train_loss: 0.45471245\n", 1327 | "epoch 900 train_loss: 0.42016685\n", 1328 | "epoch 1000 train_loss: 0.38590562\n" 1329 | ], 1330 | "name": "stdout" 1331 | } 1332 | ] 1333 | }, 1334 | { 1335 | "cell_type": "markdown", 1336 | "metadata": { 1337 | "id": "1M0r-jWelg-4", 1338 | "colab_type": "text" 1339 | }, 1340 | "source": [ 1341 | "### Inference" 1342 | ] 1343 | }, 1344 | { 1345 | "cell_type": "code", 1346 | "metadata": { 1347 | "id": "uuOb9lVrtS-K", 1348 | "colab_type": "code", 1349 | "outputId": "a99a9a66-e7c3-4872-9917-8d40c1e48b15", 1350 | "colab": { 1351 | "base_uri": "https://localhost:8080/", 1352 | "height": 34 1353 | } 1354 | }, 1355 | "source": [ 1356 | "// Apply the model to a batch of features.\n", 1357 | "let pred = model(X)\n", 1358 | "\n", 1359 | "print(pred.argmax(squeezingAxis: 1))" 1360 | ], 1361 | "execution_count": 36, 1362 | "outputs": [ 1363 | { 1364 | "output_type": "stream", 1365 | "text": [ 1366 | "[0, 1, 1, 0]\r\n" 1367 | ], 1368 | "name": "stdout" 1369 | } 1370 | ] 1371 | }, 1372 | { 1373 | "cell_type": "markdown", 1374 | "metadata": { 1375 | "id": "Snub2EZdCKKb", 1376 | "colab_type": "text" 1377 | }, 1378 | "source": [ 1379 | "# References\n", 1380 | "\n", 1381 | "\n", 1382 | "\n", 1383 | "* https://github.com/tensorflow/swift/blob/master/docs/WhySwiftForTensorFlow.md\n", 1384 | "* https://www.tensorflow.org/swift\n", 1385 | "* https://www.tensorflow.org/swift/tutorials/model_training_walkthrough\n", 1386 | "\n" 1387 | ] 1388 | } 1389 | ] 1390 | } -------------------------------------------------------------------------------- /Swift4TF_MNIST.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "Swift4TF_MNIST.ipynb", 7 | "version": "0.3.2", 8 | "provenance": [], 9 | "collapsed_sections": [] 10 | }, 11 | "kernelspec": { 12 | "display_name": "Swift", 13 | "language": "swift", 14 | "name": "swift" 15 | }, 16 | "accelerator": "GPU" 17 | }, 18 | "cells": [ 19 | { 20 | "cell_type": "code", 21 | "metadata": { 22 | "id": "NuzYtyiH_jxK", 23 | "colab_type": "code", 24 | "colab": {} 25 | }, 26 | "source": [ 27 | "import Foundation\n", 28 | "import TensorFlow\n", 29 | "import Python" 30 | ], 31 | "execution_count": 0, 32 | "outputs": [] 33 | }, 34 | { 35 | "cell_type": "code", 36 | "metadata": { 37 | "id": "AQm7jGRsWgDR", 38 | "colab_type": "code", 39 | "colab": {} 40 | }, 41 | "source": [ 42 | "let subprocess = Python.import(\"subprocess\")" 43 | ], 44 | "execution_count": 0, 45 | "outputs": [] 46 | }, 47 | { 48 | "cell_type": "markdown", 49 | "metadata": { 50 | "id": "FU5Vko57dWnZ", 51 | "colab_type": "text" 52 | }, 53 | "source": [ 54 | "## Download Data and Labels" 55 | ] 56 | }, 57 | { 58 | "cell_type": "code", 59 | "metadata": { 60 | "id": "nU-JcQQabi5O", 61 | "colab_type": "code", 62 | "outputId": "654a7d8c-18f8-4b32-e19f-8e3b5e121c04", 63 | "colab": { 64 | "base_uri": "https://localhost:8080/", 65 | "height": 391 66 | } 67 | }, 68 | "source": [ 69 | "let urllib = Python.import(\"urllib.request\")\n", 70 | "let fileBaseURL = \"https://raw.githubusercontent.com/tensorflow/swift-models/master/Datasets/MNIST/\"\n", 71 | "let files = [\"train-images-idx3-ubyte\", \"train-labels-idx1-ubyte\"]\n", 72 | "\n", 73 | "for file in files {\n", 74 | " let command = \"wget \"+fileBaseURL+file\n", 75 | " //print(fileBaseURL+files[1])\n", 76 | " subprocess.call(command, shell: true)\n", 77 | "}" 78 | ], 79 | "execution_count": 3, 80 | "outputs": [ 81 | { 82 | "output_type": "stream", 83 | "text": [ 84 | "--2019-06-13 15:58:54-- https://raw.githubusercontent.com/tensorflow/swift-models/master/Datasets/MNIST/train-images-idx3-ubyte\n", 85 | "Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.0.133, 151.101.64.133, 151.101.128.133, ...\n", 86 | "Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.0.133|:443... connected.\n", 87 | "HTTP request sent, awaiting response... 200 OK\n", 88 | "Length: 47040016 (45M) [application/octet-stream]\n", 89 | "Saving to: ‘train-images-idx3-ubyte’\n", 90 | "\n", 91 | "train-images-idx3-u 100%[===================>] 44.86M 194MB/s in 0.2s \n", 92 | "\n", 93 | "2019-06-13 15:59:00 (194 MB/s) - ‘train-images-idx3-ubyte’ saved [47040016/47040016]\n", 94 | "\n", 95 | "--2019-06-13 15:59:00-- https://raw.githubusercontent.com/tensorflow/swift-models/master/MNIST/train-labels-idx1-ubyte\n", 96 | "Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.0.133, 151.101.64.133, 151.101.128.133, ...\n", 97 | "Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.0.133|:443... connected.\n", 98 | "HTTP request sent, awaiting response... 200 OK\n", 99 | "Length: 60008 (59K) [application/octet-stream]\n", 100 | "Saving to: ‘train-labels-idx1-ubyte’\n", 101 | "\n", 102 | "train-labels-idx1-u 100%[===================>] 58.60K --.-KB/s in 0.02s \n", 103 | "\n", 104 | "2019-06-13 15:59:00 (2.92 MB/s) - ‘train-labels-idx1-ubyte’ saved [60008/60008]\n", 105 | "\n" 106 | ], 107 | "name": "stdout" 108 | } 109 | ] 110 | }, 111 | { 112 | "cell_type": "markdown", 113 | "metadata": { 114 | "id": "gF303ze8dxXv", 115 | "colab_type": "text" 116 | }, 117 | "source": [ 118 | "## Process Data " 119 | ] 120 | }, 121 | { 122 | "cell_type": "code", 123 | "metadata": { 124 | "id": "dthLi1e191dQ", 125 | "colab_type": "code", 126 | "colab": {} 127 | }, 128 | "source": [ 129 | "var batchSize:Int = 32 \n", 130 | "\n", 131 | "/// Reads a file into an array of bytes.\n", 132 | "func readFile(_ path: String) -> [UInt8] {\n", 133 | " let url = URL(fileURLWithPath: path)\n", 134 | " let data = try! Data(contentsOf: url, options: [])\n", 135 | " return [UInt8](data)\n", 136 | "}\n", 137 | "\n", 138 | "/// Reads MNIST images and labels from specified file paths.\n", 139 | "func readMNIST(imagesFile: String, labelsFile: String) -> (images: Tensor,\n", 140 | " labels: Tensor) {\n", 141 | " print(\"Reading data.\")\n", 142 | " let images = readFile(imagesFile).dropFirst(16).map(Float.init)\n", 143 | " let labels = readFile(labelsFile).dropFirst(8).map(Int32.init)\n", 144 | " let rowCount = Int(labels.count)\n", 145 | " let imageHeight: Int = 28, imageWidth: Int = 28\n", 146 | "\n", 147 | " print(\"Constructing data tensors.\")\n", 148 | " return (\n", 149 | " images: Tensor(shape: [rowCount, 1, imageHeight, imageWidth], scalars: images)\n", 150 | " .transposed(withPermutations: [0, 2, 3, 1]) / 255, // NHWC\n", 151 | " labels: Tensor(labels)\n", 152 | " )\n", 153 | "}\n", 154 | "\n", 155 | "/// Split data into training and test\n", 156 | "func splitTrainTest(data: Tensor, labels: Tensor) -> (Tensor, Tensor, Tensor , Tensor) {\n", 157 | " \n", 158 | " let N = Int(data.shape[0])\n", 159 | " let split = Int(0.8 * Float(N))\n", 160 | " \n", 161 | " let trainX = data[0..(in x: Tensor, at index: Int) -> Tensor {\n", 172 | " let start = Int(index * batchSize)\n", 173 | " return x[start..(trainNumericLabels)\n", 194 | "\n", 195 | "// split into training and testing \n", 196 | "let (trainX, trainY, testX, testY) = splitTrainTest(data: data, labels: labels)" 197 | ], 198 | "execution_count": 5, 199 | "outputs": [ 200 | { 201 | "output_type": "stream", 202 | "text": [ 203 | "Reading data.\n", 204 | "Constructing data tensors.\n" 205 | ], 206 | "name": "stdout" 207 | } 208 | ] 209 | }, 210 | { 211 | "cell_type": "markdown", 212 | "metadata": { 213 | "id": "UgBo0BC7d7bg", 214 | "colab_type": "text" 215 | }, 216 | "source": [ 217 | "## CNN Model" 218 | ] 219 | }, 220 | { 221 | "cell_type": "code", 222 | "metadata": { 223 | "id": "YZ-tLhdlJvc2", 224 | "colab_type": "code", 225 | "colab": {} 226 | }, 227 | "source": [ 228 | "struct CNN: Layer {\n", 229 | " \n", 230 | " typealias Input = Tensor\n", 231 | " typealias Output = Tensor\n", 232 | " \n", 233 | " var conv1 = Conv2D(filterShape: (3, 3, 1, 16), activation: relu) \n", 234 | " var conv2 = Conv2D(filterShape: (3, 3, 16, 32), activation: relu) \n", 235 | " \n", 236 | " var pool = MaxPool2D(poolSize: (2, 2), strides: (2, 2))\n", 237 | " \n", 238 | " var flatten = Flatten()\n", 239 | " \n", 240 | " var dense1 = Dense(inputSize: 5*5*32 , outputSize: 128, activation: tanh)\n", 241 | " var dense2 = Dense(inputSize: 128 , outputSize: 10)\n", 242 | "\n", 243 | " @differentiable\n", 244 | " func callAsFunction(_ input: Input) -> Output {\n", 245 | " let convolved = input.sequenced(through: conv1, pool, conv2, pool)\n", 246 | " return convolved.sequenced(through:flatten, dense1, dense2)\n", 247 | " }\n", 248 | "}" 249 | ], 250 | "execution_count": 0, 251 | "outputs": [] 252 | }, 253 | { 254 | "cell_type": "code", 255 | "metadata": { 256 | "id": "PDES_rECKXTk", 257 | "colab_type": "code", 258 | "colab": {} 259 | }, 260 | "source": [ 261 | "// report accuracy of a batch \n", 262 | "func getAccuracy(y:Tensor, logits:Tensor) -> Float{\n", 263 | " let out = Tensor(logits.argmax(squeezingAxis: 1) .== y).sum().scalarized()\n", 264 | " return Float(out) / Float(y.shape[0])\n", 265 | "}\n", 266 | "\n", 267 | "//round two decimal places \n", 268 | "func roundTwo(_ input:Float) -> Float{\n", 269 | " return (input*100).rounded()/100\n", 270 | "}" 271 | ], 272 | "execution_count": 0, 273 | "outputs": [] 274 | }, 275 | { 276 | "cell_type": "code", 277 | "metadata": { 278 | "id": "gWqvb0u3ZAIg", 279 | "colab_type": "code", 280 | "outputId": "adcdc3f0-0186-4bc2-e8b6-f8532de6a018", 281 | "colab": { 282 | "base_uri": "https://localhost:8080/", 283 | "height": 34 284 | } 285 | }, 286 | "source": [ 287 | "var model = CNN()\n", 288 | "let optimizer = Adam(for: model)\n", 289 | "\n", 290 | "//warmup \n", 291 | "let tensor = Tensor(zeros: [1, 28, 28, 1])\n", 292 | "print(model(tensor))" 293 | ], 294 | "execution_count": 8, 295 | "outputs": [ 296 | { 297 | "output_type": "stream", 298 | "text": [ 299 | "[[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]]\r\n" 300 | ], 301 | "name": "stdout" 302 | } 303 | ] 304 | }, 305 | { 306 | "cell_type": "markdown", 307 | "metadata": { 308 | "id": "lV2RzLtMeBBH", 309 | "colab_type": "text" 310 | }, 311 | "source": [ 312 | "## Training" 313 | ] 314 | }, 315 | { 316 | "cell_type": "code", 317 | "metadata": { 318 | "id": "GzK9FPV3daq5", 319 | "colab_type": "code", 320 | "outputId": "20edcfb2-daf4-429b-eb3a-c586d8fef16d", 321 | "colab": { 322 | "base_uri": "https://localhost:8080/", 323 | "height": 102 324 | } 325 | }, 326 | "source": [ 327 | "let stepsInEpoch:Int = Int(Float(testX.shape[0]) / Float(batchSize))\n", 328 | "var trainLoss:Float = 0.0\n", 329 | "var trainAcc :Float = 0.0\n", 330 | "var testLoss:Float = 0.0\n", 331 | "var testAcc:Float = 0.0 \n", 332 | "\n", 333 | "var batchCount: Float = 0.0\n", 334 | "for epoch in 0...4{\n", 335 | " \n", 336 | " //evaluate metrics\n", 337 | " trainLoss = 0.0\n", 338 | " trainAcc = 0.0\n", 339 | " batchCount = 0.0\n", 340 | " \n", 341 | " for i in 0.. Tensor in\n", 349 | " let logits = model(X)\n", 350 | " return softmaxCrossEntropy(logits: logits, labels: y)\n", 351 | " }\n", 352 | "\n", 353 | " //make an optimizer step \n", 354 | " optimizer.update(&model.allDifferentiableVariables, along: grads) \n", 355 | " \n", 356 | " let logits = model(X) //this is slowing down ? \n", 357 | " let acc = getAccuracy(y:y, logits:logits)\n", 358 | " \n", 359 | " trainLoss += Float(loss.scalarized())\n", 360 | " trainAcc += acc\n", 361 | " batchCount += 1\n", 362 | " }\n", 363 | " \n", 364 | " trainLoss /= batchCount\n", 365 | " trainAcc /= batchCount\n", 366 | " \n", 367 | " //training\n", 368 | " testLoss = 0.0\n", 369 | " testAcc = 0.0\n", 370 | " \n", 371 | " let logits = model(testX)\n", 372 | " let loss = softmaxCrossEntropy(logits: logits, labels: testY)\n", 373 | " let acc = getAccuracy(y:testY, logits:logits)\n", 374 | "\n", 375 | " testLoss += Float(loss.scalarized())\n", 376 | " testAcc += acc\n", 377 | " print(\"epoch: \\(epoch+1), train_loss: \\(roundTwo(trainLoss)), test_loss: \\(roundTwo(testLoss)), train_acc: \\(roundTwo(trainAcc)), test_acc: \\(roundTwo(testAcc))\" )\n", 378 | "}" 379 | ], 380 | "execution_count": 10, 381 | "outputs": [ 382 | { 383 | "output_type": "stream", 384 | "text": [ 385 | "epoch: 1, train_loss: 0.35, test_loss: 0.16, train_acc: 0.92, test_acc: 0.95\n", 386 | "epoch: 2, train_loss: 0.1, test_loss: 0.12, train_acc: 0.97, test_acc: 0.96\n", 387 | "epoch: 3, train_loss: 0.06, test_loss: 0.09, train_acc: 0.99, test_acc: 0.97\n", 388 | "epoch: 4, train_loss: 0.04, test_loss: 0.08, train_acc: 0.99, test_acc: 0.98\n", 389 | "epoch: 5, train_loss: 0.03, test_loss: 0.07, train_acc: 1.0, test_acc: 0.98\n" 390 | ], 391 | "name": "stdout" 392 | } 393 | ] 394 | }, 395 | { 396 | "cell_type": "markdown", 397 | "metadata": { 398 | "id": "O5UpckxEsqNO", 399 | "colab_type": "text" 400 | }, 401 | "source": [ 402 | "License https://github.com/tensorflow/swift-models/blob/stable/LICENSE" 403 | ] 404 | } 405 | ] 406 | } 407 | -------------------------------------------------------------------------------- /Swift4TF_TransferLearning.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "Swift4TF_TransferLearning.ipynb", 7 | "version": "0.3.2", 8 | "provenance": [], 9 | "collapsed_sections": [], 10 | "include_colab_link": true 11 | }, 12 | "kernelspec": { 13 | "name": "swift", 14 | "display_name": "Swift" 15 | }, 16 | "accelerator": "GPU" 17 | }, 18 | "cells": [ 19 | { 20 | "cell_type": "markdown", 21 | "metadata": { 22 | "id": "view-in-github", 23 | "colab_type": "text" 24 | }, 25 | "source": [ 26 | "\"Open" 27 | ] 28 | }, 29 | { 30 | "cell_type": "code", 31 | "metadata": { 32 | "id": "2Rw1ZBHPxdsX", 33 | "colab_type": "code", 34 | "colab": {} 35 | }, 36 | "source": [ 37 | "import TensorFlow\n", 38 | "import Python\n", 39 | "import Foundation" 40 | ], 41 | "execution_count": 0, 42 | "outputs": [] 43 | }, 44 | { 45 | "cell_type": "markdown", 46 | "metadata": { 47 | "id": "8MW6gtf89a8Q", 48 | "colab_type": "text" 49 | }, 50 | "source": [ 51 | "## Import Python modules" 52 | ] 53 | }, 54 | { 55 | "cell_type": "code", 56 | "metadata": { 57 | "id": "XlBc12zWipJL", 58 | "colab_type": "code", 59 | "colab": {} 60 | }, 61 | "source": [ 62 | "%include \"EnableIPythonDisplay.swift\"\n", 63 | "IPythonDisplay.shell.enable_matplotlib(\"inline\")\n", 64 | "\n", 65 | "let plt = Python.import(\"matplotlib.pyplot\")\n", 66 | "let np = Python.import(\"numpy\")\n", 67 | "let subprocess = Python.import(\"subprocess\")\n", 68 | "let glob = Python.import(\"glob\")\n", 69 | "let pil = Python.import(\"PIL\")" 70 | ], 71 | "execution_count": 0, 72 | "outputs": [] 73 | }, 74 | { 75 | "cell_type": "markdown", 76 | "metadata": { 77 | "id": "PhQi_x8b9wfY", 78 | "colab_type": "text" 79 | }, 80 | "source": [ 81 | "## Download the dataset\n", 82 | "\n", 83 | "The dataset is a simple binary dataset where we have two classes, dogs and cats." 84 | ] 85 | }, 86 | { 87 | "cell_type": "code", 88 | "metadata": { 89 | "id": "e2rEYuCUpkRI", 90 | "colab_type": "code", 91 | "colab": { 92 | "base_uri": "https://localhost:8080/", 93 | "height": 204 94 | }, 95 | "outputId": "beca0712-720c-4424-9bf8-70e58b2948df" 96 | }, 97 | "source": [ 98 | "var command = \"wget http://files.fast.ai/data/dogscats.zip\"\n", 99 | "subprocess.call(command, shell: true)\n", 100 | "command = \"unzip dogscats.zip >> tmp.txt\"\n", 101 | "subprocess.call(command, shell: true)\n", 102 | "\n", 103 | "// the training and validation set \n", 104 | "let trainList = glob.glob(\"dogscats/train/**/*.jpg\")\n", 105 | "let testList = glob.glob(\"dogscats/valid/**/*.jpg\")" 106 | ], 107 | "execution_count": 3, 108 | "outputs": [ 109 | { 110 | "output_type": "stream", 111 | "text": [ 112 | "--2019-05-11 13:58:17-- http://files.fast.ai/data/dogscats.zip\n", 113 | "Resolving files.fast.ai (files.fast.ai)... 67.205.15.147\n", 114 | "Connecting to files.fast.ai (files.fast.ai)|67.205.15.147|:80... connected.\n", 115 | "HTTP request sent, awaiting response... 200 OK\n", 116 | "Length: 857214334 (818M) [application/zip]\n", 117 | "Saving to: ‘dogscats.zip’\n", 118 | "\n", 119 | "dogscats.zip 100%[===================>] 817.50M 1.33MB/s in 9m 30s \n", 120 | "\n", 121 | "2019-05-11 14:07:46 (1.44 MB/s) - ‘dogscats.zip’ saved [857214334/857214334]\n", 122 | "\n" 123 | ], 124 | "name": "stdout" 125 | } 126 | ] 127 | }, 128 | { 129 | "cell_type": "code", 130 | "metadata": { 131 | "id": "zeGLbzoM-QqS", 132 | "colab_type": "code", 133 | "colab": { 134 | "base_uri": "https://localhost:8080/", 135 | "height": 286 136 | }, 137 | "outputId": "ffbc5dce-8fbf-4e17-a01c-d54605120966" 138 | }, 139 | "source": [ 140 | "let img = pil.Image.open(trainList[0])\n", 141 | "plt.imshow(img)\n", 142 | "plt.show()" 143 | ], 144 | "execution_count": 4, 145 | "outputs": [ 146 | { 147 | "output_type": "display_data", 148 | "data": { 149 | "image/png": "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\n", 150 | "text/plain": [ 151 | "
" 152 | ] 153 | }, 154 | "metadata": { 155 | "tags": [] 156 | } 157 | }, 158 | { 159 | "output_type": "execute_result", 160 | "data": { 161 | "text/plain": [ 162 | "None\n" 163 | ] 164 | }, 165 | "metadata": { 166 | "tags": [] 167 | }, 168 | "execution_count": 4 169 | } 170 | ] 171 | }, 172 | { 173 | "cell_type": "markdown", 174 | "metadata": { 175 | "id": "ElMak3HUJX47", 176 | "colab_type": "text" 177 | }, 178 | "source": [ 179 | "## Data loading" 180 | ] 181 | }, 182 | { 183 | "cell_type": "code", 184 | "metadata": { 185 | "id": "OLc26nxNRgtM", 186 | "colab_type": "code", 187 | "colab": {} 188 | }, 189 | "source": [ 190 | "/// load the image and extract the label\n", 191 | "func getTensorLabel(_ path:String) -> (Tensor, Int32){\n", 192 | " \n", 193 | " let label:Int32\n", 194 | " \n", 195 | " if path.contains(\"dog.\"){\n", 196 | " label = 0 \n", 197 | " }else{\n", 198 | " label = 1\n", 199 | " }\n", 200 | " \n", 201 | " let img = pil.Image.open(path)\n", 202 | " let image = Tensor(numpy: np.array(img))!\n", 203 | "\n", 204 | " var tensor = Tensor(image)\n", 205 | " tensor = Raw.expandDims(tensor, dim: Tensor(0))\n", 206 | " tensor = Raw.resizeArea(images:tensor , size:[224, 224])\n", 207 | " return (tensor, label)\n", 208 | "}\n", 209 | "\n", 210 | "/// extract a batch of size 32\n", 211 | "func getBatch(_ list:PythonObject) -> (Tensor, Tensor){\n", 212 | " let batchFiles = np.random.choice(list, size : 32)\n", 213 | " var labels = [Int32]()\n", 214 | " var X:Tensor\n", 215 | " var y:Tensor\n", 216 | " \n", 217 | " //load first image\n", 218 | " let path:String = String(batchFiles[0]) ?? \"\"\n", 219 | " let data = getTensorLabel(path)\n", 220 | " X = data.0 \n", 221 | " labels.append(data.1)\n", 222 | " \n", 223 | " //load the rest images \n", 224 | " for file in batchFiles[1..<32]{\n", 225 | " let path:String = String(file) ?? \"\"\n", 226 | " let data = getTensorLabel(path)\n", 227 | " let tensor = data.0\n", 228 | " labels.append(data.1)\n", 229 | " X = Raw.concat(concatDim: Tensor(0), [X, tensor])\n", 230 | " }\n", 231 | " y = Tensor(labels)\n", 232 | " return (X, y)\n", 233 | "}\n", 234 | "\n", 235 | "/// report accuracy of a batch \n", 236 | "func getAccuracy(y:Tensor, logits:Tensor) -> Float{\n", 237 | " let out = Tensor(logits.argmax(squeezingAxis: 1) .== y).sum().scalarized()\n", 238 | " return Float(out) / Float(y.shape[0])\n", 239 | "}\n", 240 | "\n", 241 | "/// round two decimal places \n", 242 | "func roundTwo(_ input:Float) -> Float{\n", 243 | " return (input*100).rounded()/100\n", 244 | "}" 245 | ], 246 | "execution_count": 0, 247 | "outputs": [] 248 | }, 249 | { 250 | "cell_type": "markdown", 251 | "metadata": { 252 | "id": "lgltE6fOELvZ", 253 | "colab_type": "text" 254 | }, 255 | "source": [ 256 | "## Feature extraction" 257 | ] 258 | }, 259 | { 260 | "cell_type": "markdown", 261 | "metadata": { 262 | "id": "ZvgjZujsJrEZ", 263 | "colab_type": "text" 264 | }, 265 | "source": [ 266 | "We use a VGG19 model as a pretrained model, first let us download the weights" 267 | ] 268 | }, 269 | { 270 | "cell_type": "code", 271 | "metadata": { 272 | "id": "SAjhHzX4iQ3d", 273 | "colab_type": "code", 274 | "outputId": "96318469-19ed-4c08-b081-e78226e543a9", 275 | "colab": { 276 | "base_uri": "https://localhost:8080/", 277 | "height": 71 278 | } 279 | }, 280 | "source": [ 281 | "let command = \"wget -nv -O- https://github.com/regrettable-username/style-transfer/releases/download/v0.1/vgg19.tar.gz | tar xzf - -C .\"\n", 282 | "subprocess.call(command, shell: true)" 283 | ], 284 | "execution_count": 6, 285 | "outputs": [ 286 | { 287 | "output_type": "stream", 288 | "text": [ 289 | "2019-05-11 14:08:14 URL:https://github-production-release-asset-2e65be.s3.amazonaws.com/184207790/69e7db80-6b4c-11e9-9e44-f8ad2a4bd071?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20190511%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20190511T140813Z&X-Amz-Expires=300&X-Amz-Signature=592e498c6e3445d4f59e53b6d276ca9ae5bb4b21a30eefef6d071935ff2fd5bd&X-Amz-SignedHeaders=host&actor_id=0&response-content-disposition=attachment%3B%20filename%3Dvgg19.tar.gz&response-content-type=application%2Foctet-stream [74427019/74427019] -> \"-\" [1]\r\n" 290 | ], 291 | "name": "stdout" 292 | }, 293 | { 294 | "output_type": "execute_result", 295 | "data": { 296 | "text/plain": [ 297 | "0\n" 298 | ] 299 | }, 300 | "metadata": { 301 | "tags": [] 302 | }, 303 | "execution_count": 6 304 | } 305 | ] 306 | }, 307 | { 308 | "cell_type": "markdown", 309 | "metadata": { 310 | "id": "qlkRKUlUEX25", 311 | "colab_type": "text" 312 | }, 313 | "source": [ 314 | "Create helper functions to override the conv layers to load the weights from a file" 315 | ] 316 | }, 317 | { 318 | "cell_type": "code", 319 | "metadata": { 320 | "id": "niQzywtdjedw", 321 | "colab_type": "code", 322 | "colab": {} 323 | }, 324 | "source": [ 325 | "//https://github.com/regrettable-username/style-transfer/blob/master/CheckpointReader.swift\n", 326 | "\n", 327 | "let layerToTensorMapping = [\n", 328 | " \"block1_conv1\": \"layer_with_weights-0\",\n", 329 | " \"block1_conv2\": \"layer_with_weights-1\",\n", 330 | " \"block2_conv1\": \"layer_with_weights-2\",\n", 331 | " \"block2_conv2\": \"layer_with_weights-3\",\n", 332 | " \"block3_conv1\": \"layer_with_weights-4\",\n", 333 | " \"block3_conv2\": \"layer_with_weights-5\",\n", 334 | " \"block3_conv3\": \"layer_with_weights-6\",\n", 335 | " \"block3_conv4\": \"layer_with_weights-7\",\n", 336 | " \"block4_conv1\": \"layer_with_weights-8\",\n", 337 | " \"block4_conv2\": \"layer_with_weights-9\",\n", 338 | " \"block4_conv3\": \"layer_with_weights-10\",\n", 339 | " \"block4_conv4\": \"layer_with_weights-11\",\n", 340 | " \"block5_conv1\": \"layer_with_weights-12\",\n", 341 | " \"block5_conv2\": \"layer_with_weights-13\",\n", 342 | " \"block5_conv3\": \"layer_with_weights-14\",\n", 343 | " \"block5_conv4\": \"layer_with_weights-15\",\n", 344 | " \"fc1\":\"layer_with_weights-16\"\n", 345 | "]\n", 346 | "\n", 347 | "func loadParameters(for tensorName: String) -> Tensor {\n", 348 | " let suffix = \"/.ATTRIBUTES/VARIABLE_VALUE\"\n", 349 | " let fullTensorName = StringTensor([\"\\(tensorName)\\(suffix)\"])\n", 350 | "\n", 351 | " return Raw.restoreV2(prefix: StringTensor(\"./vgg-19.ckpt\"), \n", 352 | " tensorNames: fullTensorName, \n", 353 | " shapeAndSlices: StringTensor([\"\"]), \n", 354 | " dtypes: [Float.tensorFlowDataType])[0] as! Tensor\n", 355 | "}\n", 356 | " \n", 357 | "public extension Conv2D where Scalar: FloatingPoint {\n", 358 | " init(named name: String) {\n", 359 | " self.init(filter: loadParameters(for: \"\\(layerToTensorMapping[name]!)/kernel\"),\n", 360 | " bias: loadParameters(for: \"\\(layerToTensorMapping[name]!)/bias\"), \n", 361 | " activation: relu,\n", 362 | " strides: (1, 1),\n", 363 | " padding: .same)\n", 364 | " }\n", 365 | "}" 366 | ], 367 | "execution_count": 0, 368 | "outputs": [] 369 | }, 370 | { 371 | "cell_type": "markdown", 372 | "metadata": { 373 | "id": "w3rJjmCdEkrZ", 374 | "colab_type": "text" 375 | }, 376 | "source": [ 377 | "Create the vgg19 skeleton " 378 | ] 379 | }, 380 | { 381 | "cell_type": "code", 382 | "metadata": { 383 | "id": "UsvlWqshlocH", 384 | "colab_type": "code", 385 | "colab": {} 386 | }, 387 | "source": [ 388 | "//https://github.com/regrettable-username/style-transfer/blob/master/CheckpointReader.swift\n", 389 | "struct VGG19: Layer {\n", 390 | " var conv1a: Conv2D\n", 391 | " var conv1b: Conv2D\n", 392 | " \n", 393 | " var conv2a: Conv2D\n", 394 | " var conv2b: Conv2D\n", 395 | " \n", 396 | " var conv3a: Conv2D\n", 397 | " var conv3b: Conv2D\n", 398 | " var conv3c: Conv2D\n", 399 | " var conv3d: Conv2D\n", 400 | " \n", 401 | " var conv4a: Conv2D\n", 402 | " var conv4b: Conv2D\n", 403 | " var conv4c: Conv2D\n", 404 | " var conv4d: Conv2D\n", 405 | " \n", 406 | " var conv5a: Conv2D\n", 407 | " var conv5b: Conv2D\n", 408 | " var conv5c: Conv2D\n", 409 | " var conv5d: Conv2D\n", 410 | " \n", 411 | " var pool: MaxPool2D\n", 412 | " \n", 413 | " var flatten: Flatten\n", 414 | " \n", 415 | " init() {\n", 416 | " \n", 417 | " // Layer 1 \n", 418 | " self.conv1a = Conv2D(named: \"block1_conv1\")\n", 419 | " self.conv1b = Conv2D(named: \"block1_conv2\")\n", 420 | " \n", 421 | " // Layer 2\n", 422 | " self.conv2a = Conv2D(named: \"block2_conv1\")\n", 423 | " self.conv2b = Conv2D(named: \"block2_conv2\")\n", 424 | " \n", 425 | " // Layer 3\n", 426 | " self.conv3a = Conv2D(named: \"block3_conv1\")\n", 427 | " self.conv3b = Conv2D(named: \"block3_conv2\")\n", 428 | " self.conv3c = Conv2D(named: \"block3_conv3\")\n", 429 | " self.conv3d = Conv2D(named: \"block3_conv4\")\n", 430 | " \n", 431 | " // Layer 4\n", 432 | " self.conv4a = Conv2D(named: \"block4_conv1\")\n", 433 | " self.conv4b = Conv2D(named: \"block4_conv2\")\n", 434 | " self.conv4c = Conv2D(named: \"block4_conv3\")\n", 435 | " self.conv4d = Conv2D(named: \"block4_conv4\")\n", 436 | " \n", 437 | " // Layer 5\n", 438 | " self.conv5a = Conv2D(named: \"block5_conv1\")\n", 439 | " self.conv5b = Conv2D(named: \"block5_conv2\")\n", 440 | " self.conv5c = Conv2D(named: \"block5_conv3\")\n", 441 | " self.conv5d = Conv2D(named: \"block5_conv4\")\n", 442 | " self.pool = MaxPool2D(poolSize:(2,2), strides: (2,2))\n", 443 | " self.flatten = Flatten()\n", 444 | " }\n", 445 | " \n", 446 | " @differentiable\n", 447 | " func callAsFunction(_ input: Tensor) -> Tensor {\n", 448 | " var x = input\n", 449 | " \n", 450 | " // Layer 1\n", 451 | " x = conv1a(x)\n", 452 | " x = conv1b(x)\n", 453 | " x = pool(x)\n", 454 | " \n", 455 | " // Layer 2 \n", 456 | " x = conv2a(x)\n", 457 | " x = conv2b(x)\n", 458 | " x = pool(x)\n", 459 | " \n", 460 | " // Layer 3\n", 461 | " x = conv3a(x)\n", 462 | " x = conv3b(x)\n", 463 | " x = conv3c(x)\n", 464 | " x = conv3d(x)\n", 465 | " x = pool(x)\n", 466 | " \n", 467 | " // Layer 4\n", 468 | " x = conv4a(x)\n", 469 | " x = conv4b(x)\n", 470 | " x = conv4c(x)\n", 471 | " x = conv4d(x)\n", 472 | " x = pool(x)\n", 473 | " \n", 474 | " // Layer 5\n", 475 | " x = conv5a(x)\n", 476 | " x = conv5b(x)\n", 477 | " x = conv5c(x)\n", 478 | " x = conv5d(x)\n", 479 | " x = pool(x)\n", 480 | " x = flatten(x)\n", 481 | " return x\n", 482 | " }\n", 483 | "}" 484 | ], 485 | "execution_count": 0, 486 | "outputs": [] 487 | }, 488 | { 489 | "cell_type": "markdown", 490 | "metadata": { 491 | "id": "B2cd3wJlEtqA", 492 | "colab_type": "text" 493 | }, 494 | "source": [ 495 | "Create the trainable classification tail " 496 | ] 497 | }, 498 | { 499 | "cell_type": "code", 500 | "metadata": { 501 | "id": "2vHv3y3URvxm", 502 | "colab_type": "code", 503 | "colab": {} 504 | }, 505 | "source": [ 506 | "struct Classifier:Layer{\n", 507 | "\n", 508 | " typealias Input = Tensor\n", 509 | " typealias Output = Tensor\n", 510 | " \n", 511 | " var dense1: Dense\n", 512 | " var dense2: Dense\n", 513 | " var dropout: Dropout\n", 514 | " \n", 515 | " init()\n", 516 | " {\n", 517 | " self.dense1 = Dense(inputSize: 25088 , outputSize: 128, activation: relu)\n", 518 | " self.dropout = Dropout(probability: 0.5)\n", 519 | " self.dense2 = Dense(inputSize: 128 , outputSize: 2)\n", 520 | " }\n", 521 | " \n", 522 | " @differentiable\n", 523 | " func callAsFunction(_ input: Input) -> Output {\n", 524 | " return input.sequenced(through: dense1, dropout, dense2) \n", 525 | " }\n", 526 | "}" 527 | ], 528 | "execution_count": 0, 529 | "outputs": [] 530 | }, 531 | { 532 | "cell_type": "markdown", 533 | "metadata": { 534 | "id": "7xF5XhkZE0sN", 535 | "colab_type": "text" 536 | }, 537 | "source": [ 538 | "Create the models" 539 | ] 540 | }, 541 | { 542 | "cell_type": "code", 543 | "metadata": { 544 | "id": "1sO1WbULnm7i", 545 | "colab_type": "code", 546 | "outputId": "f26e5451-d9e0-4722-e3c8-39ea269d264f", 547 | "colab": { 548 | "base_uri": "https://localhost:8080/", 549 | "height": 85 550 | } 551 | }, 552 | "source": [ 553 | "let tensor = Tensor(zeros:[1, 224, 224, 3])\n", 554 | "let vgg = VGG19()\n", 555 | "\n", 556 | "//warm up \n", 557 | "var classifier = Classifier()\n", 558 | "let optimizer = Adam(for: classifier)\n", 559 | "\n", 560 | "classifier(vgg(tensor)).shape" 561 | ], 562 | "execution_count": 10, 563 | "outputs": [ 564 | { 565 | "output_type": "execute_result", 566 | "data": { 567 | "text/plain": [ 568 | "▿ [1, 2]\n", 569 | " ▿ dimensions : 2 elements\n", 570 | " - 0 : 1\n", 571 | " - 1 : 2\n" 572 | ] 573 | }, 574 | "metadata": { 575 | "tags": [] 576 | }, 577 | "execution_count": 10 578 | } 579 | ] 580 | }, 581 | { 582 | "cell_type": "markdown", 583 | "metadata": { 584 | "id": "3bAQaB0AHtH7", 585 | "colab_type": "text" 586 | }, 587 | "source": [ 588 | "Training procedure" 589 | ] 590 | }, 591 | { 592 | "cell_type": "code", 593 | "metadata": { 594 | "id": "foGksGiGSbH0", 595 | "colab_type": "code", 596 | "outputId": "c7f11cab-2161-4abf-8df2-9088dd867540", 597 | "colab": { 598 | "base_uri": "https://localhost:8080/", 599 | "height": 51 600 | } 601 | }, 602 | "source": [ 603 | "var trainLoss:Float = 0.0\n", 604 | "var trainAcc :Float = 0.0\n", 605 | "var testLoss:Float = 0.0\n", 606 | "var testAcc:Float = 0.0 \n", 607 | "var batchCount: Float = 0.0\n", 608 | "\n", 609 | "for epoch in 0..<2{\n", 610 | " \n", 611 | " //evaluate metrics\n", 612 | " trainLoss = 0.0\n", 613 | " trainAcc = 0.0\n", 614 | " batchCount = 0.0 \n", 615 | " \n", 616 | " let trainCount = trainList.count / 32\n", 617 | " let testCount = testList.count / 32 \n", 618 | " \n", 619 | " for i in 0.. Tensor in\n", 631 | " let logits = classifier(ftrs)\n", 632 | " return softmaxCrossEntropy(logits: logits, labels: y)\n", 633 | " }\n", 634 | "\n", 635 | " //make an optimizer step \n", 636 | " optimizer.update(&classifier, along: grads) \n", 637 | " \n", 638 | " let logits = classifier(ftrs) //this is slowing down ? \n", 639 | " let acc = getAccuracy(y:y, logits:logits)\n", 640 | " \n", 641 | " trainLoss += Float(loss.scalarized())\n", 642 | " trainAcc += acc\n", 643 | " batchCount += 1\n", 644 | " } \n", 645 | " \n", 646 | " trainLoss /= batchCount\n", 647 | " trainAcc /= batchCount\n", 648 | " \n", 649 | " //training\n", 650 | " testLoss = 0.0\n", 651 | " testAcc = 0.0\n", 652 | " batchCount = 0.0 \n", 653 | " \n", 654 | " for i in 0..