{ "cells": [ { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "xLOXFOT5Q40E" }, "source": [ "##### Copyright 2020 The TensorFlow Authors." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "cellView": "form", "colab": {}, "colab_type": "code", "execution": { "iopub.execute_input": "2024-05-18T11:21:56.424869Z", "iopub.status.busy": "2024-05-18T11:21:56.424462Z", "iopub.status.idle": "2024-05-18T11:21:56.428553Z", "shell.execute_reply": "2024-05-18T11:21:56.427858Z" }, "id": "iiQkM5ZgQ8r2", "vscode": { "languageId": "python" } }, "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", "# You may obtain a copy of the License at\n", "#\n", "# https://www.apache.org/licenses/LICENSE-2.0\n", "#\n", "# Unless required by applicable law or agreed to in writing, software\n", "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", "# See the License for the specific language governing permissions and\n", "# limitations under the License." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "j6331ZSsQGY3" }, "source": [ "# Hello, many worlds" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "i9Jcnb8bQQyd" }, "source": [ "
\n",
" ![]() | \n",
" \n",
" ![]() | \n",
" \n",
" ![]() | \n",
" \n",
" ![]() | \n",
"
tfq.layers.Expectation
. Now your input has grown to include three objects: circuit, command, and operator. The output is still the expectation value."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "Ci3WMZ9CjEM1"
},
"source": [
"### 3.1 New model definition\n",
"\n",
"Lets take a look at the model to accomplish this task:"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"colab": {},
"colab_type": "code",
"execution": {
"iopub.execute_input": "2024-05-18T11:22:45.596499Z",
"iopub.status.busy": "2024-05-18T11:22:45.595981Z",
"iopub.status.idle": "2024-05-18T11:22:45.603556Z",
"shell.execute_reply": "2024-05-18T11:22:45.602864Z"
},
"id": "hta0G3Nc6pJY",
"vscode": {
"languageId": "python"
}
},
"outputs": [],
"source": [
"# Define inputs.\n",
"commands_input = tf.keras.layers.Input(shape=(1),\n",
" dtype=tf.dtypes.float32,\n",
" name='commands_input')\n",
"circuits_input = tf.keras.Input(shape=(),\n",
" # The circuit-tensor has dtype `tf.string` \n",
" dtype=tf.dtypes.string,\n",
" name='circuits_input')\n",
"operators_input = tf.keras.Input(shape=(1,),\n",
" dtype=tf.dtypes.string,\n",
" name='operators_input')"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "dtdnkrZm6pJb"
},
"source": [
"Here is the controller network:"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"colab": {},
"colab_type": "code",
"execution": {
"iopub.execute_input": "2024-05-18T11:22:45.606900Z",
"iopub.status.busy": "2024-05-18T11:22:45.606336Z",
"iopub.status.idle": "2024-05-18T11:22:45.614290Z",
"shell.execute_reply": "2024-05-18T11:22:45.613623Z"
},
"id": "n_aTG4g3-y0F",
"vscode": {
"languageId": "python"
}
},
"outputs": [],
"source": [
"# Define classical NN.\n",
"controller = tf.keras.Sequential([\n",
" tf.keras.layers.Dense(10, activation='elu'),\n",
" tf.keras.layers.Dense(3)\n",
"])"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "q9aN2ciy6pJf"
},
"source": [
"Combine the circuit and the controller into a single `keras.Model` using `tfq`:"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"colab": {},
"colab_type": "code",
"execution": {
"iopub.execute_input": "2024-05-18T11:22:45.617612Z",
"iopub.status.busy": "2024-05-18T11:22:45.617083Z",
"iopub.status.idle": "2024-05-18T11:22:45.670303Z",
"shell.execute_reply": "2024-05-18T11:22:45.669621Z"
},
"id": "IMHjiKit6pJg",
"vscode": {
"languageId": "python"
}
},
"outputs": [],
"source": [
"dense_2 = controller(commands_input)\n",
"\n",
"# Since you aren't using a PQC or ControlledPQC you must append\n",
"# your model circuit onto the datapoint circuit tensor manually.\n",
"full_circuit = tfq.layers.AddCircuit()(circuits_input, append=model_circuit)\n",
"expectation_output = tfq.layers.Expectation()(full_circuit,\n",
" symbol_names=control_params,\n",
" symbol_values=dense_2,\n",
" operators=operators_input)\n",
"\n",
"# Contruct your Keras model.\n",
"two_axis_control_model = tf.keras.Model(\n",
" inputs=[circuits_input, commands_input, operators_input],\n",
" outputs=[expectation_output])"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "VQTM6CCiD4gU"
},
"source": [
"### 3.2 The dataset\n",
"\n",
"Now you will also include the operators you wish to measure for each datapoint you supply for `model_circuit`:"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"colab": {},
"colab_type": "code",
"execution": {
"iopub.execute_input": "2024-05-18T11:22:45.673702Z",
"iopub.status.busy": "2024-05-18T11:22:45.673116Z",
"iopub.status.idle": "2024-05-18T11:22:45.677817Z",
"shell.execute_reply": "2024-05-18T11:22:45.677157Z"
},
"id": "4gw_L3JG0_G0",
"vscode": {
"languageId": "python"
}
},
"outputs": [],
"source": [
"# The operators to measure, for each command.\n",
"operator_data = tfq.convert_to_tensor([[cirq.X(qubit)], [cirq.Z(qubit)]])\n",
"\n",
"# The command input values to the classical NN.\n",
"commands = np.array([[0], [1]], dtype=np.float32)\n",
"\n",
"# The desired expectation value at output of quantum circuit.\n",
"expected_outputs = np.array([[1], [-1]], dtype=np.float32)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "ALCKSvwh0_G2"
},
"source": [
"### 3.3 Training\n",
"\n",
"Now that you have your new inputs and outputs you can train once again using keras."
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"colab": {},
"colab_type": "code",
"execution": {
"iopub.execute_input": "2024-05-18T11:22:45.681007Z",
"iopub.status.busy": "2024-05-18T11:22:45.680561Z",
"iopub.status.idle": "2024-05-18T11:22:46.389830Z",
"shell.execute_reply": "2024-05-18T11:22:46.389096Z"
},
"id": "nFuGA73MAA4p",
"vscode": {
"languageId": "python"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/30\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\r",
"1/1 [==============================] - ETA: 0s - loss: 1.0518"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r",
"1/1 [==============================] - 0s 482ms/step - loss: 1.0518\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 2/30\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\r",
"1/1 [==============================] - ETA: 0s - loss: 0.6841"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r",
"1/1 [==============================] - 0s 4ms/step - loss: 0.6841\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 3/30\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\r",
"1/1 [==============================] - ETA: 0s - loss: 0.4386"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r",
"1/1 [==============================] - 0s 4ms/step - loss: 0.4386\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 4/30\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\r",
"1/1 [==============================] - ETA: 0s - loss: 0.2500"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r",
"1/1 [==============================] - 0s 4ms/step - loss: 0.2500\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 5/30\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\r",
"1/1 [==============================] - ETA: 0s - loss: 0.1179"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r",
"1/1 [==============================] - 0s 4ms/step - loss: 0.1179\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 6/30\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\r",
"1/1 [==============================] - ETA: 0s - loss: 0.0456"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r",
"1/1 [==============================] - 0s 4ms/step - loss: 0.0456\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 7/30\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\r",
"1/1 [==============================] - ETA: 0s - loss: 0.0172"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r",
"1/1 [==============================] - 0s 4ms/step - loss: 0.0172\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 8/30\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\r",
"1/1 [==============================] - ETA: 0s - loss: 0.0077"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r",
"1/1 [==============================] - 0s 4ms/step - loss: 0.0077\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 9/30\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\r",
"1/1 [==============================] - ETA: 0s - loss: 0.0035"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r",
"1/1 [==============================] - 0s 4ms/step - loss: 0.0035\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 10/30\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\r",
"1/1 [==============================] - ETA: 0s - loss: 0.0026"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r",
"1/1 [==============================] - 0s 4ms/step - loss: 0.0026\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 11/30\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\r",
"1/1 [==============================] - ETA: 0s - loss: 0.0060"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r",
"1/1 [==============================] - 0s 4ms/step - loss: 0.0060\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 12/30\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\r",
"1/1 [==============================] - ETA: 0s - loss: 0.0142"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r",
"1/1 [==============================] - 0s 4ms/step - loss: 0.0142\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 13/30\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\r",
"1/1 [==============================] - ETA: 0s - loss: 0.0256"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r",
"1/1 [==============================] - 0s 4ms/step - loss: 0.0256\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 14/30\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\r",
"1/1 [==============================] - ETA: 0s - loss: 0.0361"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r",
"1/1 [==============================] - 0s 4ms/step - loss: 0.0361\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 15/30\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\r",
"1/1 [==============================] - ETA: 0s - loss: 0.0430"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r",
"1/1 [==============================] - 0s 4ms/step - loss: 0.0430\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 16/30\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\r",
"1/1 [==============================] - ETA: 0s - loss: 0.0437"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r",
"1/1 [==============================] - 0s 4ms/step - loss: 0.0437\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 17/30\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\r",
"1/1 [==============================] - ETA: 0s - loss: 0.0359"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r",
"1/1 [==============================] - 0s 4ms/step - loss: 0.0359\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 18/30\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\r",
"1/1 [==============================] - ETA: 0s - loss: 0.0244"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r",
"1/1 [==============================] - 0s 4ms/step - loss: 0.0244\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 19/30\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\r",
"1/1 [==============================] - ETA: 0s - loss: 0.0146"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r",
"1/1 [==============================] - 0s 4ms/step - loss: 0.0146\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 20/30\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\r",
"1/1 [==============================] - ETA: 0s - loss: 0.0079"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r",
"1/1 [==============================] - 0s 4ms/step - loss: 0.0079\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 21/30\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\r",
"1/1 [==============================] - ETA: 0s - loss: 0.0038"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r",
"1/1 [==============================] - 0s 4ms/step - loss: 0.0038\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 22/30\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\r",
"1/1 [==============================] - ETA: 0s - loss: 0.0016"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r",
"1/1 [==============================] - 0s 4ms/step - loss: 0.0016\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 23/30\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\r",
"1/1 [==============================] - ETA: 0s - loss: 6.0264e-04"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r",
"1/1 [==============================] - 0s 4ms/step - loss: 6.0264e-04\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 24/30\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\r",
"1/1 [==============================] - ETA: 0s - loss: 1.8856e-04"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r",
"1/1 [==============================] - 0s 4ms/step - loss: 1.8856e-04\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 25/30\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\r",
"1/1 [==============================] - ETA: 0s - loss: 5.0837e-05"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r",
"1/1 [==============================] - 0s 4ms/step - loss: 5.0837e-05\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 26/30\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\r",
"1/1 [==============================] - ETA: 0s - loss: 1.5398e-05"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r",
"1/1 [==============================] - 0s 4ms/step - loss: 1.5398e-05\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 27/30\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\r",
"1/1 [==============================] - ETA: 0s - loss: 1.2333e-05"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r",
"1/1 [==============================] - 0s 4ms/step - loss: 1.2333e-05\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 28/30\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\r",
"1/1 [==============================] - ETA: 0s - loss: 2.5812e-05"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r",
"1/1 [==============================] - 0s 4ms/step - loss: 2.5812e-05\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 29/30\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\r",
"1/1 [==============================] - ETA: 0s - loss: 6.2401e-05"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r",
"1/1 [==============================] - 0s 4ms/step - loss: 6.2401e-05\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 30/30\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\r",
"1/1 [==============================] - ETA: 0s - loss: 1.3390e-04"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r",
"1/1 [==============================] - 0s 4ms/step - loss: 1.3390e-04\n"
]
}
],
"source": [
"optimizer = tf.keras.optimizers.Adam(learning_rate=0.05)\n",
"loss = tf.keras.losses.MeanSquaredError()\n",
"\n",
"two_axis_control_model.compile(optimizer=optimizer, loss=loss)\n",
"\n",
"history = two_axis_control_model.fit(\n",
" x=[datapoint_circuits, commands, operator_data],\n",
" y=expected_outputs,\n",
" epochs=30,\n",
" verbose=1)"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"colab": {},
"colab_type": "code",
"execution": {
"iopub.execute_input": "2024-05-18T11:22:46.393475Z",
"iopub.status.busy": "2024-05-18T11:22:46.392849Z",
"iopub.status.idle": "2024-05-18T11:22:46.531648Z",
"shell.execute_reply": "2024-05-18T11:22:46.530878Z"
},
"id": "Cf_G-GdturLL",
"vscode": {
"languageId": "python"
}
},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"