686 lines (686 with data), 95.5 kB
{
"cells": [
{
"cell_type": "code",
"execution_count": 691,
"metadata": {
"id": "Mqkq8qOoIjmA",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 0
},
"outputId": "2624bde8-385b-486e-ca9f-3e46bc9c5676"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Time in seconds since beginning of run: 1701840028.6748462\n",
"Wed Dec 6 05:20:28 2023\n"
]
}
],
"source": [
"# This cell is added by sphinx-gallery\n",
"# It can be customized to whatever you like\n",
"%matplotlib inline\n",
"# !pip install pennylane\n",
"import time\n",
"seconds = time.time()\n",
"print(\"Time in seconds since beginning of run:\", seconds)\n",
"local_time = time.ctime(seconds)\n",
"print(local_time)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "OagJVyhUIjmB"
},
"source": [
"Turning quantum nodes into Torch Layers\n",
"=======================================\n",
"\n",
"::: {.meta}\n",
":property=\\\"og:description\\\": Learn how to create hybrid ML models in\n",
"PennyLane using Torch :property=\\\"og:image\\\":\n",
"<https://pennylane.ai/qml/_images/PyTorch_icon.png>\n",
":::\n",
"\n",
"::: {.related}\n",
"tutorial\\_qnn\\_module\\_tf Turning quantum nodes into Keras Layers\n",
":::\n",
"\n",
"*Author: Tom Bromley --- Posted: 02 November 2020. Last updated: 28\n",
"January 2021.*\n",
"\n",
"Creating neural networks in [PyTorch](https://pytorch.org/) is easy\n",
"using the [nn module](https://pytorch.org/docs/stable/nn.html). Models\n",
"are constructed from elementary *layers* and can be trained using the\n",
"PyTorch API. For example, the following code defines a two-layer network\n",
"that could be used for binary classification:\n"
]
},
{
"cell_type": "code",
"execution_count": 692,
"metadata": {
"id": "MOhMWnZeIjmC"
},
"outputs": [],
"source": [
"import torch\n",
"\n",
"layer_1 = torch.nn.Linear(2, 2)\n",
"layer_2 = torch.nn.Linear(2, 2)\n",
"softmax = torch.nn.Softmax(dim=1)\n",
"\n",
"layers = [layer_1, layer_2, softmax]\n",
"model = torch.nn.Sequential(*layers)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ak3WCr3IIjmC"
},
"source": [
"**What if we want to add a quantum layer to our model?** This is\n",
"possible in PennyLane:\n",
"`QNodes <../glossary/hybrid_computation>`{.interpreted-text role=\"doc\"}\n",
"can be converted into `torch.nn` layers and combined with the wide range\n",
"of built-in classical [layers](https://pytorch.org/docs/stable/nn.html)\n",
"to create truly hybrid models. This tutorial will guide you through a\n",
"simple example to show you how it\\'s done!\n",
"\n",
"::: {.note}\n",
"::: {.title}\n",
"Note\n",
":::\n",
"\n",
"A similar demo explaining how to\n",
"`turn quantum nodes into Keras layers <tutorial_qnn_module_tf>`{.interpreted-text\n",
"role=\"doc\"} is also available.\n",
":::\n",
"\n",
"Fixing the dataset and problem\n",
"==============================\n",
"\n",
"Let us begin by choosing a simple dataset and problem to allow us to\n",
"focus on how the hybrid model is constructed. Our objective is to\n",
"classify points generated from scikit-learn\\'s binary-class\n",
"[make\\_moons()](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_moons.html)\n",
"dataset:\n"
]
},
{
"cell_type": "code",
"execution_count": 693,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 406
},
"id": "b-ucArFtIjmC",
"outputId": "4c12547f-8015-4cb8-fb8a-535eed487589"
},
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
],
"image/png": "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\n"
},
"metadata": {}
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"from sklearn.datasets import make_moons\n",
"\n",
"# Set random seeds\n",
"torch.manual_seed(42)\n",
"np.random.seed(42)\n",
"\n",
"X, y = make_moons(n_samples=400, noise=0.1)\n",
"y_ = torch.unsqueeze(torch.tensor(y), 1) # used for one-hot encoded labels\n",
"y_hot = torch.scatter(torch.zeros((400, 2)), 1, y_, 1)\n",
"\n",
"c = [\"#1f77b4\" if y_ == 0 else \"#ff7f0e\" for y_ in y] # colours for each class\n",
"plt.axis(\"off\")\n",
"plt.scatter(X[:, 0], X[:, 1], c=c)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ApsohoY-IjmC"
},
"source": [
"Defining a QNode\n",
"================\n",
"\n",
"Our next step is to define the QNode that we want to interface with\n",
"`torch.nn`. Any combination of device, operations and measurements that\n",
"is valid in PennyLane can be used to compose the QNode. However, the\n",
"QNode arguments must satisfy additional `conditions\n",
"<code/api/pennylane.qnn.TorchLayer>`{.interpreted-text role=\"doc\"}\n",
"including having an argument called `inputs`. All other arguments must\n",
"be arrays or tensors and are treated as trainable weights in the model.\n",
"We fix a two-qubit QNode using the\n",
"`default.qubit <code/api/pennylane.devices.default_qubit.DefaultQubit>`{.interpreted-text\n",
"role=\"doc\"} simulator and operations from the\n",
"`templates <introduction/templates>`{.interpreted-text role=\"doc\"}\n",
"module.\n"
]
},
{
"cell_type": "code",
"execution_count": 694,
"metadata": {
"id": "ljTpsaAzIjmD"
},
"outputs": [],
"source": [
"import pennylane as qml\n",
"\n",
"n_qubits = 2\n",
"dev = qml.device(\"default.qubit\", wires=n_qubits)\n",
"\n",
"@qml.qnode(dev)\n",
"def qnode(inputs, weights):\n",
" qml.AngleEmbedding(inputs, wires=range(n_qubits), rotation='Y')\n",
" qml.AngleEmbedding(inputs, wires=range(n_qubits), rotation='Y')\n",
" qml.AngleEmbedding(inputs, wires=range(n_qubits), rotation='Y')\n",
" qml.AngleEmbedding(inputs, wires=range(n_qubits), rotation='Y')\n",
" return [qml.expval(qml.PauliZ(wires=i)) for i in range(n_qubits)]"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "pHCzxvEdIjmD"
},
"source": [
"Interfacing with Torch\n",
"======================\n",
"\n",
"With the QNode defined, we are ready to interface with `torch.nn`. This\n",
"is achieved using the `~pennylane.qnn.TorchLayer`{.interpreted-text\n",
"role=\"class\"} class of the `~pennylane.qnn`{.interpreted-text\n",
"role=\"mod\"} module, which converts the QNode to the elementary building\n",
"block of `torch.nn`: a *layer*. We shall see in the following how the\n",
"resultant layer can be combined with other well-known neural network\n",
"layers to form a hybrid model.\n",
"\n",
"We must first define the `weight_shapes` dictionary. Recall that all of\n",
"the arguments of the QNode (except the one named `inputs`) are treated\n",
"as trainable weights. For the QNode to be successfully converted to a\n",
"layer in `torch.nn`, we need to provide the details of the shape of each\n",
"trainable weight for them to be initialized. The `weight_shapes`\n",
"dictionary maps from the argument names of the QNode to corresponding\n",
"shapes:\n"
]
},
{
"cell_type": "code",
"execution_count": 695,
"metadata": {
"id": "BuCmykAyIjmD"
},
"outputs": [],
"source": [
"n_layers = 6\n",
"weight_shapes = {\"weights\": (n_layers, n_qubits)}"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "X26c79bNIjmD"
},
"source": [
"In our example, the `weights` argument of the QNode is trainable and has\n",
"shape given by `(n_layers, n_qubits)`, which is passed to\n",
"`~pennylane.templates.layers.BasicEntanglerLayers`{.interpreted-text\n",
"role=\"func\"}.\n",
"\n",
"Now that `weight_shapes` is defined, it is easy to then convert the\n",
"QNode:\n"
]
},
{
"cell_type": "code",
"execution_count": 696,
"metadata": {
"id": "kbwSMCeQIjmD"
},
"outputs": [],
"source": [
"qlayer = qml.qnn.TorchLayer(qnode, weight_shapes)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "4qcVUw0BIjmD"
},
"source": [
"With this done, the QNode can now be treated just like any other\n",
"`torch.nn` layer and we can proceed using the familiar Torch workflow.\n",
"\n",
"Creating a hybrid model\n",
"=======================\n",
"\n",
"Let\\'s create a basic three-layered hybrid model consisting of:\n",
"\n",
"1. a 2-neuron fully connected classical layer\n",
"2. our 2-qubit QNode converted into a layer\n",
"3. another 2-neuron fully connected classical layer\n",
"4. a softmax activation to convert to a probability vector\n",
"\n",
"A diagram of the model can be seen in the figure below.\n",
"\n",
"{.align-center\n",
"width=\"100.0%\"}\n",
"\n",
"We can construct the model using the\n",
"[Sequential](https://pytorch.org/docs/stable/generated/torch.nn.Sequential.html)\n",
"API:\n"
]
},
{
"cell_type": "code",
"execution_count": 697,
"metadata": {
"id": "BOtxpC8rIjmD"
},
"outputs": [],
"source": [
"clayer_1 = torch.nn.Linear(2, 2)\n",
"clayer_2 = torch.nn.Linear(2, 2)\n",
"softmax = torch.nn.Softmax(dim=1)\n",
"layers = [clayer_1, qlayer, clayer_2, softmax]\n",
"model = torch.nn.Sequential(*layers)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "8Yqu7PtgIjmD"
},
"source": [
"Training the model\n",
"==================\n",
"\n",
"We can now train our hybrid model on the classification dataset using\n",
"the usual Torch approach. We\\'ll use the standard\n",
"[SGD](https://pytorch.org/docs/stable/optim.html#torch.optim.SGD)\n",
"optimizer and the mean absolute error loss function:\n"
]
},
{
"cell_type": "code",
"execution_count": 698,
"metadata": {
"id": "KW3xjlDhIjmE"
},
"outputs": [],
"source": [
"opt = torch.optim.SGD(model.parameters(), lr=0.2)\n",
"loss = torch.nn.L1Loss()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "0ufrRD6KIjmE"
},
"source": [
"Note that there are more advanced combinations of optimizer and loss\n",
"function, but here we are focusing on the basics.\n",
"\n",
"The model is now ready to be trained!\n"
]
},
{
"cell_type": "code",
"execution_count": 699,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 0
},
"id": "hB32s2yPIjmE",
"outputId": "168f450f-8229-41b9-d9cc-1b11d982d8d4"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Average loss over epoch 1: 0.6318\n",
"Average loss over epoch 2: 0.6085\n",
"Average loss over epoch 3: 0.5877\n",
"Average loss over epoch 4: 0.6498\n",
"Average loss over epoch 5: 0.6193\n",
"Average loss over epoch 6: 0.6246\n",
"Accuracy: 72.5%\n"
]
}
],
"source": [
"X = torch.tensor(X, requires_grad=True).float()\n",
"y_hot = y_hot.float()\n",
"\n",
"batch_size = 5\n",
"batches = 200 // batch_size\n",
"\n",
"data_loader = torch.utils.data.DataLoader(\n",
" list(zip(X, y_hot)), batch_size=5, shuffle=True, drop_last=True\n",
")\n",
"\n",
"epochs = 6\n",
"\n",
"for epoch in range(epochs):\n",
"\n",
" running_loss = 0\n",
"\n",
" for xs, ys in data_loader:\n",
" opt.zero_grad()\n",
"\n",
" loss_evaluated = loss(model(xs), ys)\n",
" loss_evaluated.backward()\n",
"\n",
" opt.step()\n",
"\n",
" running_loss += loss_evaluated\n",
"\n",
" avg_loss = running_loss / batches\n",
" print(\"Average loss over epoch {}: {:.4f}\".format(epoch + 1, avg_loss))\n",
"\n",
"y_pred = model(X)\n",
"predictions = torch.argmax(y_pred, axis=1).detach().numpy()\n",
"\n",
"correct = [1 if p == p_true else 0 for p, p_true in zip(predictions, y)]\n",
"accuracy = sum(correct) / len(correct)\n",
"print(f\"Accuracy: {accuracy * 100}%\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "-SB6eGhSIjmE"
},
"source": [
"How did we do? The model looks to have successfully trained and the\n",
"accuracy is reasonably high. In practice, we would aim to push the\n",
"accuracy higher by thinking carefully about the model design and the\n",
"choice of hyperparameters such as the learning rate.\n",
"\n",
"Creating non-sequential models\n",
"==============================\n",
"\n",
"The model we created above was composed of a sequence of classical and\n",
"quantum layers. This type of model is very common and is suitable in a\n",
"lot of situations. However, in some cases we may want a greater degree\n",
"of control over how the model is constructed, for example when we have\n",
"multiple inputs and outputs or when we want to distribute the output of\n",
"one layer into multiple subsequent layers.\n",
"\n",
"Suppose we want to make a hybrid model consisting of:\n",
"\n",
"1. a 4-neuron fully connected classical layer\n",
"2. a 2-qubit quantum layer connected to the first two neurons of the\n",
" previous classical layer\n",
"3. a 2-qubit quantum layer connected to the second two neurons of the\n",
" previous classical layer\n",
"4. a 2-neuron fully connected classical layer which takes a\n",
" 4-dimensional input from the combination of the previous quantum\n",
" layers\n",
"5. a softmax activation to convert to a probability vector\n",
"\n",
"A diagram of the model can be seen in the figure below.\n",
"\n",
"{.align-center\n",
"width=\"100.0%\"}\n",
"\n",
"This model can also be constructed by creating a new class that inherits\n",
"from the `torch.nn`\n",
"[Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) and\n",
"overriding the `forward()` method:\n"
]
},
{
"cell_type": "code",
"execution_count": 700,
"metadata": {
"id": "0VfTBf67IjmE"
},
"outputs": [],
"source": [
"class HybridModel(torch.nn.Module):\n",
" def __init__(self):\n",
" super().__init__()\n",
" self.clayer_1 = torch.nn.Linear(2, 64)\n",
" self.qlayer_1 = qml.qnn.TorchLayer(qnode, weight_shapes)\n",
" self.qlayer_2 = qml.qnn.TorchLayer(qnode, weight_shapes)\n",
" self.qlayer_3 = qml.qnn.TorchLayer(qnode, weight_shapes)\n",
" self.qlayer_4 = qml.qnn.TorchLayer(qnode, weight_shapes)\n",
" self.qlayer_5 = qml.qnn.TorchLayer(qnode, weight_shapes)\n",
" self.qlayer_6 = qml.qnn.TorchLayer(qnode, weight_shapes)\n",
" self.qlayer_7 = qml.qnn.TorchLayer(qnode, weight_shapes)\n",
" self.qlayer_8 = qml.qnn.TorchLayer(qnode, weight_shapes)\n",
" self.qlayer_9 = qml.qnn.TorchLayer(qnode, weight_shapes)\n",
" self.qlayer_10 = qml.qnn.TorchLayer(qnode, weight_shapes)\n",
" self.qlayer_11 = qml.qnn.TorchLayer(qnode, weight_shapes)\n",
" self.qlayer_12 = qml.qnn.TorchLayer(qnode, weight_shapes)\n",
" self.qlayer_13 = qml.qnn.TorchLayer(qnode, weight_shapes)\n",
" self.qlayer_14 = qml.qnn.TorchLayer(qnode, weight_shapes)\n",
" self.qlayer_15 = qml.qnn.TorchLayer(qnode, weight_shapes)\n",
" self.qlayer_16 = qml.qnn.TorchLayer(qnode, weight_shapes)\n",
" self.qlayer_17 = qml.qnn.TorchLayer(qnode, weight_shapes)\n",
" self.qlayer_18 = qml.qnn.TorchLayer(qnode, weight_shapes)\n",
" self.qlayer_19 = qml.qnn.TorchLayer(qnode, weight_shapes)\n",
" self.qlayer_20 = qml.qnn.TorchLayer(qnode, weight_shapes)\n",
" self.qlayer_21 = qml.qnn.TorchLayer(qnode, weight_shapes)\n",
" self.qlayer_22 = qml.qnn.TorchLayer(qnode, weight_shapes)\n",
" self.qlayer_23 = qml.qnn.TorchLayer(qnode, weight_shapes)\n",
" self.qlayer_24 = qml.qnn.TorchLayer(qnode, weight_shapes)\n",
" self.qlayer_25 = qml.qnn.TorchLayer(qnode, weight_shapes)\n",
" self.qlayer_26 = qml.qnn.TorchLayer(qnode, weight_shapes)\n",
" self.qlayer_27 = qml.qnn.TorchLayer(qnode, weight_shapes)\n",
" self.qlayer_28 = qml.qnn.TorchLayer(qnode, weight_shapes)\n",
" self.qlayer_29 = qml.qnn.TorchLayer(qnode, weight_shapes)\n",
" self.qlayer_30 = qml.qnn.TorchLayer(qnode, weight_shapes)\n",
" self.qlayer_31 = qml.qnn.TorchLayer(qnode, weight_shapes)\n",
" self.qlayer_32 = qml.qnn.TorchLayer(qnode, weight_shapes)\n",
" self.clayer_2 = torch.nn.Linear(64, 2)\n",
" self.softmax = torch.nn.Softmax(dim=1)\n",
"\n",
" def forward(self, x):\n",
" x = self.clayer_1(x)\n",
" x_1, x_2, x_3, x_4, x_5, x_6, x_7, x_8, x_9, x_10, x_11, x_12, x_13, x_14, x_15, x_16, x_17, x_18, x_19, x_20, x_21, x_22, x_23, x_24, x_25, x_26, x_27, x_28, x_29, x_30, x_31, x_32 = torch.split(x, 2, dim=1)\n",
" x_1 = self.qlayer_1(x_1)\n",
" x_2 = self.qlayer_2(x_2)\n",
" x_3 = self.qlayer_3(x_3)\n",
" x_4 = self.qlayer_4(x_4)\n",
" x_5 = self.qlayer_5(x_5)\n",
" x_6 = self.qlayer_6(x_6)\n",
" x_7 = self.qlayer_7(x_7)\n",
" x_8 = self.qlayer_8(x_8)\n",
" x_9 = self.qlayer_9(x_9)\n",
" x_10 = self.qlayer_10(x_10)\n",
" x_11 = self.qlayer_11(x_11)\n",
" x_12 = self.qlayer_12(x_12)\n",
" x_13 = self.qlayer_13(x_13)\n",
" x_14 = self.qlayer_14(x_14)\n",
" x_15 = self.qlayer_15(x_15)\n",
" x_16 = self.qlayer_16(x_16)\n",
" x_17 = self.qlayer_17(x_17)\n",
" x_18 = self.qlayer_18(x_18)\n",
" x_19 = self.qlayer_19(x_19)\n",
" x_20 = self.qlayer_20(x_20)\n",
" x_21 = self.qlayer_21(x_21)\n",
" x_22 = self.qlayer_22(x_22)\n",
" x_23 = self.qlayer_23(x_23)\n",
" x_24 = self.qlayer_24(x_24)\n",
" x_25 = self.qlayer_25(x_25)\n",
" x_26 = self.qlayer_26(x_26)\n",
" x_27 = self.qlayer_27(x_27)\n",
" x_28 = self.qlayer_28(x_28)\n",
" x_29 = self.qlayer_29(x_29)\n",
" x_30 = self.qlayer_30(x_30)\n",
" x_31 = self.qlayer_31(x_31)\n",
" x_32 = self.qlayer_32(x_32)\n",
" x = torch.cat([x_1, x_2, x_3, x_4, x_5, x_6, x_7, x_8, x_9, x_10, x_11, x_12, x_13, x_14, x_15, x_16, x_17, x_18, x_19, x_20, x_21, x_22, x_23, x_24, x_25, x_26, x_27, x_28, x_29, x_30, x_31, x_32], axis=1)\n",
" x = self.clayer_2(x)\n",
" return self.softmax(x)\n",
"\n",
"model = HybridModel()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "tMt6fZUgIjmE"
},
"source": [
"As a final step, let\\'s train the model to check if it\\'s working:\n"
]
},
{
"cell_type": "code",
"execution_count": 701,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 0
},
"id": "gurIJukfIjmE",
"outputId": "2cf2e478-47e5-4a87-d65c-a1177b94491f"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Average loss over epoch 1: 0.1195\n",
"Average loss over epoch 2: 0.0195\n",
"Average loss over epoch 3: 0.0114\n",
"Average loss over epoch 4: 0.0074\n",
"Average loss over epoch 5: 0.0061\n",
"Average loss over epoch 6: 0.0047\n",
"Accuracy: 100.0%\n"
]
}
],
"source": [
"opt = torch.optim.SGD(model.parameters(), lr=0.2)\n",
"epochs = 6\n",
"\n",
"for epoch in range(epochs):\n",
"\n",
" running_loss = 0\n",
"\n",
" for xs, ys in data_loader:\n",
" opt.zero_grad()\n",
"\n",
" loss_evaluated = loss(model(xs), ys)\n",
" loss_evaluated.backward()\n",
"\n",
" opt.step()\n",
"\n",
" running_loss += loss_evaluated\n",
"\n",
" avg_loss = running_loss / batches\n",
" print(\"Average loss over epoch {}: {:.4f}\".format(epoch + 1, avg_loss))\n",
"\n",
"y_pred = model(X)\n",
"predictions = torch.argmax(y_pred, axis=1).detach().numpy()\n",
"\n",
"correct = [1 if p == p_true else 0 for p, p_true in zip(predictions, y)]\n",
"accuracy = sum(correct) / len(correct)\n",
"print(f\"Accuracy: {accuracy * 100}%\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ZeRyQGCmIjmE"
},
"source": [
"Great! We\\'ve mastered the basics of constructing hybrid\n",
"classical-quantum models using PennyLane and Torch. Can you think of any\n",
"interesting hybrid models to construct? How do they perform on realistic\n",
"datasets?\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "QDn0A3AuIjmE"
},
"source": [
"About the author\n",
"================\n"
]
},
{
"cell_type": "code",
"source": [
"seconds = time.time()\n",
"print(\"Time in seconds since end of run:\", seconds)\n",
"local_time = time.ctime(seconds)\n",
"print(local_time)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 0
},
"id": "5d2KCuaYAemE",
"outputId": "7a699964-257d-4ec5-bbbe-6a5df1c9888c"
},
"execution_count": 702,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Time in seconds since end of run: 1701840309.0711741\n",
"Wed Dec 6 05:25:09 2023\n"
]
}
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.17"
},
"colab": {
"provenance": []
}
},
"nbformat": 4,
"nbformat_minor": 0
}