Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save JacopoMangiavacchi/f5d6b3007abb493b42ae8f5a8a7de3c7 to your computer and use it in GitHub Desktop.
Save JacopoMangiavacchi/f5d6b3007abb493b42ae8f5a8a7de3c7 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Install Swift Protocol Buffer library"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Installing packages:\n",
"\t.package(url: \"https://github.com/apple/swift-protobuf.git\", from: \"1.6.0\")\n",
"\t\tSwiftProtobuf\n",
"With SwiftPM flags: ['-c', 'release']\n",
"Working in: /tmp/tmprjkpbl0q/swift-install\n",
"Fetching https://github.com/apple/swift-protobuf.git\n",
"Cloning https://github.com/apple/swift-protobuf.git\n",
"Resolving https://github.com/apple/swift-protobuf.git at 1.7.0\n",
"[1/2] Compiling SwiftProtobuf AnyMessageStorage.swift\n",
"[2/3] Compiling jupyterInstalledPackages jupyterInstalledPackages.swift\n",
"[3/3] Linking libjupyterInstalledPackages.so\n",
"Initializing Swift...\n",
"Installation complete!\n"
]
}
],
"source": [
"%install-swiftpm-flags -c release\n",
"%install '.package(url: \"https://github.com/apple/swift-protobuf.git\", from: \"1.6.0\")' SwiftProtobuf\n",
"import SwiftProtobuf"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Include Python, TensorFlow and enable Matplotlib plot"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"('inline', 'module://ipykernel.pylab.backend_inline')\n"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%include \"EnableIPythonDisplay.swift\"\n",
"IPythonDisplay.shell.enable_matplotlib(\"inline\")"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"import Python\n",
"import TensorFlow"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"let plt = Python.import(\"matplotlib.pyplot\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Generate noised linear data"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"let SAMPLE_SIZE = 100\n",
"\n",
"let a: Float = 2.0\n",
"let b: Float = 1.5\n",
"let x = Tensor<Float>(rangeFrom: 0, to: 1, stride: 1.0 / Float(SAMPLE_SIZE))\n",
"let noise = (Tensor<Float>(randomNormal: [SAMPLE_SIZE]) - 0.5) * 0.1\n",
"let y = (a * x + b) + noise"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\nQmCC\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"None\n"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"plt.clf()\n",
"plt.plot(x.makeNumpyArray(), y.makeNumpyArray(), marker: \"x\")\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[100]\r\n",
"[100]\r\n"
]
}
],
"source": [
"print(x.shape)\n",
"print(y.shape)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[100, 1]\r\n",
"[100, 1]\r\n"
]
}
],
"source": [
"let X = x.reshaped(toShape: [100, 1]) //SAMPLE_SIZE\n",
"let Y = y.reshaped(toShape: [100, 1]) //SAMPLE_SIZE\n",
"print(X.shape)\n",
"print(Y.shape)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Define Swift for TensorFlow trivial model"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"struct LinearRegression: Layer {\n",
" var layer1 = Dense<Float>(inputSize: 1, outputSize: 1, activation: identity)\n",
" \n",
" @differentiable\n",
" func callAsFunction(_ input: Tensor<Float>) -> Tensor<Float> {\n",
" return layer1(input)\n",
" }\n",
"}\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Define Optimizer, Loss Function and Train model"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"var regression = LinearRegression()\n",
"let optimizer = SGD(for: regression, learningRate: 0.03)\n",
"Context.local.learningPhase = .training"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Loss: 9.029919\n",
"Loss: 7.74655\n",
"Loss: 6.649976\n",
"Loss: 5.7129736\n",
"Loss: 4.9122906\n",
"Loss: 4.22806\n",
"Loss: 3.6433098\n",
"Loss: 3.1435456\n",
"Loss: 2.7163815\n",
"Loss: 2.3512392\n",
"Loss: 2.0390809\n",
"Loss: 1.7721862\n",
"Loss: 1.54396\n",
"Loss: 1.3487687\n",
"Loss: 1.1817993\n",
"Loss: 1.0389403\n",
"Loss: 0.91667974\n",
"Loss: 0.81201714\n",
"Loss: 0.7223894\n",
"Loss: 0.645607\n",
"Loss: 0.5797997\n",
"Loss: 0.5233695\n",
"Loss: 0.47495145\n",
"Loss: 0.43337953\n",
"Loss: 0.39765763\n",
"Loss: 0.36693475\n",
"Loss: 0.34048393\n",
"Loss: 0.31768426\n",
"Loss: 0.2980051\n",
"Loss: 0.28099334\n",
"Loss: 0.26626182\n",
"Loss: 0.25347972\n",
"Loss: 0.24236454\n",
"Loss: 0.23267482\n",
"Loss: 0.22420436\n",
"Loss: 0.21677704\n",
"Loss: 0.21024229\n",
"Loss: 0.20447157\n",
"Loss: 0.19935498\n",
"Loss: 0.19479868\n",
"Loss: 0.19072248\n",
"Loss: 0.18705784\n",
"Loss: 0.18374622\n",
"Loss: 0.18073764\n",
"Loss: 0.17798929\n",
"Loss: 0.1754647\n",
"Loss: 0.17313263\n",
"Loss: 0.17096642\n",
"Loss: 0.16894329\n",
"Loss: 0.16704375\n",
"Loss: 0.16525108\n",
"Loss: 0.16355114\n",
"Loss: 0.1619317\n",
"Loss: 0.16038233\n",
"Loss: 0.15889415\n",
"Loss: 0.15745956\n",
"Loss: 0.15607202\n",
"Loss: 0.15472597\n",
"Loss: 0.15341662\n",
"Loss: 0.15213987\n",
"Loss: 0.15089223\n",
"Loss: 0.14967072\n",
"Loss: 0.14847274\n",
"Loss: 0.14729609\n",
"Loss: 0.14613886\n",
"Loss: 0.14499943\n",
"Loss: 0.1438764\n",
"Loss: 0.14276858\n",
"Loss: 0.14167488\n",
"Loss: 0.14059444\n",
"Loss: 0.1395265\n",
"Loss: 0.13847035\n",
"Loss: 0.13742542\n",
"Loss: 0.13639122\n",
"Loss: 0.13536726\n",
"Loss: 0.13435322\n",
"Loss: 0.1333487\n",
"Loss: 0.13235345\n",
"Loss: 0.13136718\n",
"Loss: 0.13038966\n",
"Loss: 0.12942067\n",
"Loss: 0.12846005\n",
"Loss: 0.1275076\n",
"Loss: 0.1265632\n",
"Loss: 0.12562671\n",
"Loss: 0.12469797\n",
"Loss: 0.123776905\n",
"Loss: 0.12286339\n",
"Loss: 0.12195734\n",
"Loss: 0.12105861\n",
"Loss: 0.12016721\n",
"Loss: 0.11928297\n",
"Loss: 0.118405856\n",
"Loss: 0.11753576\n",
"Loss: 0.11667266\n",
"Loss: 0.11581642\n",
"Loss: 0.11496706\n",
"Loss: 0.11412445\n",
"Loss: 0.11328854\n",
"Loss: 0.11245928\n"
]
}
],
"source": [
"for _ in 0..<100 { //1000\n",
" let 𝛁model = regression.gradient { r -> Tensor<Float> in\n",
" let ŷ = r(X)\n",
" let loss = meanSquaredError(predicted: ŷ, expected: Y)\n",
" print(\"Loss: \\(loss)\")\n",
" return loss\n",
" }\n",
" optimizer.update(&regression, along: 𝛁model)\n",
"}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Get Weights and Bias of the model"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.8645877 2.0458913\r\n"
]
}
],
"source": [
"let weight = Float(regression.layer1.weight[0][0])!\n",
"let bias = Float(regression.layer1.bias[0])!\n",
"print(weight, bias)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Test the model"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"Context.local.learningPhase = .inference\n",
"let score = regression(X)\n",
"let y2 = score.reshaped(toShape: [100])"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\nAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"None\n"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"plt.clf()\n",
"plt.plot(x.makeNumpyArray(), y2.makeNumpyArray(), marker: \"x\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Import CoreML ProtoBuf Swift data strucures"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"%include \"./CoreMLProto/ArrayFeatureExtractor.pb.swift\""
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"%include \"./CoreMLProto/BayesianProbitRegressor.pb.swift\""
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"%include \"./CoreMLProto/DataStructures.pb.swift\""
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"%include \"./CoreMLProto/CategoricalMapping.pb.swift\""
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"%include \"./CoreMLProto/CustomModel.pb.swift\""
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"%include \"./CoreMLProto/DictVectorizer.pb.swift\""
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"%include \"./CoreMLProto/FeatureTypes.pb.swift\""
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [],
"source": [
"%include \"./CoreMLProto/FeatureVectorizer.pb.swift\""
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"%include \"./CoreMLProto/GLMClassifier.pb.swift\""
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [],
"source": [
"%include \"./CoreMLProto/GLMRegressor.pb.swift\""
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [],
"source": [
"%include \"./CoreMLProto/Gazetteer.pb.swift\""
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
"%include \"./CoreMLProto/Identity.pb.swift\""
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [],
"source": [
"%include \"./CoreMLProto/Imputer.pb.swift\""
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [],
"source": [
"%include \"./CoreMLProto/Scaler.pb.swift\""
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [],
"source": [
"%include \"./CoreMLProto/ItemSimilarityRecommender.pb.swift\""
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [],
"source": [
"%include \"./CoreMLProto/Parameters.pb.swift\""
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [],
"source": [
"%include \"./CoreMLProto/Normalizer.pb.swift\""
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [],
"source": [
"%include \"./CoreMLProto/LinkedModel.pb.swift\""
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [],
"source": [
"%include \"./CoreMLProto/NearestNeighbors.pb.swift\""
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [],
"source": [
"%include \"./CoreMLProto/NonMaximumSuppression.pb.swift\""
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [],
"source": [
"%include \"./CoreMLProto/OneHotEncoder.pb.swift\""
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [],
"source": [
"%include \"./CoreMLProto/SVM.pb.swift\""
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [],
"source": [
"%include \"./CoreMLProto/SoundAnalysisPreprocessing.pb.swift\""
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [],
"source": [
"%include \"./CoreMLProto/TextClassifier.pb.swift\""
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [],
"source": [
"%include \"./CoreMLProto/TreeEnsemble.pb.swift\""
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [],
"source": [
"%include \"./CoreMLProto/VisionFeaturePrint.pb.swift\""
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [],
"source": [
"%include \"./CoreMLProto/WordEmbedding.pb.swift\""
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [],
"source": [
"%include \"./CoreMLProto/WordTagger.pb.swift\""
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [],
"source": [
"%include \"./CoreMLProto/NeuralNetwork.pb.swift\""
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {},
"outputs": [],
"source": [
"%include \"./CoreMLProto/Model.pb.swift\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Export CoreML Model with Weights, Bias and Trainable Parameters"
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {},
"outputs": [],
"source": [
"let coreModel = CoreML_Specification_Model.with {\n",
" $0.specificationVersion = 4\n",
" $0.description_p = CoreML_Specification_ModelDescription.with {\n",
" $0.input = [CoreML_Specification_FeatureDescription.with {\n",
" $0.name = \"dense_input\"\n",
" $0.type = CoreML_Specification_FeatureType.with {\n",
" $0.multiArrayType = CoreML_Specification_ArrayFeatureType.with {\n",
" $0.shape = [1]\n",
" $0.dataType = CoreML_Specification_ArrayFeatureType.ArrayDataType.double\n",
" }\n",
" }\n",
" }]\n",
" $0.output = [CoreML_Specification_FeatureDescription.with {\n",
" $0.name = \"output\"\n",
" $0.type = CoreML_Specification_FeatureType.with {\n",
" $0.multiArrayType = CoreML_Specification_ArrayFeatureType.with {\n",
" $0.shape = [1]\n",
" $0.dataType = CoreML_Specification_ArrayFeatureType.ArrayDataType.double\n",
" }\n",
" }\n",
" }]\n",
" $0.trainingInput = [CoreML_Specification_FeatureDescription.with {\n",
" $0.name = \"dense_input\"\n",
" $0.type = CoreML_Specification_FeatureType.with {\n",
" $0.multiArrayType = CoreML_Specification_ArrayFeatureType.with {\n",
" $0.shape = [1]\n",
" $0.dataType = CoreML_Specification_ArrayFeatureType.ArrayDataType.double\n",
" }\n",
" }\n",
" }, CoreML_Specification_FeatureDescription.with {\n",
" $0.name = \"output_true\"\n",
" $0.type = CoreML_Specification_FeatureType.with {\n",
" $0.multiArrayType = CoreML_Specification_ArrayFeatureType.with {\n",
" $0.shape = [1]\n",
" $0.dataType = CoreML_Specification_ArrayFeatureType.ArrayDataType.double\n",
" }\n",
" }\n",
"\n",
" }]\n",
" $0.metadata = CoreML_Specification_Metadata.with {\n",
" $0.shortDescription = \"Trivial linear classifier\"\n",
" $0.author = \"Jacopo Mangiavacchi\"\n",
" $0.license = \"MIT\"\n",
" $0.userDefined = [\"coremltoolsVersion\" : \"3.1\"]\n",
" }\n",
" }\n",
" $0.isUpdatable = true\n",
" $0.neuralNetwork = CoreML_Specification_NeuralNetwork.with {\n",
" $0.layers = [CoreML_Specification_NeuralNetworkLayer.with {\n",
" $0.name = \"dense_1\"\n",
" $0.input = [\"dense_input\"]\n",
" $0.output = [\"output\"]\n",
" $0.isUpdatable = true\n",
" $0.innerProduct = CoreML_Specification_InnerProductLayerParams.with {\n",
" $0.inputChannels = 1\n",
" $0.outputChannels = 1\n",
" $0.hasBias_p = true\n",
" $0.weights = CoreML_Specification_WeightParams.with {\n",
" $0.floatValue = [weight]\n",
" $0.isUpdatable = true\n",
" }\n",
" $0.bias = CoreML_Specification_WeightParams.with {\n",
" $0.floatValue = [bias]\n",
" $0.isUpdatable = true\n",
" }\n",
" }\n",
" }]\n",
" $0.updateParams = CoreML_Specification_NetworkUpdateParameters.with {\n",
" $0.lossLayers = [CoreML_Specification_LossLayer.with {\n",
" $0.name = \"lossLayer\"\n",
" $0.meanSquaredErrorLossLayer = CoreML_Specification_MeanSquaredErrorLossLayer.with {\n",
" $0.input = \"output\"\n",
" $0.target = \"output_true\"\n",
" }\n",
" }]\n",
" $0.optimizer = CoreML_Specification_Optimizer.with {\n",
" $0.sgdOptimizer = CoreML_Specification_SGDOptimizer.with {\n",
" $0.learningRate = CoreML_Specification_DoubleParameter.with {\n",
" $0.defaultValue = 0.03\n",
" $0.range = CoreML_Specification_DoubleRange.with {\n",
" $0.maxValue = 1.0\n",
" }\n",
" }\n",
" $0.miniBatchSize = CoreML_Specification_Int64Parameter.with {\n",
" $0.defaultValue = 1\n",
" $0.set = CoreML_Specification_Int64Set.with {\n",
" $0.values = [1]\n",
" }\n",
" }\n",
" $0.momentum = CoreML_Specification_DoubleParameter.with {\n",
" $0.defaultValue = 0\n",
" $0.range = CoreML_Specification_DoubleRange.with {\n",
" $0.maxValue = 1.0\n",
" }\n",
" }\n",
" }\n",
" }\n",
" $0.epochs = CoreML_Specification_Int64Parameter.with {\n",
" $0.defaultValue = 100\n",
" $0.set = CoreML_Specification_Int64Set.with {\n",
" $0.values = [100]\n",
" }\n",
" }\n",
" $0.shuffle = CoreML_Specification_BoolParameter.with {\n",
" $0.defaultValue = true\n",
" }\n",
" }\n",
" }\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {},
"outputs": [],
"source": [
"let binaryModelData: Data = try coreModel.serializedData()"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {},
"outputs": [],
"source": [
"binaryModelData.write(to: URL(fileURLWithPath: \"./s4tf_model_personalization.mlmodel\"))"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Swift",
"language": "swift",
"name": "swift"
},
"language_info": {
"file_extension": ".swift",
"mimetype": "text/x-swift",
"name": "swift",
"version": ""
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment