{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "b518b04cbfe0" }, "source": [ "##### Copyright 2020 The TensorFlow Authors." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "cellView": "form", "execution": { "iopub.execute_input": "2022-12-14T21:33:01.723714Z", "iopub.status.busy": "2022-12-14T21:33:01.723181Z", "iopub.status.idle": "2022-12-14T21:33:01.726810Z", "shell.execute_reply": "2022-12-14T21:33:01.726278Z" }, "id": "906e07f6e562" }, "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": { "id": "e2d97c7e31aa" }, "source": [ "# 通过子类化创建新的层和模型" ] }, { "cell_type": "markdown", "metadata": { "id": "4e352274064f" }, "source": [ "\n", " \n", " \n", " \n", " \n", "
在 TensorFlow.org 上查看 在 Google Colab 中运行 在 GitHub 上查看源代码 下载笔记本
" ] }, { "cell_type": "markdown", "metadata": { "id": "8d4ac441b1fc" }, "source": [ "## 设置" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:33:01.730044Z", "iopub.status.busy": "2022-12-14T21:33:01.729610Z", "iopub.status.idle": "2022-12-14T21:33:03.631073Z", "shell.execute_reply": "2022-12-14T21:33:03.630382Z" }, "id": "4e7dce39dd1d" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2022-12-14 21:33:02.655873: W tensorflow/compiler/xla/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer.so.7'; dlerror: libnvinfer.so.7: cannot open shared object file: No such file or directory\n", "2022-12-14 21:33:02.655988: W tensorflow/compiler/xla/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer_plugin.so.7'; dlerror: libnvinfer_plugin.so.7: cannot open shared object file: No such file or directory\n", "2022-12-14 21:33:02.655999: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Cannot dlopen some TensorRT libraries. If you would like to use Nvidia GPU with TensorRT, please make sure the missing libraries mentioned above are installed properly.\n" ] } ], "source": [ "import tensorflow as tf\n", "from tensorflow import keras" ] }, { "cell_type": "markdown", "metadata": { "id": "7b363673d96c" }, "source": [ "## `Layer` 类:状态(权重)和部分计算的组合\n", "\n", "Keras 的一个中心抽象是 `Layer` 类。层封装了状态(层的“权重”)和从输入到输出的转换(“调用”,即层的前向传递)。\n", "\n", "下面是一个密集连接的层。它具有一个状态:变量 `w` 和 `b`。" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:33:03.635235Z", "iopub.status.busy": "2022-12-14T21:33:03.634606Z", "iopub.status.idle": "2022-12-14T21:33:03.639685Z", "shell.execute_reply": "2022-12-14T21:33:03.639031Z" }, "id": "59b8317dbd3c" }, "outputs": [], "source": [ "class Linear(keras.layers.Layer):\n", " def __init__(self, units=32, input_dim=32):\n", " super(Linear, self).__init__()\n", " w_init = tf.random_normal_initializer()\n", " self.w = tf.Variable(\n", " initial_value=w_init(shape=(input_dim, units), dtype=\"float32\"),\n", " trainable=True,\n", " )\n", " b_init = tf.zeros_initializer()\n", " self.b = tf.Variable(\n", " initial_value=b_init(shape=(units,), dtype=\"float32\"), trainable=True\n", " )\n", "\n", " def call(self, inputs):\n", " return tf.matmul(inputs, self.w) + self.b\n" ] }, { "cell_type": "markdown", "metadata": { "id": "dac8fb03a642" }, "source": [ "您可以在某些张量输入上通过调用来使用层,这一点很像 Python 函数。" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:33:03.642744Z", "iopub.status.busy": "2022-12-14T21:33:03.642291Z", "iopub.status.idle": "2022-12-14T21:33:07.355937Z", "shell.execute_reply": "2022-12-14T21:33:07.355209Z" }, "id": "cdcd15d5e68a" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "tf.Tensor(\n", "[[-0.00204108 -0.04129961 -0.01273937 -0.1288575 ]\n", " [-0.00204108 -0.04129961 -0.01273937 -0.1288575 ]], shape=(2, 4), dtype=float32)\n" ] } ], "source": [ "x = tf.ones((2, 2))\n", "linear_layer = Linear(4, 2)\n", "y = linear_layer(x)\n", "print(y)" ] }, { "cell_type": "markdown", "metadata": { "id": "382960020a56" }, "source": [ "请注意,权重 `w` 和 `b` 在被设置为层特性后会由层自动跟踪:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:33:07.359521Z", "iopub.status.busy": "2022-12-14T21:33:07.358990Z", "iopub.status.idle": "2022-12-14T21:33:07.362526Z", "shell.execute_reply": "2022-12-14T21:33:07.361935Z" }, "id": "d3d875af9465" }, "outputs": [], "source": [ "assert linear_layer.weights == [linear_layer.w, linear_layer.b]" ] }, { "cell_type": "markdown", "metadata": { "id": "ec9d72aa7538" }, "source": [ "请注意,您还可以使用一种更加快捷的方式为层添加权重:`add_weight()` 方法:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:33:07.365588Z", "iopub.status.busy": "2022-12-14T21:33:07.365147Z", "iopub.status.idle": "2022-12-14T21:33:07.380503Z", "shell.execute_reply": "2022-12-14T21:33:07.379875Z" }, "id": "168548eba841" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "tf.Tensor(\n", "[[-0.11710902 0.10924062 0.02172409 0.02696215]\n", " [-0.11710902 0.10924062 0.02172409 0.02696215]], shape=(2, 4), dtype=float32)\n" ] } ], "source": [ "class Linear(keras.layers.Layer):\n", " def __init__(self, units=32, input_dim=32):\n", " super(Linear, self).__init__()\n", " self.w = self.add_weight(\n", " shape=(input_dim, units), initializer=\"random_normal\", trainable=True\n", " )\n", " self.b = self.add_weight(shape=(units,), initializer=\"zeros\", trainable=True)\n", "\n", " def call(self, inputs):\n", " return tf.matmul(inputs, self.w) + self.b\n", "\n", "\n", "x = tf.ones((2, 2))\n", "linear_layer = Linear(4, 2)\n", "y = linear_layer(x)\n", "print(y)" ] }, { "cell_type": "markdown", "metadata": { "id": "070ea9b4db6c" }, "source": [ "## 层可以具有不可训练权重\n", "\n", "除了可训练权重外,您还可以向层添加不可训练权重。训练层时,不必在反向传播期间考虑此类权重。\n", "\n", "以下是添加和使用不可训练权重的方式:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:33:07.383536Z", "iopub.status.busy": "2022-12-14T21:33:07.383179Z", "iopub.status.idle": "2022-12-14T21:33:07.396901Z", "shell.execute_reply": "2022-12-14T21:33:07.396312Z" }, "id": "7c4cb404145f" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[2. 2.]\n", "[4. 4.]\n" ] } ], "source": [ "class ComputeSum(keras.layers.Layer):\n", " def __init__(self, input_dim):\n", " super(ComputeSum, self).__init__()\n", " self.total = tf.Variable(initial_value=tf.zeros((input_dim,)), trainable=False)\n", "\n", " def call(self, inputs):\n", " self.total.assign_add(tf.reduce_sum(inputs, axis=0))\n", " return self.total\n", "\n", "\n", "x = tf.ones((2, 2))\n", "my_sum = ComputeSum(2)\n", "y = my_sum(x)\n", "print(y.numpy())\n", "y = my_sum(x)\n", "print(y.numpy())" ] }, { "cell_type": "markdown", "metadata": { "id": "40f5b74d3d87" }, "source": [ "它是 `layer.weights` 的一部分,但被归类为不可训练权重:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:33:07.399994Z", "iopub.status.busy": "2022-12-14T21:33:07.399392Z", "iopub.status.idle": "2022-12-14T21:33:07.403097Z", "shell.execute_reply": "2022-12-14T21:33:07.402551Z" }, "id": "3d4db4ef4fa4" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "weights: 1\n", "non-trainable weights: 1\n", "trainable_weights: []\n" ] } ], "source": [ "print(\"weights:\", len(my_sum.weights))\n", "print(\"non-trainable weights:\", len(my_sum.non_trainable_weights))\n", "\n", "# It's not included in the trainable weights:\n", "print(\"trainable_weights:\", my_sum.trainable_weights)" ] }, { "cell_type": "markdown", "metadata": { "id": "fe6942aff7c6" }, "source": [ "## 最佳做法:将权重创建推迟到得知输入的形状之后\n", "\n", "上面的 `Linear` 层接受了一个 `input_dim` 参数,用于计算 `__init__()` 中权重 `w` 和 `b` 的形状:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:33:07.405963Z", "iopub.status.busy": "2022-12-14T21:33:07.405504Z", "iopub.status.idle": "2022-12-14T21:33:07.409760Z", "shell.execute_reply": "2022-12-14T21:33:07.409187Z" }, "id": "275b68d5ea9f" }, "outputs": [], "source": [ "class Linear(keras.layers.Layer):\n", " def __init__(self, units=32, input_dim=32):\n", " super(Linear, self).__init__()\n", " self.w = self.add_weight(\n", " shape=(input_dim, units), initializer=\"random_normal\", trainable=True\n", " )\n", " self.b = self.add_weight(shape=(units,), initializer=\"zeros\", trainable=True)\n", "\n", " def call(self, inputs):\n", " return tf.matmul(inputs, self.w) + self.b\n" ] }, { "cell_type": "markdown", "metadata": { "id": "5ebcacebb348" }, "source": [ "在许多情况下,您可能事先不知道输入的大小,并希望在得知该值时(对层进行实例化后的某个时间)再延迟创建权重。\n", "\n", "在 Keras API 中,我们建议您在层的 `build(self, inputs_shape)` 方法中创建层权重。如下所示:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:33:07.412817Z", "iopub.status.busy": "2022-12-14T21:33:07.412341Z", "iopub.status.idle": "2022-12-14T21:33:07.416716Z", "shell.execute_reply": "2022-12-14T21:33:07.416165Z" }, "id": "118c899f427e" }, "outputs": [], "source": [ "class Linear(keras.layers.Layer):\n", " def __init__(self, units=32):\n", " super(Linear, self).__init__()\n", " self.units = units\n", "\n", " def build(self, input_shape):\n", " self.w = self.add_weight(\n", " shape=(input_shape[-1], self.units),\n", " initializer=\"random_normal\",\n", " trainable=True,\n", " )\n", " self.b = self.add_weight(\n", " shape=(self.units,), initializer=\"random_normal\", trainable=True\n", " )\n", "\n", " def call(self, inputs):\n", " return tf.matmul(inputs, self.w) + self.b\n" ] }, { "cell_type": "markdown", "metadata": { "id": "78061e0583c6" }, "source": [ "层的 `__call__()` 方法将在首次调用时自动运行构建。现在,您有了一个延迟并因此更易使用的层:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:33:07.419676Z", "iopub.status.busy": "2022-12-14T21:33:07.419117Z", "iopub.status.idle": "2022-12-14T21:33:07.432160Z", "shell.execute_reply": "2022-12-14T21:33:07.431592Z" }, "id": "0697afb97bc1" }, "outputs": [], "source": [ "# At instantiation, we don't know on what inputs this is going to get called\n", "linear_layer = Linear(32)\n", "\n", "# The layer's weights are created dynamically the first time the layer is called\n", "y = linear_layer(x)\n" ] }, { "cell_type": "markdown", "metadata": { "id": "51b81f42b466" }, "source": [ "如上所示单独实现 `build()` 很好地将只创建一次权重与在每次调用时使用权重分开。但是,对于一些高级自定义层,将状态创建和计算分开可能变得不切实际。层实现器可以将权重创建推迟到第一个 `__call__()`,但需要注意,后面的调用会使用相同的权重。此外,由于 `__call__()` 很可能是第一次在 `tf.function` 中执行,在 `__call__()` 中发生的任何变量创建都应当封装在 `tf.init_scope` 中。" ] }, { "cell_type": "markdown", "metadata": { "id": "0b7a45f57610" }, "source": [ "## 层可递归组合\n", "\n", "如果将层实例分配为另一个层的特性,则外部层将开始跟踪内部层创建的权重。\n", "\n", "我们建议在 `__init__()` 方法中创建此类子层,并将其留给第一个 `__call__()` 以触发构建它们的权重。" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:33:07.435306Z", "iopub.status.busy": "2022-12-14T21:33:07.434837Z", "iopub.status.idle": "2022-12-14T21:33:07.465534Z", "shell.execute_reply": "2022-12-14T21:33:07.464945Z" }, "id": "1aaaf82ab8ce" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "weights: 6\n", "trainable weights: 6\n" ] } ], "source": [ "class MLPBlock(keras.layers.Layer):\n", " def __init__(self):\n", " super(MLPBlock, self).__init__()\n", " self.linear_1 = Linear(32)\n", " self.linear_2 = Linear(32)\n", " self.linear_3 = Linear(1)\n", "\n", " def call(self, inputs):\n", " x = self.linear_1(inputs)\n", " x = tf.nn.relu(x)\n", " x = self.linear_2(x)\n", " x = tf.nn.relu(x)\n", " return self.linear_3(x)\n", "\n", "\n", "mlp = MLPBlock()\n", "y = mlp(tf.ones(shape=(3, 64))) # The first call to the `mlp` will create the weights\n", "print(\"weights:\", len(mlp.weights))\n", "print(\"trainable weights:\", len(mlp.trainable_weights))" ] }, { "cell_type": "markdown", "metadata": { "id": "2bf11b296bd2" }, "source": [ "## `add_loss()` 方法\n", "\n", "在编写层的 `call()` 方法时,您可以在编写训练循环时创建想要稍后使用的损失张量。这可以通过调用 `self.add_loss(value)` 来实现:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:33:07.468538Z", "iopub.status.busy": "2022-12-14T21:33:07.468054Z", "iopub.status.idle": "2022-12-14T21:33:07.472005Z", "shell.execute_reply": "2022-12-14T21:33:07.471390Z" }, "id": "ba2782dc0879" }, "outputs": [], "source": [ "# A layer that creates an activity regularization loss\n", "class ActivityRegularizationLayer(keras.layers.Layer):\n", " def __init__(self, rate=1e-2):\n", " super(ActivityRegularizationLayer, self).__init__()\n", " self.rate = rate\n", "\n", " def call(self, inputs):\n", " self.add_loss(self.rate * tf.reduce_sum(inputs))\n", " return inputs\n" ] }, { "cell_type": "markdown", "metadata": { "id": "a883b230a9e9" }, "source": [ "这些损失(包括由任何内部层创建的损失)可通过 `layer.losses` 取回。此属性会在每个 `__call__()` 开始时重置到顶层,因此 `layer.losses` 始终包含在上一次前向传递过程中创建的损失值。" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:33:07.474841Z", "iopub.status.busy": "2022-12-14T21:33:07.474376Z", "iopub.status.idle": "2022-12-14T21:33:07.483815Z", "shell.execute_reply": "2022-12-14T21:33:07.483186Z" }, "id": "b56d223a30cd" }, "outputs": [], "source": [ "class OuterLayer(keras.layers.Layer):\n", " def __init__(self):\n", " super(OuterLayer, self).__init__()\n", " self.activity_reg = ActivityRegularizationLayer(1e-2)\n", "\n", " def call(self, inputs):\n", " return self.activity_reg(inputs)\n", "\n", "\n", "layer = OuterLayer()\n", "assert len(layer.losses) == 0 # No losses yet since the layer has never been called\n", "\n", "_ = layer(tf.zeros(1, 1))\n", "assert len(layer.losses) == 1 # We created one loss value\n", "\n", "# `layer.losses` gets reset at the start of each __call__\n", "_ = layer(tf.zeros(1, 1))\n", "assert len(layer.losses) == 1 # This is the loss created during the call above" ] }, { "cell_type": "markdown", "metadata": { "id": "0809dec680ff" }, "source": [ "此外,`loss` 属性还包含为任何内部层的权重创建的正则化损失:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:33:07.486973Z", "iopub.status.busy": "2022-12-14T21:33:07.486377Z", "iopub.status.idle": "2022-12-14T21:33:07.505805Z", "shell.execute_reply": "2022-12-14T21:33:07.505220Z" }, "id": "41016153e983" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[]\n" ] } ], "source": [ "class OuterLayerWithKernelRegularizer(keras.layers.Layer):\n", " def __init__(self):\n", " super(OuterLayerWithKernelRegularizer, self).__init__()\n", " self.dense = keras.layers.Dense(\n", " 32, kernel_regularizer=tf.keras.regularizers.l2(1e-3)\n", " )\n", "\n", " def call(self, inputs):\n", " return self.dense(inputs)\n", "\n", "\n", "layer = OuterLayerWithKernelRegularizer()\n", "_ = layer(tf.zeros((1, 1)))\n", "\n", "# This is `1e-3 * sum(layer.dense.kernel ** 2)`,\n", "# created by the `kernel_regularizer` above.\n", "print(layer.losses)" ] }, { "cell_type": "markdown", "metadata": { "id": "589465e06e4f" }, "source": [ "在编写训练循环时应考虑这些损失,如下所示:\n", "\n", "```python\n", "# Instantiate an optimizer.\n", "optimizer = tf.keras.optimizers.SGD(learning_rate=1e-3)\n", "loss_fn = keras.losses.SparseCategoricalCrossentropy(from_logits=True)\n", "\n", "# Iterate over the batches of a dataset.\n", "for x_batch_train, y_batch_train in train_dataset:\n", " with tf.GradientTape() as tape:\n", " logits = layer(x_batch_train) # Logits for this minibatch\n", " # Loss value for this minibatch\n", " loss_value = loss_fn(y_batch_train, logits)\n", " # Add extra losses created during this forward pass:\n", " loss_value += sum(model.losses)\n", "\n", " grads = tape.gradient(loss_value, model.trainable_weights)\n", " optimizer.apply_gradients(zip(grads, model.trainable_weights))\n", "```" ] }, { "cell_type": "markdown", "metadata": { "id": "7fb41ca8c3b0" }, "source": [ "有关编写训练循环的详细指南,请参阅[从头开始编写训练循环](https://tensorflow.google.cn/guide/keras/writing_a_training_loop_from_scratch/)指南。\n", "\n", "这些损失还可以无缝使用 `fit()`(它们会自动求和并添加到主损失中,如果有):" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:33:07.508924Z", "iopub.status.busy": "2022-12-14T21:33:07.508461Z", "iopub.status.idle": "2022-12-14T21:33:07.903278Z", "shell.execute_reply": "2022-12-14T21:33:07.902618Z" }, "id": "769bc6612ebf" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\r", "1/1 [==============================] - ETA: 0s - loss: 0.2993" ] }, { "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 178ms/step - loss: 0.2993\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\r", "1/1 [==============================] - ETA: 0s - loss: 0.0257" ] }, { "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 33ms/step - loss: 0.0257\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "\n", "inputs = keras.Input(shape=(3,))\n", "outputs = ActivityRegularizationLayer()(inputs)\n", "model = keras.Model(inputs, outputs)\n", "\n", "# If there is a loss passed in `compile`, the regularization\n", "# losses get added to it\n", "model.compile(optimizer=\"adam\", loss=\"mse\")\n", "model.fit(np.random.random((2, 3)), np.random.random((2, 3)))\n", "\n", "# It's also possible not to pass any loss in `compile`,\n", "# since the model already has a loss to minimize, via the `add_loss`\n", "# call during the forward pass!\n", "model.compile(optimizer=\"adam\")\n", "model.fit(np.random.random((2, 3)), np.random.random((2, 3)))" ] }, { "cell_type": "markdown", "metadata": { "id": "149c71e442bb" }, "source": [ "## `add_metric()` 方法\n", "\n", "与 `add_loss()` 类似,层还具有 `add_metric()` 方法,用于在训练过程中跟踪数量的移动平均值。\n", "\n", "请思考下面的 \"logistic endpoint\" 层。它将预测和目标作为输入,计算通过 `add_loss()` 跟踪的损失,并计算通过 `add_metric()` 跟踪的准确率标量。" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:33:07.906964Z", "iopub.status.busy": "2022-12-14T21:33:07.906335Z", "iopub.status.idle": "2022-12-14T21:33:07.911715Z", "shell.execute_reply": "2022-12-14T21:33:07.911000Z" }, "id": "bfb2df515096" }, "outputs": [], "source": [ "class LogisticEndpoint(keras.layers.Layer):\n", " def __init__(self, name=None):\n", " super(LogisticEndpoint, self).__init__(name=name)\n", " self.loss_fn = keras.losses.BinaryCrossentropy(from_logits=True)\n", " self.accuracy_fn = keras.metrics.BinaryAccuracy()\n", "\n", " def call(self, targets, logits, sample_weights=None):\n", " # Compute the training-time loss value and add it\n", " # to the layer using `self.add_loss()`.\n", " loss = self.loss_fn(targets, logits, sample_weights)\n", " self.add_loss(loss)\n", "\n", " # Log accuracy as a metric and add it\n", " # to the layer using `self.add_metric()`.\n", " acc = self.accuracy_fn(targets, logits, sample_weights)\n", " self.add_metric(acc, name=\"accuracy\")\n", "\n", " # Return the inference-time prediction tensor (for `.predict()`).\n", " return tf.nn.softmax(logits)\n" ] }, { "cell_type": "markdown", "metadata": { "id": "e68f88373800" }, "source": [ "可通过 `layer.metrics` 访问以这种方式跟踪的指标:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:33:07.915088Z", "iopub.status.busy": "2022-12-14T21:33:07.914536Z", "iopub.status.idle": "2022-12-14T21:33:07.944032Z", "shell.execute_reply": "2022-12-14T21:33:07.943401Z" }, "id": "1834d74450b6" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "layer.metrics: []\n", "current accuracy value: 1.0\n" ] } ], "source": [ "layer = LogisticEndpoint()\n", "\n", "targets = tf.ones((2, 2))\n", "logits = tf.ones((2, 2))\n", "y = layer(targets, logits)\n", "\n", "print(\"layer.metrics:\", layer.metrics)\n", "print(\"current accuracy value:\", float(layer.metrics[0].result()))" ] }, { "cell_type": "markdown", "metadata": { "id": "546cfbd4ea05" }, "source": [ "和 `add_loss()` 一样,这些指标也是通过 `fit()` 跟踪的:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:33:07.947477Z", "iopub.status.busy": "2022-12-14T21:33:07.946882Z", "iopub.status.idle": "2022-12-14T21:33:08.692704Z", "shell.execute_reply": "2022-12-14T21:33:08.691946Z" }, "id": "f5e74cb4da34" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\r", "1/1 [==============================] - ETA: 0s - loss: 0.9536 - binary_accuracy: 0.0000e+00" ] }, { "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\b\b\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 [==============================] - 1s 594ms/step - loss: 0.9536 - binary_accuracy: 0.0000e+00\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "inputs = keras.Input(shape=(3,), name=\"inputs\")\n", "targets = keras.Input(shape=(10,), name=\"targets\")\n", "logits = keras.layers.Dense(10)(inputs)\n", "predictions = LogisticEndpoint(name=\"predictions\")(logits, targets)\n", "\n", "model = keras.Model(inputs=[inputs, targets], outputs=predictions)\n", "model.compile(optimizer=\"adam\")\n", "\n", "data = {\n", " \"inputs\": np.random.random((3, 3)),\n", " \"targets\": np.random.random((3, 10)),\n", "}\n", "model.fit(data)" ] }, { "cell_type": "markdown", "metadata": { "id": "4012fa8683e5" }, "source": [ "## 可选择在层上启用序列化\n", "\n", "如果需要将自定义层作为[函数式模型](https://tensorflow.google.cn/guide/keras/functional/)的一部分进行序列化,您可以选择实现 `get_config()` 方法:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:33:08.696665Z", "iopub.status.busy": "2022-12-14T21:33:08.696007Z", "iopub.status.idle": "2022-12-14T21:33:08.703046Z", "shell.execute_reply": "2022-12-14T21:33:08.702454Z" }, "id": "0a720cbd5f54" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'units': 64}\n" ] } ], "source": [ "class Linear(keras.layers.Layer):\n", " def __init__(self, units=32):\n", " super(Linear, self).__init__()\n", " self.units = units\n", "\n", " def build(self, input_shape):\n", " self.w = self.add_weight(\n", " shape=(input_shape[-1], self.units),\n", " initializer=\"random_normal\",\n", " trainable=True,\n", " )\n", " self.b = self.add_weight(\n", " shape=(self.units,), initializer=\"random_normal\", trainable=True\n", " )\n", "\n", " def call(self, inputs):\n", " return tf.matmul(inputs, self.w) + self.b\n", "\n", " def get_config(self):\n", " return {\"units\": self.units}\n", "\n", "\n", "# Now you can recreate the layer from its config:\n", "layer = Linear(64)\n", "config = layer.get_config()\n", "print(config)\n", "new_layer = Linear.from_config(config)" ] }, { "cell_type": "markdown", "metadata": { "id": "1b43aad6c145" }, "source": [ "请注意,基础 `Layer` 类的 `__init__()` 方法会接受一些关键字参数,尤其是 `name` 和 `dtype`。最好将这些参数传递给 `__init__()` 中的父类,并将其包含在层配置中:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:33:08.706397Z", "iopub.status.busy": "2022-12-14T21:33:08.705869Z", "iopub.status.idle": "2022-12-14T21:33:08.712995Z", "shell.execute_reply": "2022-12-14T21:33:08.712328Z" }, "id": "0cbad8a6e6cd" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'name': 'linear_8', 'trainable': True, 'dtype': 'float32', 'units': 64}\n" ] } ], "source": [ "class Linear(keras.layers.Layer):\n", " def __init__(self, units=32, **kwargs):\n", " super(Linear, self).__init__(**kwargs)\n", " self.units = units\n", "\n", " def build(self, input_shape):\n", " self.w = self.add_weight(\n", " shape=(input_shape[-1], self.units),\n", " initializer=\"random_normal\",\n", " trainable=True,\n", " )\n", " self.b = self.add_weight(\n", " shape=(self.units,), initializer=\"random_normal\", trainable=True\n", " )\n", "\n", " def call(self, inputs):\n", " return tf.matmul(inputs, self.w) + self.b\n", "\n", " def get_config(self):\n", " config = super(Linear, self).get_config()\n", " config.update({\"units\": self.units})\n", " return config\n", "\n", "\n", "layer = Linear(64)\n", "config = layer.get_config()\n", "print(config)\n", "new_layer = Linear.from_config(config)" ] }, { "cell_type": "markdown", "metadata": { "id": "2421f80b5b86" }, "source": [ "如果根据层的配置对层进行反序列化时需要更大的灵活性,还可以重写 `from_config()` 类方法。下面是 `from_config()` 的基础实现:\n", "\n", "```python\n", "def from_config(cls, config):\n", " return cls(**config)\n", "```\n", "\n", "要详细了解序列化和保存,请参阅完整的[保存和序列化模型](https://tensorflow.google.cn/guide/keras/save_and_serialize/)指南。" ] }, { "cell_type": "markdown", "metadata": { "id": "3d7e2304a047" }, "source": [ "## `call()` 方法中的特权 `training` 参数\n", "\n", "某些层,尤其是 `BatchNormalization` 层和 `Dropout` 层,在训练和推断期间具有不同的行为。对于此类层,标准做法是在 `call()` 方法中公开 `training`(布尔)参数。\n", "\n", "通过在 `call()` 中公开此参数,可以启用内置的训练和评估循环(例如 `fit()`)以在训练和推断中正确使用层。" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:33:08.716180Z", "iopub.status.busy": "2022-12-14T21:33:08.715648Z", "iopub.status.idle": "2022-12-14T21:33:08.719652Z", "shell.execute_reply": "2022-12-14T21:33:08.718987Z" }, "id": "a169812c2c00" }, "outputs": [], "source": [ "class CustomDropout(keras.layers.Layer):\n", " def __init__(self, rate, **kwargs):\n", " super(CustomDropout, self).__init__(**kwargs)\n", " self.rate = rate\n", "\n", " def call(self, inputs, training=None):\n", " if training:\n", " return tf.nn.dropout(inputs, rate=self.rate)\n", " return inputs\n" ] }, { "cell_type": "markdown", "metadata": { "id": "9e1482c9f010" }, "source": [ "## `call()` 方法中的特权 `mask` 参数\n", "\n", "`call()` 支持的另一个特权参数是 `mask` 参数。\n", "\n", "它会出现在所有 Keras RNN 层中。掩码是布尔张量(在输入中每个时间步骤对应一个布尔值),用于在处理时间序列数据时跳过某些输入时间步骤。\n", "\n", "当先前的层生成掩码时,Keras 会自动将正确的 `mask` 参数传递给 `__call__()`(针对支持它的层)。掩码生成层是配置了 `mask_zero=True` 的 `Embedding` 层和 `Masking` 层。\n", "\n", "要详细了解遮盖以及如何编写启用遮盖的层,请查看[了解填充和遮盖](https://tensorflow.google.cn/guide/keras/masking_and_padding/)指南。" ] }, { "cell_type": "markdown", "metadata": { "id": "344110f9e134" }, "source": [ "## `Model` 类\n", "\n", "通常,您会使用 `Layer` 类来定义内部计算块,并使用 `Model` 类来定义外部模型,即您将训练的对象。\n", "\n", "例如,在 ResNet50 模型中,您会有几个子类化 `Layer` 的 ResNet 块,以及一个包含整个 ResNet50 网络的 `Model`。\n", "\n", "`Model` 类具有与 `Layer` 相同的 API,但有如下区别:\n", "\n", "- 它会公开内置训练、评估和预测循环(`model.fit()`、`model.evaluate()`、`model.predict()`)。\n", "- 它会通过 `model.layers` 属性公开其内部层的列表。\n", "- 它会公开保存和序列化 API(`save()`、`save_weights()`…)\n", "\n", "实际上,`Layer` 类对应于我们在文献中所称的“层”(如“卷积层”或“循环层”)或“块”(如“ResNet 块”或“Inception 块”)。\n", "\n", "同时,`Model` 类对应于文献中所称的“模型”(如“深度学习模型”)或“网络”(如“深度神经网络”)。\n", "\n", "因此,如果您想知道“我应该用 `Layer` 类还是 `Model` 类?”,请问自己:我是否需要在它上面调用 `fit()`?我是否需要在它上面调用 `save()`?如果是,则使用 `Model`。如果不是(要么因为您的类只是更大系统中的一个块,要么因为您正在自己编写训练和保存代码),则使用 `Layer`。\n", "\n", "例如,我们可以使用上面的 mini-resnet 示例,用它来构建一个 `Model`,该模型可以通过 `fit()` 进行训练,并通过 `save_weights()` 进行保存:" ] }, { "cell_type": "markdown", "metadata": { "id": "09caa642b72e" }, "source": [ "```python\n", "class ResNet(tf.keras.Model):\n", "\n", " def __init__(self, num_classes=1000):\n", " super(ResNet, self).__init__()\n", " self.block_1 = ResNetBlock()\n", " self.block_2 = ResNetBlock()\n", " self.global_pool = layers.GlobalAveragePooling2D()\n", " self.classifier = Dense(num_classes)\n", "\n", " def call(self, inputs):\n", " x = self.block_1(inputs)\n", " x = self.block_2(x)\n", " x = self.global_pool(x)\n", " return self.classifier(x)\n", "\n", "\n", "resnet = ResNet()\n", "dataset = ...\n", "resnet.fit(dataset, epochs=10)\n", "resnet.save(filepath)\n", "```" ] }, { "cell_type": "markdown", "metadata": { "id": "a2e32d225a1b" }, "source": [ "## 汇总:端到端示例\n", "\n", "到目前为止,您已学习以下内容:\n", "\n", "- `Layer` 封装了状态(在 `__init__()` 或 `build()` 中创建)和一些计算(在 `call()` 中定义)。\n", "- 层可以递归嵌套以创建新的更大的计算块。\n", "- 层可以通过 `add_loss()` 和 `add_metric()` 创建并跟踪损失(通常是正则化损失)以及指标。\n", "- 您要训练的外部容器是 `Model`。`Model` 就像 `Layer`,但是添加了训练和序列化实用工具。\n", "\n", "让我们将这些内容全部汇总到一个端到端示例:我们将实现一个变分自动编码器 (VAE),并用 MNIST 数字对其进行训练。\n", "\n", "我们的 VAE 将是 `Model` 的一个子类,它是作为子类化 `Layer` 的嵌套组合层进行构建的。它将具有正则化损失(KL 散度)。" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:33:08.723152Z", "iopub.status.busy": "2022-12-14T21:33:08.722610Z", "iopub.status.idle": "2022-12-14T21:33:08.733053Z", "shell.execute_reply": "2022-12-14T21:33:08.732469Z" }, "id": "56aaae7af872" }, "outputs": [], "source": [ "from tensorflow.keras import layers\n", "\n", "\n", "class Sampling(layers.Layer):\n", " \"\"\"Uses (z_mean, z_log_var) to sample z, the vector encoding a digit.\"\"\"\n", "\n", " def call(self, inputs):\n", " z_mean, z_log_var = inputs\n", " batch = tf.shape(z_mean)[0]\n", " dim = tf.shape(z_mean)[1]\n", " epsilon = tf.keras.backend.random_normal(shape=(batch, dim))\n", " return z_mean + tf.exp(0.5 * z_log_var) * epsilon\n", "\n", "\n", "class Encoder(layers.Layer):\n", " \"\"\"Maps MNIST digits to a triplet (z_mean, z_log_var, z).\"\"\"\n", "\n", " def __init__(self, latent_dim=32, intermediate_dim=64, name=\"encoder\", **kwargs):\n", " super(Encoder, self).__init__(name=name, **kwargs)\n", " self.dense_proj = layers.Dense(intermediate_dim, activation=\"relu\")\n", " self.dense_mean = layers.Dense(latent_dim)\n", " self.dense_log_var = layers.Dense(latent_dim)\n", " self.sampling = Sampling()\n", "\n", " def call(self, inputs):\n", " x = self.dense_proj(inputs)\n", " z_mean = self.dense_mean(x)\n", " z_log_var = self.dense_log_var(x)\n", " z = self.sampling((z_mean, z_log_var))\n", " return z_mean, z_log_var, z\n", "\n", "\n", "class Decoder(layers.Layer):\n", " \"\"\"Converts z, the encoded digit vector, back into a readable digit.\"\"\"\n", "\n", " def __init__(self, original_dim, intermediate_dim=64, name=\"decoder\", **kwargs):\n", " super(Decoder, self).__init__(name=name, **kwargs)\n", " self.dense_proj = layers.Dense(intermediate_dim, activation=\"relu\")\n", " self.dense_output = layers.Dense(original_dim, activation=\"sigmoid\")\n", "\n", " def call(self, inputs):\n", " x = self.dense_proj(inputs)\n", " return self.dense_output(x)\n", "\n", "\n", "class VariationalAutoEncoder(keras.Model):\n", " \"\"\"Combines the encoder and decoder into an end-to-end model for training.\"\"\"\n", "\n", " def __init__(\n", " self,\n", " original_dim,\n", " intermediate_dim=64,\n", " latent_dim=32,\n", " name=\"autoencoder\",\n", " **kwargs\n", " ):\n", " super(VariationalAutoEncoder, self).__init__(name=name, **kwargs)\n", " self.original_dim = original_dim\n", " self.encoder = Encoder(latent_dim=latent_dim, intermediate_dim=intermediate_dim)\n", " self.decoder = Decoder(original_dim, intermediate_dim=intermediate_dim)\n", "\n", " def call(self, inputs):\n", " z_mean, z_log_var, z = self.encoder(inputs)\n", " reconstructed = self.decoder(z)\n", " # Add KL divergence regularization loss.\n", " kl_loss = -0.5 * tf.reduce_mean(\n", " z_log_var - tf.square(z_mean) - tf.exp(z_log_var) + 1\n", " )\n", " self.add_loss(kl_loss)\n", " return reconstructed\n" ] }, { "cell_type": "markdown", "metadata": { "id": "2f8ae035a7c9" }, "source": [ "让我们在 MNIST 上编写一个简单的训练循环:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:33:08.736274Z", "iopub.status.busy": "2022-12-14T21:33:08.735753Z", "iopub.status.idle": "2022-12-14T21:33:52.488196Z", "shell.execute_reply": "2022-12-14T21:33:52.487290Z" }, "id": "40f11d1ef3bc" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Start of epoch 0\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "WARNING:tensorflow:5 out of the last 5 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has reduce_retracing=True option that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "WARNING:tensorflow:6 out of the last 6 calls to triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has reduce_retracing=True option that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 0: mean loss = 0.3351\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 100: mean loss = 0.1247\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 200: mean loss = 0.0988\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 300: mean loss = 0.0890\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 400: mean loss = 0.0841\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 500: mean loss = 0.0808\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 600: mean loss = 0.0786\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 700: mean loss = 0.0771\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 800: mean loss = 0.0759\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 900: mean loss = 0.0749\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Start of epoch 1\n", "step 0: mean loss = 0.0746\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 100: mean loss = 0.0739\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 200: mean loss = 0.0734\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 300: mean loss = 0.0730\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 400: mean loss = 0.0727\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 500: mean loss = 0.0723\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 600: mean loss = 0.0720\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 700: mean loss = 0.0717\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 800: mean loss = 0.0714\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 900: mean loss = 0.0712\n" ] } ], "source": [ "original_dim = 784\n", "vae = VariationalAutoEncoder(original_dim, 64, 32)\n", "\n", "optimizer = tf.keras.optimizers.Adam(learning_rate=1e-3)\n", "mse_loss_fn = tf.keras.losses.MeanSquaredError()\n", "\n", "loss_metric = tf.keras.metrics.Mean()\n", "\n", "(x_train, _), _ = tf.keras.datasets.mnist.load_data()\n", "x_train = x_train.reshape(60000, 784).astype(\"float32\") / 255\n", "\n", "train_dataset = tf.data.Dataset.from_tensor_slices(x_train)\n", "train_dataset = train_dataset.shuffle(buffer_size=1024).batch(64)\n", "\n", "epochs = 2\n", "\n", "# Iterate over epochs.\n", "for epoch in range(epochs):\n", " print(\"Start of epoch %d\" % (epoch,))\n", "\n", " # Iterate over the batches of the dataset.\n", " for step, x_batch_train in enumerate(train_dataset):\n", " with tf.GradientTape() as tape:\n", " reconstructed = vae(x_batch_train)\n", " # Compute reconstruction loss\n", " loss = mse_loss_fn(x_batch_train, reconstructed)\n", " loss += sum(vae.losses) # Add KLD regularization loss\n", "\n", " grads = tape.gradient(loss, vae.trainable_weights)\n", " optimizer.apply_gradients(zip(grads, vae.trainable_weights))\n", "\n", " loss_metric(loss)\n", "\n", " if step % 100 == 0:\n", " print(\"step %d: mean loss = %.4f\" % (step, loss_metric.result()))" ] }, { "cell_type": "markdown", "metadata": { "id": "f0d65fae5d3d" }, "source": [ "请注意,由于 VAE 是 `Model` 的子类,它具有内置的训练循环。因此,您也可以用以下方式训练它:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:33:52.492492Z", "iopub.status.busy": "2022-12-14T21:33:52.491934Z", "iopub.status.idle": "2022-12-14T21:34:00.032574Z", "shell.execute_reply": "2022-12-14T21:34:00.031850Z" }, "id": "5af13f70d528" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/2\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\r", " 1/938 [..............................] - ETA: 25:19 - loss: 0.3395" ] }, { "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\b\b\b\r", " 19/938 [..............................] - ETA: 2s - loss: 0.2210 " ] }, { "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", " 38/938 [>.............................] - ETA: 2s - loss: 0.1832" ] }, { "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", " 57/938 [>.............................] - ETA: 2s - loss: 0.1579" ] }, { "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", " 76/938 [=>............................] - ETA: 2s - loss: 0.1407" ] }, { "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", " 95/938 [==>...........................] - ETA: 2s - loss: 0.1285" ] }, { "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", "114/938 [==>...........................] - ETA: 2s - loss: 0.1197" ] }, { "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", "133/938 [===>..........................] - ETA: 2s - loss: 0.1132" ] }, { "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", "152/938 [===>..........................] - ETA: 2s - loss: 0.1080" ] }, { "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", "172/938 [====>.........................] - ETA: 2s - loss: 0.1036" ] }, { "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", "192/938 [=====>........................] - ETA: 2s - loss: 0.1002" ] }, { "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", "211/938 [=====>........................] - ETA: 1s - loss: 0.0975" ] }, { "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", "231/938 [======>.......................] - ETA: 1s - loss: 0.0950" ] }, { "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", "251/938 [=======>......................] - ETA: 1s - loss: 0.0930" ] }, { "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", "270/938 [=======>......................] - ETA: 1s - loss: 0.0912" ] }, { "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", "289/938 [========>.....................] - ETA: 1s - loss: 0.0897" ] }, { "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", "308/938 [========>.....................] - ETA: 1s - loss: 0.0884" ] }, { "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", "327/938 [=========>....................] - ETA: 1s - loss: 0.0873" ] }, { "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", "346/938 [==========>...................] - ETA: 1s - loss: 0.0862" ] }, { "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", "366/938 [==========>...................] - ETA: 1s - loss: 0.0852" ] }, { "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", "386/938 [===========>..................] - ETA: 1s - loss: 0.0843" ] }, { "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", "406/938 [===========>..................] - ETA: 1s - loss: 0.0835" ] }, { "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", "426/938 [============>.................] - ETA: 1s - loss: 0.0828" ] }, { "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", "446/938 [=============>................] - ETA: 1s - loss: 0.0821" ] }, { "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", "466/938 [=============>................] - ETA: 1s - loss: 0.0815" ] }, { "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", "486/938 [==============>...............] - ETA: 1s - loss: 0.0809" ] }, { "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", "505/938 [===============>..............] - ETA: 1s - loss: 0.0804" ] }, { "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", "524/938 [===============>..............] - ETA: 1s - loss: 0.0800" ] }, { "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", "543/938 [================>.............] - ETA: 1s - loss: 0.0796" ] }, { "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", "562/938 [================>.............] - ETA: 1s - loss: 0.0792" ] }, { "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", "581/938 [=================>............] - ETA: 0s - loss: 0.0788" ] }, { "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", "600/938 [==================>...........] - ETA: 0s - loss: 0.0785" ] }, { "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", "619/938 [==================>...........] - ETA: 0s - loss: 0.0782" ] }, { "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", "638/938 [===================>..........] - ETA: 0s - loss: 0.0778" ] }, { "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", "657/938 [====================>.........] - ETA: 0s - loss: 0.0775" ] }, { "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", "676/938 [====================>.........] - ETA: 0s - loss: 0.0773" ] }, { "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", "695/938 [=====================>........] - ETA: 0s - loss: 0.0770" ] }, { "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", "714/938 [=====================>........] - ETA: 0s - loss: 0.0768" ] }, { "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", "732/938 [======================>.......] - ETA: 0s - loss: 0.0765" ] }, { "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", "751/938 [=======================>......] - ETA: 0s - loss: 0.0763" ] }, { "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", "770/938 [=======================>......] - ETA: 0s - loss: 0.0761" ] }, { "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", "789/938 [========================>.....] - ETA: 0s - loss: 0.0759" ] }, { "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", "808/938 [========================>.....] - ETA: 0s - loss: 0.0758" ] }, { "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", "827/938 [=========================>....] - ETA: 0s - loss: 0.0756" ] }, { "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", "846/938 [==========================>...] - ETA: 0s - loss: 0.0754" ] }, { "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", "865/938 [==========================>...] - ETA: 0s - loss: 0.0753" ] }, { "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", "884/938 [===========================>..] - ETA: 0s - loss: 0.0751" ] }, { "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", "903/938 [===========================>..] - ETA: 0s - loss: 0.0750" ] }, { "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", "922/938 [============================>.] - ETA: 0s - loss: 0.0749" ] }, { "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", "938/938 [==============================] - 4s 3ms/step - loss: 0.0747\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 2/2\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\r", " 1/938 [..............................] - ETA: 3s - loss: 0.0669" ] }, { "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", " 21/938 [..............................] - ETA: 2s - loss: 0.0681" ] }, { "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", " 40/938 [>.............................] - ETA: 2s - loss: 0.0679" ] }, { "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", " 59/938 [>.............................] - ETA: 2s - loss: 0.0676" ] }, { "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", " 78/938 [=>............................] - ETA: 2s - loss: 0.0674" ] }, { "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", " 96/938 [==>...........................] - ETA: 2s - loss: 0.0674" ] }, { "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", "115/938 [==>...........................] - ETA: 2s - loss: 0.0675" ] }, { "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", "133/938 [===>..........................] - ETA: 2s - loss: 0.0675" ] }, { "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", "151/938 [===>..........................] - ETA: 2s - loss: 0.0674" ] }, { "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", "170/938 [====>.........................] - ETA: 2s - loss: 0.0675" ] }, { "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", "188/938 [=====>........................] - ETA: 2s - loss: 0.0675" ] }, { "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", "207/938 [=====>........................] - ETA: 2s - loss: 0.0675" ] }, { "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", "226/938 [======>.......................] - ETA: 1s - loss: 0.0676" ] }, { "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", "245/938 [======>.......................] - ETA: 1s - loss: 0.0675" ] }, { "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", "263/938 [=======>......................] - ETA: 1s - loss: 0.0675" ] }, { "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", "282/938 [========>.....................] - ETA: 1s - loss: 0.0675" ] }, { "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", "300/938 [========>.....................] - ETA: 1s - loss: 0.0675" ] }, { "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", "319/938 [=========>....................] - ETA: 1s - loss: 0.0675" ] }, { "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", "338/938 [=========>....................] - ETA: 1s - loss: 0.0675" ] }, { "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", "356/938 [==========>...................] - ETA: 1s - loss: 0.0675" ] }, { "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", "374/938 [==========>...................] - ETA: 1s - loss: 0.0675" ] }, { "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", "392/938 [===========>..................] - ETA: 1s - loss: 0.0675" ] }, { "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", "410/938 [============>.................] - ETA: 1s - loss: 0.0675" ] }, { "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", "428/938 [============>.................] - ETA: 1s - loss: 0.0675" ] }, { "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", "446/938 [=============>................] - ETA: 1s - loss: 0.0676" ] }, { "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", "464/938 [=============>................] - ETA: 1s - loss: 0.0676" ] }, { "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", "482/938 [==============>...............] - ETA: 1s - loss: 0.0676" ] }, { "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", "500/938 [==============>...............] - ETA: 1s - loss: 0.0676" ] }, { "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", "518/938 [===============>..............] - ETA: 1s - loss: 0.0676" ] }, { "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", "537/938 [================>.............] - ETA: 1s - loss: 0.0676" ] }, { "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", "555/938 [================>.............] - ETA: 1s - loss: 0.0676" ] }, { "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", "573/938 [=================>............] - ETA: 1s - loss: 0.0677" ] }, { "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", "592/938 [=================>............] - ETA: 0s - loss: 0.0676" ] }, { "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", "611/938 [==================>...........] - ETA: 0s - loss: 0.0676" ] }, { "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", "629/938 [===================>..........] - ETA: 0s - loss: 0.0677" ] }, { "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", "648/938 [===================>..........] - ETA: 0s - loss: 0.0676" ] }, { "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", "667/938 [====================>.........] - ETA: 0s - loss: 0.0677" ] }, { "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", "686/938 [====================>.........] - ETA: 0s - loss: 0.0676" ] }, { "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", "705/938 [=====================>........] - ETA: 0s - loss: 0.0676" ] }, { "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", "723/938 [======================>.......] - ETA: 0s - loss: 0.0676" ] }, { "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", "741/938 [======================>.......] - ETA: 0s - loss: 0.0676" ] }, { "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", "759/938 [=======================>......] - ETA: 0s - loss: 0.0676" ] }, { "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", "778/938 [=======================>......] - ETA: 0s - loss: 0.0676" ] }, { "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", "797/938 [========================>.....] - ETA: 0s - loss: 0.0676" ] }, { "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", "815/938 [=========================>....] - ETA: 0s - loss: 0.0676" ] }, { "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", "834/938 [=========================>....] - ETA: 0s - loss: 0.0676" ] }, { "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", "853/938 [==========================>...] - ETA: 0s - loss: 0.0676" ] }, { "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", "872/938 [==========================>...] - ETA: 0s - loss: 0.0676" ] }, { "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", "891/938 [===========================>..] - ETA: 0s - loss: 0.0676" ] }, { "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", "909/938 [============================>.] - ETA: 0s - loss: 0.0676" ] }, { "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", "928/938 [============================>.] - ETA: 0s - loss: 0.0676" ] }, { "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", "938/938 [==============================] - 3s 3ms/step - loss: 0.0676\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vae = VariationalAutoEncoder(784, 64, 32)\n", "\n", "optimizer = tf.keras.optimizers.Adam(learning_rate=1e-3)\n", "\n", "vae.compile(optimizer, loss=tf.keras.losses.MeanSquaredError())\n", "vae.fit(x_train, x_train, epochs=2, batch_size=64)" ] }, { "cell_type": "markdown", "metadata": { "id": "d34b7ba21662" }, "source": [ "## 超越面向对象的开发:函数式 API\n", "\n", "这个示例对您来说是否包含了太多面向对象的开发?您也可以使用[函数式 API](https://tensorflow.google.cn/guide/keras/functional/) 来构建模型。重要的是,选择其中一种样式并不妨碍您利用以另一种样式编写的组件:您随时可以搭配使用。\n", "\n", "例如,下面的函数式 API 示例重用了我们在上面的示例中定义的同一个 `Sampling` 层:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:34:00.036230Z", "iopub.status.busy": "2022-12-14T21:34:00.035692Z", "iopub.status.idle": "2022-12-14T21:34:10.244554Z", "shell.execute_reply": "2022-12-14T21:34:10.243702Z" }, "id": "be77fc8f9b26" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/3\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\r", " 1/938 [..............................] - ETA: 23:18 - loss: 0.3739" ] }, { "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\b\b\b\r", " 19/938 [..............................] - ETA: 2s - loss: 0.2266 " ] }, { "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", " 37/938 [>.............................] - ETA: 2s - loss: 0.1877" ] }, { "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", " 55/938 [>.............................] - ETA: 2s - loss: 0.1622" ] }, { "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", " 74/938 [=>............................] - ETA: 2s - loss: 0.1436" ] }, { "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", " 93/938 [=>............................] - ETA: 2s - loss: 0.1309" ] }, { "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", "112/938 [==>...........................] - ETA: 2s - loss: 0.1217" ] }, { "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", "131/938 [===>..........................] - ETA: 2s - loss: 0.1147" ] }, { "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", "150/938 [===>..........................] - ETA: 2s - loss: 0.1094" ] }, { "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", "169/938 [====>.........................] - ETA: 2s - loss: 0.1052" ] }, { "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", "188/938 [=====>........................] - ETA: 2s - loss: 0.1016" ] }, { "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", "207/938 [=====>........................] - ETA: 2s - loss: 0.0986" ] }, { "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", "226/938 [======>.......................] - ETA: 1s - loss: 0.0962" ] }, { "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", "245/938 [======>.......................] - ETA: 1s - loss: 0.0940" ] }, { "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", "264/938 [=======>......................] - ETA: 1s - loss: 0.0923" ] }, { "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", "282/938 [========>.....................] - ETA: 1s - loss: 0.0908" ] }, { "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", "301/938 [========>.....................] - ETA: 1s - loss: 0.0895" ] }, { "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", "320/938 [=========>....................] - ETA: 1s - loss: 0.0882" ] }, { "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", "339/938 [=========>....................] - ETA: 1s - loss: 0.0871" ] }, { "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", "358/938 [==========>...................] - ETA: 1s - loss: 0.0861" ] }, { "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", "377/938 [===========>..................] - ETA: 1s - loss: 0.0852" ] }, { "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", "396/938 [===========>..................] - ETA: 1s - loss: 0.0844" ] }, { "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", "414/938 [============>.................] - ETA: 1s - loss: 0.0837" ] }, { "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", "433/938 [============>.................] - ETA: 1s - loss: 0.0830" ] }, { "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", "452/938 [=============>................] - ETA: 1s - loss: 0.0823" ] }, { "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", "471/938 [==============>...............] - ETA: 1s - loss: 0.0817" ] }, { "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", "490/938 [==============>...............] - ETA: 1s - loss: 0.0812" ] }, { "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", "509/938 [===============>..............] - ETA: 1s - loss: 0.0807" ] }, { "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", "528/938 [===============>..............] - ETA: 1s - loss: 0.0803" ] }, { "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", "546/938 [================>.............] - ETA: 1s - loss: 0.0798" ] }, { "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", "564/938 [=================>............] - ETA: 1s - loss: 0.0794" ] }, { "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", "582/938 [=================>............] - ETA: 0s - loss: 0.0790" ] }, { "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", "601/938 [==================>...........] - ETA: 0s - loss: 0.0787" ] }, { "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", "620/938 [==================>...........] - ETA: 0s - loss: 0.0784" ] }, { "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", "638/938 [===================>..........] - ETA: 0s - loss: 0.0780" ] }, { "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", "657/938 [====================>.........] - ETA: 0s - loss: 0.0777" ] }, { "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", "675/938 [====================>.........] - ETA: 0s - loss: 0.0775" ] }, { "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", "694/938 [=====================>........] - ETA: 0s - loss: 0.0772" ] }, { "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", "713/938 [=====================>........] - ETA: 0s - loss: 0.0770" ] }, { "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", "732/938 [======================>.......] - ETA: 0s - loss: 0.0768" ] }, { "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", "750/938 [======================>.......] - ETA: 0s - loss: 0.0765" ] }, { "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", "768/938 [=======================>......] - ETA: 0s - loss: 0.0763" ] }, { "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", "786/938 [========================>.....] - ETA: 0s - loss: 0.0761" ] }, { "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", "804/938 [========================>.....] - ETA: 0s - loss: 0.0760" ] }, { "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", "822/938 [=========================>....] - ETA: 0s - loss: 0.0758" ] }, { "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", "840/938 [=========================>....] - ETA: 0s - loss: 0.0756" ] }, { "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", "859/938 [==========================>...] - ETA: 0s - loss: 0.0754" ] }, { "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", "877/938 [===========================>..] - ETA: 0s - loss: 0.0753" ] }, { "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", "894/938 [===========================>..] - ETA: 0s - loss: 0.0751" ] }, { "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", "912/938 [============================>.] - ETA: 0s - loss: 0.0750" ] }, { "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", "931/938 [============================>.] - ETA: 0s - loss: 0.0748" ] }, { "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", "938/938 [==============================] - 4s 3ms/step - loss: 0.0748\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 2/3\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\r", " 1/938 [..............................] - ETA: 3s - loss: 0.0650" ] }, { "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", " 20/938 [..............................] - ETA: 2s - loss: 0.0673" ] }, { "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", " 38/938 [>.............................] - ETA: 2s - loss: 0.0675" ] }, { "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", " 57/938 [>.............................] - ETA: 2s - loss: 0.0676" ] }, { "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", " 76/938 [=>............................] - ETA: 2s - loss: 0.0677" ] }, { "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", " 94/938 [==>...........................] - ETA: 2s - loss: 0.0678" ] }, { "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", "112/938 [==>...........................] - ETA: 2s - loss: 0.0676" ] }, { "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", "131/938 [===>..........................] - ETA: 2s - loss: 0.0678" ] }, { "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", "150/938 [===>..........................] - ETA: 2s - loss: 0.0678" ] }, { "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", "168/938 [====>.........................] - ETA: 2s - loss: 0.0678" ] }, { "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", "186/938 [====>.........................] - ETA: 2s - loss: 0.0678" ] }, { "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", "204/938 [=====>........................] - ETA: 2s - loss: 0.0678" ] }, { "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", "222/938 [======>.......................] - ETA: 2s - loss: 0.0678" ] }, { "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", "240/938 [======>.......................] - ETA: 1s - loss: 0.0679" ] }, { "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", "258/938 [=======>......................] - ETA: 1s - loss: 0.0679" ] }, { "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", "276/938 [=======>......................] - ETA: 1s - loss: 0.0678" ] }, { "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", "295/938 [========>.....................] - ETA: 1s - loss: 0.0678" ] }, { "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", "313/938 [=========>....................] - ETA: 1s - loss: 0.0678" ] }, { "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", "331/938 [=========>....................] - ETA: 1s - loss: 0.0678" ] }, { "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", "350/938 [==========>...................] - ETA: 1s - loss: 0.0678" ] }, { "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", "368/938 [==========>...................] - ETA: 1s - loss: 0.0678" ] }, { "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", "386/938 [===========>..................] - ETA: 1s - loss: 0.0678" ] }, { "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", "404/938 [===========>..................] - ETA: 1s - loss: 0.0678" ] }, { "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", "422/938 [============>.................] - ETA: 1s - loss: 0.0678" ] }, { "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", "441/938 [=============>................] - ETA: 1s - loss: 0.0678" ] }, { "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", "459/938 [=============>................] - ETA: 1s - loss: 0.0678" ] }, { "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", "477/938 [==============>...............] - ETA: 1s - loss: 0.0678" ] }, { "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", "496/938 [==============>...............] - ETA: 1s - loss: 0.0677" ] }, { "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", "514/938 [===============>..............] - ETA: 1s - loss: 0.0677" ] }, { "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", "532/938 [================>.............] - ETA: 1s - loss: 0.0677" ] }, { "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", "550/938 [================>.............] - ETA: 1s - loss: 0.0677" ] }, { "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", "568/938 [=================>............] - ETA: 1s - loss: 0.0677" ] }, { "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", "586/938 [=================>............] - ETA: 0s - loss: 0.0677" ] }, { "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", "604/938 [==================>...........] - ETA: 0s - loss: 0.0677" ] }, { "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", "622/938 [==================>...........] - ETA: 0s - loss: 0.0677" ] }, { "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", "640/938 [===================>..........] - ETA: 0s - loss: 0.0676" ] }, { "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", "658/938 [====================>.........] - ETA: 0s - loss: 0.0676" ] }, { "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", "676/938 [====================>.........] - ETA: 0s - loss: 0.0676" ] }, { "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", "694/938 [=====================>........] - ETA: 0s - loss: 0.0676" ] }, { "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", "712/938 [=====================>........] - ETA: 0s - loss: 0.0676" ] }, { "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", "731/938 [======================>.......] - ETA: 0s - loss: 0.0676" ] }, { "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", "749/938 [======================>.......] - ETA: 0s - loss: 0.0676" ] }, { "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", "767/938 [=======================>......] - ETA: 0s - loss: 0.0676" ] }, { "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", "785/938 [========================>.....] - ETA: 0s - loss: 0.0676" ] }, { "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", "803/938 [========================>.....] - ETA: 0s - loss: 0.0676" ] }, { "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", "821/938 [=========================>....] - ETA: 0s - loss: 0.0676" ] }, { "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", "839/938 [=========================>....] - ETA: 0s - loss: 0.0676" ] }, { "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", "857/938 [==========================>...] - ETA: 0s - loss: 0.0676" ] }, { "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", "875/938 [==========================>...] - ETA: 0s - loss: 0.0676" ] }, { "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", "893/938 [===========================>..] - ETA: 0s - loss: 0.0676" ] }, { "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", "911/938 [============================>.] - ETA: 0s - loss: 0.0676" ] }, { "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", "929/938 [============================>.] - ETA: 0s - loss: 0.0676" ] }, { "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", "938/938 [==============================] - 3s 3ms/step - loss: 0.0676\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 3/3\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\r", " 1/938 [..............................] - ETA: 3s - loss: 0.0672" ] }, { "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", " 19/938 [..............................] - ETA: 2s - loss: 0.0681" ] }, { "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", " 37/938 [>.............................] - ETA: 2s - loss: 0.0677" ] }, { "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", " 55/938 [>.............................] - ETA: 2s - loss: 0.0673" ] }, { "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", " 74/938 [=>............................] - ETA: 2s - loss: 0.0675" ] }, { "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", " 93/938 [=>............................] - ETA: 2s - loss: 0.0676" ] }, { "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", "111/938 [==>...........................] - ETA: 2s - loss: 0.0676" ] }, { "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", "129/938 [===>..........................] - ETA: 2s - loss: 0.0677" ] }, { "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", "148/938 [===>..........................] - ETA: 2s - loss: 0.0676" ] }, { "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", "167/938 [====>.........................] - ETA: 2s - loss: 0.0676" ] }, { "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", "185/938 [====>.........................] - ETA: 2s - loss: 0.0675" ] }, { "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", "203/938 [=====>........................] - ETA: 2s - loss: 0.0675" ] }, { "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", "221/938 [======>.......................] - ETA: 1s - loss: 0.0675" ] }, { "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", "239/938 [======>.......................] - ETA: 1s - loss: 0.0676" ] }, { "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", "257/938 [=======>......................] - ETA: 1s - loss: 0.0676" ] }, { "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", "275/938 [=======>......................] - ETA: 1s - loss: 0.0676" ] }, { "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", "294/938 [========>.....................] - ETA: 1s - loss: 0.0676" ] }, { "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", "312/938 [========>.....................] - ETA: 1s - loss: 0.0676" ] }, { "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", "331/938 [=========>....................] - ETA: 1s - loss: 0.0676" ] }, { "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", "349/938 [==========>...................] - ETA: 1s - loss: 0.0676" ] }, { "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", "367/938 [==========>...................] - ETA: 1s - loss: 0.0676" ] }, { "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", "386/938 [===========>..................] - ETA: 1s - loss: 0.0676" ] }, { "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", "404/938 [===========>..................] - ETA: 1s - loss: 0.0675" ] }, { "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", "422/938 [============>.................] - ETA: 1s - loss: 0.0675" ] }, { "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", "441/938 [=============>................] - ETA: 1s - loss: 0.0675" ] }, { "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", "460/938 [=============>................] - ETA: 1s - loss: 0.0675" ] }, { "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", "479/938 [==============>...............] - ETA: 1s - loss: 0.0675" ] }, { "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", "498/938 [==============>...............] - ETA: 1s - loss: 0.0676" ] }, { "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", "516/938 [===============>..............] - ETA: 1s - loss: 0.0676" ] }, { "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", "534/938 [================>.............] - ETA: 1s - loss: 0.0676" ] }, { "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", "552/938 [================>.............] - ETA: 1s - loss: 0.0675" ] }, { "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", "570/938 [=================>............] - ETA: 1s - loss: 0.0675" ] }, { "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", "588/938 [=================>............] - ETA: 0s - loss: 0.0675" ] }, { "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", "606/938 [==================>...........] - ETA: 0s - loss: 0.0675" ] }, { "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", "625/938 [==================>...........] - ETA: 0s - loss: 0.0675" ] }, { "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", "643/938 [===================>..........] - ETA: 0s - loss: 0.0676" ] }, { "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", "662/938 [====================>.........] - ETA: 0s - loss: 0.0676" ] }, { "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", "681/938 [====================>.........] - ETA: 0s - loss: 0.0676" ] }, { "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", "699/938 [=====================>........] - ETA: 0s - loss: 0.0675" ] }, { "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", "717/938 [=====================>........] - ETA: 0s - loss: 0.0675" ] }, { "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", "735/938 [======================>.......] - ETA: 0s - loss: 0.0675" ] }, { "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", "753/938 [=======================>......] - ETA: 0s - loss: 0.0675" ] }, { "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", "771/938 [=======================>......] - ETA: 0s - loss: 0.0675" ] }, { "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", "789/938 [========================>.....] - ETA: 0s - loss: 0.0676" ] }, { "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", "808/938 [========================>.....] - ETA: 0s - loss: 0.0676" ] }, { "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", "827/938 [=========================>....] - ETA: 0s - loss: 0.0676" ] }, { "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", "846/938 [==========================>...] - ETA: 0s - loss: 0.0676" ] }, { "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", "865/938 [==========================>...] - ETA: 0s - loss: 0.0676" ] }, { "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", "884/938 [===========================>..] - ETA: 0s - loss: 0.0676" ] }, { "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", "903/938 [===========================>..] - ETA: 0s - loss: 0.0676" ] }, { "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", "922/938 [============================>.] - ETA: 0s - loss: 0.0676" ] }, { "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", "938/938 [==============================] - 3s 3ms/step - loss: 0.0676\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "original_dim = 784\n", "intermediate_dim = 64\n", "latent_dim = 32\n", "\n", "# Define encoder model.\n", "original_inputs = tf.keras.Input(shape=(original_dim,), name=\"encoder_input\")\n", "x = layers.Dense(intermediate_dim, activation=\"relu\")(original_inputs)\n", "z_mean = layers.Dense(latent_dim, name=\"z_mean\")(x)\n", "z_log_var = layers.Dense(latent_dim, name=\"z_log_var\")(x)\n", "z = Sampling()((z_mean, z_log_var))\n", "encoder = tf.keras.Model(inputs=original_inputs, outputs=z, name=\"encoder\")\n", "\n", "# Define decoder model.\n", "latent_inputs = tf.keras.Input(shape=(latent_dim,), name=\"z_sampling\")\n", "x = layers.Dense(intermediate_dim, activation=\"relu\")(latent_inputs)\n", "outputs = layers.Dense(original_dim, activation=\"sigmoid\")(x)\n", "decoder = tf.keras.Model(inputs=latent_inputs, outputs=outputs, name=\"decoder\")\n", "\n", "# Define VAE model.\n", "outputs = decoder(z)\n", "vae = tf.keras.Model(inputs=original_inputs, outputs=outputs, name=\"vae\")\n", "\n", "# Add KL divergence regularization loss.\n", "kl_loss = -0.5 * tf.reduce_mean(z_log_var - tf.square(z_mean) - tf.exp(z_log_var) + 1)\n", "vae.add_loss(kl_loss)\n", "\n", "# Train.\n", "optimizer = tf.keras.optimizers.Adam(learning_rate=1e-3)\n", "vae.compile(optimizer, loss=tf.keras.losses.MeanSquaredError())\n", "vae.fit(x_train, x_train, epochs=3, batch_size=64)" ] }, { "cell_type": "markdown", "metadata": { "id": "e2f135ea7cf5" }, "source": [ "有关详情,请务必阅读[函数式 API](https://tensorflow.google.cn/guide/keras/functional/) 指南。" ] } ], "metadata": { "colab": { "collapsed_sections": [], "name": "custom_layers_and_models.ipynb", "toc_visible": true }, "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.16" } }, "nbformat": 4, "nbformat_minor": 0 }