{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "headers" }, "source": [ "Project: /overview/_project.yaml\n", "Book: /overview/_book.yaml\n", "\n", "\n", "\n", "\n", "\n", "\n", "{% comment %}\n", "The source of truth file can be found [here]: http://google3/zz\n", "{% endcomment %}" ] }, { "cell_type": "markdown", "metadata": { "id": "metadata" }, "source": [ "
TensorFlow.org で表示 | \n", "Google Colab で実行 | \n", "GitHubでソースを表示 | \n", "ノートブックをダウンロード | \n", "
tf.Variable
に関する計算の勾配を計算する、自動微分のための [tf.GradientTape](https://www.tensorflow.org/api_docs/python/tf/GradientTape) API があります。TensorFlow は、tf.GradientTape
のコンテキスト内で実行される関連の演算を「テープ」に「記録」します。その後、TensorFlow はそのテープを使い、[リバースモード微分](https://en.wikipedia.org/wiki/Automatic_differentiation)を使用して「記録」された計算の勾配を計算します。\n",
"\n",
"簡単な例を示します。"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"execution": {
"iopub.execute_input": "2022-12-14T20:39:03.115198Z",
"iopub.status.busy": "2022-12-14T20:39:03.114314Z",
"iopub.status.idle": "2022-12-14T20:39:06.430184Z",
"shell.execute_reply": "2022-12-14T20:39:06.429474Z"
},
"id": "Xq9GgTCP7a4A"
},
"outputs": [],
"source": [
"x = tf.Variable(3.0)\n",
"\n",
"with tf.GradientTape() as tape:\n",
" y = x**2"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "CR9tFAP_7cra"
},
"source": [
"いくつかの演算を記録してから、GradientTape.gradient(target, sources)
を使用して、いくつかのソース(多くの場合はモデルの変数)に対するいくつかのターゲット(多くの場合は損失)の勾配を計算します。"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"execution": {
"iopub.execute_input": "2022-12-14T20:39:06.434333Z",
"iopub.status.busy": "2022-12-14T20:39:06.433742Z",
"iopub.status.idle": "2022-12-14T20:39:06.444509Z",
"shell.execute_reply": "2022-12-14T20:39:06.443951Z"
},
"id": "LsvrwF6bHroC"
},
"outputs": [
{
"data": {
"text/plain": [
"6.0"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# dy = 2x * dx\n",
"dy_dx = tape.gradient(y, x)\n",
"dy_dx.numpy()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Q2_aqsO25Vx1"
},
"source": [
"上記の例ではスカラーを使用していますが、どのテンソルでもtf.GradientTape
は簡単に機能します。"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"execution": {
"iopub.execute_input": "2022-12-14T20:39:06.447752Z",
"iopub.status.busy": "2022-12-14T20:39:06.447253Z",
"iopub.status.idle": "2022-12-14T20:39:06.780778Z",
"shell.execute_reply": "2022-12-14T20:39:06.779994Z"
},
"id": "vacZ3-Ws5VdV"
},
"outputs": [],
"source": [
"w = tf.Variable(tf.random.normal((3, 2)), name='w')\n",
"b = tf.Variable(tf.zeros(2, dtype=tf.float32), name='b')\n",
"x = [[1., 2., 3.]]\n",
"\n",
"with tf.GradientTape(persistent=True) as tape:\n",
" y = x @ w + b\n",
" loss = tf.reduce_mean(y**2)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "i4eXOkrQ-9Pb"
},
"source": [
"両方の変数に関する `loss` 勾配を取得するには、両方をソースとして `gradient` メソッドに渡すことができます。テープはソースがどのように渡されるかについては柔軟であり、リストまたはディクショナリのネストされた組み合わせを受け入れ、同じ方法で構造化された勾配を返します(tf.nest
を参照)。"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"execution": {
"iopub.execute_input": "2022-12-14T20:39:06.785094Z",
"iopub.status.busy": "2022-12-14T20:39:06.784815Z",
"iopub.status.idle": "2022-12-14T20:39:06.798822Z",
"shell.execute_reply": "2022-12-14T20:39:06.798180Z"
},
"id": "luOtK1Da_BR0"
},
"outputs": [],
"source": [
"[dl_dw, dl_db] = tape.gradient(loss, [w, b])"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Ei4iVXi6qgM7"
},
"source": [
"各ソースに関する勾配には、ソースの形状があります。"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"execution": {
"iopub.execute_input": "2022-12-14T20:39:06.802293Z",
"iopub.status.busy": "2022-12-14T20:39:06.801756Z",
"iopub.status.idle": "2022-12-14T20:39:06.805526Z",
"shell.execute_reply": "2022-12-14T20:39:06.804854Z"
},
"id": "aYbWRFPZqk4U"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(3, 2)\n",
"(3, 2)\n"
]
}
],
"source": [
"print(w.shape)\n",
"print(dl_dw.shape)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "dI_SzxHsvao1"
},
"source": [
"下記もまた勾配計算ですが、この例では変数のディクショナリを渡します。"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"execution": {
"iopub.execute_input": "2022-12-14T20:39:06.808980Z",
"iopub.status.busy": "2022-12-14T20:39:06.808472Z",
"iopub.status.idle": "2022-12-14T20:39:06.815674Z",
"shell.execute_reply": "2022-12-14T20:39:06.815034Z"
},
"id": "d73cY6NOuaMd"
},
"outputs": [
{
"data": {
"text/plain": [
"tf.Module
あるいはそのサブクラスの 1 つ(layers.Layer
、keras.Model
)に収集するのは一般的です。\n",
"\n",
"ほとんどの場合は、モデルのトレーニング可能な変数に対する勾配を計算する必要があります。tf.Module
のすべてのサブクラスはそれらの変数をModule.trainable_variables
プロパティに集約するため、それらの勾配を数行のコードで計算することができます。 "
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"execution": {
"iopub.execute_input": "2022-12-14T20:39:06.819065Z",
"iopub.status.busy": "2022-12-14T20:39:06.818558Z",
"iopub.status.idle": "2022-12-14T20:39:06.839714Z",
"shell.execute_reply": "2022-12-14T20:39:06.839107Z"
},
"id": "JvesHtbQESc-"
},
"outputs": [],
"source": [
"layer = tf.keras.layers.Dense(2, activation='relu')\n",
"x = tf.constant([[1., 2., 3.]])\n",
"\n",
"with tf.GradientTape() as tape:\n",
" # Forward pass\n",
" y = layer(x)\n",
" loss = tf.reduce_mean(y**2)\n",
"\n",
"# Calculate gradients with respect to every trainable variable\n",
"grad = tape.gradient(loss, layer.trainable_variables)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"execution": {
"iopub.execute_input": "2022-12-14T20:39:06.843087Z",
"iopub.status.busy": "2022-12-14T20:39:06.842602Z",
"iopub.status.idle": "2022-12-14T20:39:06.846308Z",
"shell.execute_reply": "2022-12-14T20:39:06.845676Z"
},
"id": "PR_ezr6UFrpI"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"dense/kernel:0, shape: (3, 2)\n",
"dense/bias:0, shape: (2,)\n"
]
}
],
"source": [
"for var, g in zip(layer.trainable_variables, grad):\n",
" print(f'{var.name}, shape: {g.shape}')"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "f6Gx6LS714zR"
},
"source": [
"\n",
"\n",
"## テープの監視対象を制御する"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "N4VlqKFzzGaC"
},
"source": [
"デフォルトの動作では、トレーニング可能なtf.Variable
にアクセスした後、全ての演算を記録します。その理由は次の通りです。\n",
"\n",
"- 逆方向パスの勾配を計算するために、テープはフォワードパス中のどの演算を記録するか、知っておく必要があります。\n",
"- テープは中間出力への参照を保持するため、不要な演算を記録する必要はありません。\n",
"- 最も一般的な使用例として、モデルのトレーニング可能なすべての変数に対する損失の勾配の計算があります。\n",
"\n",
"たとえば、次の例ではデフォルトで tf.Tensor
が「監視」されておらず、tf.Variable
はトレーニング対象外であるため、勾配の計算ができません。"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"execution": {
"iopub.execute_input": "2022-12-14T20:39:06.849693Z",
"iopub.status.busy": "2022-12-14T20:39:06.849202Z",
"iopub.status.idle": "2022-12-14T20:39:06.857757Z",
"shell.execute_reply": "2022-12-14T20:39:06.857176Z"
},
"id": "Kj9gPckdB37a"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"tf.Tensor(6.0, shape=(), dtype=float32)\n",
"None\n",
"None\n",
"None\n"
]
}
],
"source": [
"# A trainable variable\n",
"x0 = tf.Variable(3.0, name='x0')\n",
"# Not trainable\n",
"x1 = tf.Variable(3.0, name='x1', trainable=False)\n",
"# Not a Variable: A variable + tensor returns a tensor.\n",
"x2 = tf.Variable(2.0, name='x2') + 1.0\n",
"# Not a variable\n",
"x3 = tf.constant(3.0, name='x3')\n",
"\n",
"with tf.GradientTape() as tape:\n",
" y = (x0**2) + (x1**2) + (x2**2)\n",
"\n",
"grad = tape.gradient(y, [x0, x1, x2, x3])\n",
"\n",
"for g in grad:\n",
" print(g)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "RkcpQnLgNxgi"
},
"source": [
"GradientTape.watched_variables
メソッドを使用すると、テープが監視している変数を一覧表示できます。"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"execution": {
"iopub.execute_input": "2022-12-14T20:39:06.860998Z",
"iopub.status.busy": "2022-12-14T20:39:06.860558Z",
"iopub.status.idle": "2022-12-14T20:39:06.865268Z",
"shell.execute_reply": "2022-12-14T20:39:06.864589Z"
},
"id": "hwNwjW1eAkib"
},
"outputs": [
{
"data": {
"text/plain": [
"['x0:0']"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"[var.name for var in tape.watched_variables()]"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "NB9I1uFvB4tf"
},
"source": [
"tf.GradientTape
は、ユーザーが監視対象や非監視対象を制御できるフックを提供します。\n",
"\n",
"tf.Tensor
に関する勾配を記録するには、GradientTape.watch(x)
を呼び出す必要があります。"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"execution": {
"iopub.execute_input": "2022-12-14T20:39:06.868361Z",
"iopub.status.busy": "2022-12-14T20:39:06.868101Z",
"iopub.status.idle": "2022-12-14T20:39:06.873294Z",
"shell.execute_reply": "2022-12-14T20:39:06.872669Z"
},
"id": "tVN1QqFRDHBK"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"6.0\n"
]
}
],
"source": [
"x = tf.constant(3.0)\n",
"with tf.GradientTape() as tape:\n",
" tape.watch(x)\n",
" y = x**2\n",
"\n",
"# dy = 2x * dx\n",
"dy_dx = tape.gradient(y, x)\n",
"print(dy_dx.numpy())"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "qxsiYnf2DN8K"
},
"source": [
"逆に、すべての`tf.Variables`を監視するデフォルトの動作を無効にするには、勾配テープの作成時に`watch_accessed_variables=False`を設定します。この計算には 2 つの変数を使用しますが、1 つの変数の勾配のみに接続します。"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"execution": {
"iopub.execute_input": "2022-12-14T20:39:06.876711Z",
"iopub.status.busy": "2022-12-14T20:39:06.876168Z",
"iopub.status.idle": "2022-12-14T20:39:06.885622Z",
"shell.execute_reply": "2022-12-14T20:39:06.884975Z"
},
"id": "7QPzwWvSEwIp"
},
"outputs": [],
"source": [
"x0 = tf.Variable(0.0)\n",
"x1 = tf.Variable(10.0)\n",
"\n",
"with tf.GradientTape(watch_accessed_variables=False) as tape:\n",
" tape.watch(x1)\n",
" y0 = tf.math.sin(x0)\n",
" y1 = tf.nn.softplus(x1)\n",
" y = y0 + y1\n",
" ys = tf.reduce_sum(y)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "TRduLbE1H2IJ"
},
"source": [
"GradientTape.watch
は`x0`で呼び出されなかったため、それに関する勾配は計算されません。"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"execution": {
"iopub.execute_input": "2022-12-14T20:39:06.889141Z",
"iopub.status.busy": "2022-12-14T20:39:06.888629Z",
"iopub.status.idle": "2022-12-14T20:39:06.894639Z",
"shell.execute_reply": "2022-12-14T20:39:06.893967Z"
},
"id": "e6GM-3evH1Sz"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"dy/dx0: None\n",
"dy/dx1: 0.9999546\n"
]
}
],
"source": [
"# dys/dx1 = exp(x1) / (1 + exp(x1)) = sigmoid(x1)\n",
"grad = tape.gradient(ys, {'x0': x0, 'x1': x1})\n",
"\n",
"print('dy/dx0:', grad['x0'])\n",
"print('dy/dx1:', grad['x1'].numpy())"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "2g1nKB6P-OnA"
},
"source": [
"## 中間結果\n",
"\n",
"tf.GradientTape
コンテキスト中で計算された中間の値に対する出力の勾配をリクエストすることもできます。"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"execution": {
"iopub.execute_input": "2022-12-14T20:39:06.897952Z",
"iopub.status.busy": "2022-12-14T20:39:06.897447Z",
"iopub.status.idle": "2022-12-14T20:39:06.903553Z",
"shell.execute_reply": "2022-12-14T20:39:06.902945Z"
},
"id": "7XaPRAwUyYms"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"18.0\n"
]
}
],
"source": [
"x = tf.constant(3.0)\n",
"\n",
"with tf.GradientTape() as tape:\n",
" tape.watch(x)\n",
" y = x * x\n",
" z = y * y\n",
"\n",
"# Use the tape to compute the gradient of z with respect to the\n",
"# intermediate value y.\n",
"# dz_dy = 2 * y and y = x ** 2 = 9\n",
"print(tape.gradient(z, y).numpy())"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ISkXuY7YzIcS"
},
"source": [
"デフォルトでは、ある `GradientTape` に保持されたリソースは、GradientTape.gradient
メソッドが呼び出されるとすぐに解放されます。同じ計算で複数の勾配を計算する場合は、`persistent=True` を指定した勾配テープを作成します。こうすると、テープオブジェクトのガベージコレクションを実行するときにリソースが解放されるため、`gradient` メソッドを何度も呼び出すことができます。例を示します。"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"execution": {
"iopub.execute_input": "2022-12-14T20:39:06.907040Z",
"iopub.status.busy": "2022-12-14T20:39:06.906542Z",
"iopub.status.idle": "2022-12-14T20:39:06.913135Z",
"shell.execute_reply": "2022-12-14T20:39:06.912510Z"
},
"id": "zZaCm3-9zVCi"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 4. 108.]\n",
"[2. 6.]\n"
]
}
],
"source": [
"x = tf.constant([1, 3.0])\n",
"with tf.GradientTape(persistent=True) as tape:\n",
" tape.watch(x)\n",
" y = x * x\n",
" z = y * y\n",
"\n",
"print(tape.gradient(z, x).numpy()) # [4.0, 108.0] (4 * x**3 at x = [1.0, 3.0])\n",
"print(tape.gradient(y, x).numpy()) # [2.0, 6.0] (2 * x at x = [1.0, 3.0])"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"execution": {
"iopub.execute_input": "2022-12-14T20:39:06.916293Z",
"iopub.status.busy": "2022-12-14T20:39:06.915806Z",
"iopub.status.idle": "2022-12-14T20:39:06.918697Z",
"shell.execute_reply": "2022-12-14T20:39:06.918103Z"
},
"id": "j8bv_jQFg6CN"
},
"outputs": [],
"source": [
"del tape # Drop the reference to the tape"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "O_ZY-9BUB7vX"
},
"source": [
"## パフォーマンスに関する注記\n",
"\n",
"- 勾配テープコンテキスト内の演算の実行に伴う、少量のオーバーヘッドがあります。ほとんどの Eager Execution では、これは目立ったコストにはなりませんが、それでもテープコンテキストは必要な領域のみで使用すべきです。\n",
"\n",
"- 勾配テープは、メモリを使用して入力と出力を含む中間結果を格納し、逆方向パス中に使用します。\n",
"\n",
" `ReLU`などの一部の演算は、中間結果を保持する必要がないため、効率を上げるためにフォワードパス中に削除されます。ただし、テープに`persistent=True`を使用している場合は*何も破棄されない*ため、ピーク時のメモリ使用量が高くなります。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "9dLBpZsJebFq"
},
"source": [
"## 非スカラーのターゲットの勾配"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "7pldU9F5duP2"
},
"source": [
"勾配は基本的にスカラーの演算です。"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"execution": {
"iopub.execute_input": "2022-12-14T20:39:06.922124Z",
"iopub.status.busy": "2022-12-14T20:39:06.921645Z",
"iopub.status.idle": "2022-12-14T20:39:06.929332Z",
"shell.execute_reply": "2022-12-14T20:39:06.928734Z"
},
"id": "qI0sDV_WeXBb"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"4.0\n",
"-0.25\n"
]
}
],
"source": [
"x = tf.Variable(2.0)\n",
"with tf.GradientTape(persistent=True) as tape:\n",
" y0 = x**2\n",
" y1 = 1 / x\n",
"\n",
"print(tape.gradient(y0, x).numpy())\n",
"print(tape.gradient(y1, x).numpy())"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "COEyYp34fxj4"
},
"source": [
"したがって、複数のターゲットの勾配を求める場合、各ソースの結果は次のようになります。\n",
"\n",
"- ターゲットの合計の勾配、あるいは\n",
"- 各ターゲットの勾配の合計"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"execution": {
"iopub.execute_input": "2022-12-14T20:39:06.932749Z",
"iopub.status.busy": "2022-12-14T20:39:06.932224Z",
"iopub.status.idle": "2022-12-14T20:39:06.938964Z",
"shell.execute_reply": "2022-12-14T20:39:06.938320Z"
},
"id": "o4a6_YOcfWKS"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"3.75\n"
]
}
],
"source": [
"x = tf.Variable(2.0)\n",
"with tf.GradientTape() as tape:\n",
" y0 = x**2\n",
" y1 = 1 / x\n",
"\n",
"print(tape.gradient({'y0': y0, 'y1': y1}, x).numpy())"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "uvP-mkBMgbym"
},
"source": [
"同様に、ターゲットがスカラーでない場合は、合計の勾配が計算されます。"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"execution": {
"iopub.execute_input": "2022-12-14T20:39:06.942017Z",
"iopub.status.busy": "2022-12-14T20:39:06.941527Z",
"iopub.status.idle": "2022-12-14T20:39:06.947559Z",
"shell.execute_reply": "2022-12-14T20:39:06.946900Z"
},
"id": "DArPWqsSh5un"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"7.0\n"
]
}
],
"source": [
"x = tf.Variable(2.)\n",
"\n",
"with tf.GradientTape() as tape:\n",
" y = x * [3., 4.]\n",
"\n",
"print(tape.gradient(y, x).numpy())"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "flDbx68Zh5Lb"
},
"source": [
"これにより、損失を集めた合計の勾配、または要素ごとの損失計算の合計の勾配の取得が容易になります。\n",
"\n",
"アイテムごとに個別の勾配が必要な場合は、[Jacobians(ヤコビアン)](advanced_autodiff.ipynb#jacobians)をご覧ください。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "iwFswok8RAly"
},
"source": [
"場合によっては、ヤコビアンをスキップすることができます。要素についての計算の場合、各要素は独立しているため、合計の勾配は入力要素に対する各要素の導関数を与えます。"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"execution": {
"iopub.execute_input": "2022-12-14T20:39:06.951017Z",
"iopub.status.busy": "2022-12-14T20:39:06.950477Z",
"iopub.status.idle": "2022-12-14T20:39:06.985875Z",
"shell.execute_reply": "2022-12-14T20:39:06.985225Z"
},
"id": "JQvk_jnMmTDS"
},
"outputs": [],
"source": [
"x = tf.linspace(-10.0, 10.0, 200+1)\n",
"\n",
"with tf.GradientTape() as tape:\n",
" tape.watch(x)\n",
" y = tf.nn.sigmoid(x)\n",
"\n",
"dy_dx = tape.gradient(y, x)"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"execution": {
"iopub.execute_input": "2022-12-14T20:39:06.989146Z",
"iopub.status.busy": "2022-12-14T20:39:06.988682Z",
"iopub.status.idle": "2022-12-14T20:39:07.159342Z",
"shell.execute_reply": "2022-12-14T20:39:07.158761Z"
},
"id": "e_f2QgDPmcPE"
},
"outputs": [
{
"data": {
"image/png": "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GANFFn2pBoWDF+d5H330URYuXMjMmTOJi4vjiSeeYNWqVfTs2ZPbbruNcePGsWLFCs466ywAVq9ezW+//cYXX3zh2cZXX33F+eefT1RUFC6Xi2uuuYb4+HiWL19OZmbmCf1Phg8fzjfffMPNN9/MkiVL+O677/j3v//N0qVLCQ8Pr5Zfg4iUb+pP2xn39R8AXN4tkZf/1IPQIF2yK+J/YaQoD8Y3tea9n9gLwQ0qtWhOTg7vvPMO06ZN46KLLgLg/fffp3nz5gA0b96cQYMGMXXqVE8YmTp1KgMHDqRNmzae7cycOZOrrroKgHnz5rFhwwa+++47mjZ1/w7Gjx/P4MGDy7z3m2++Sffu3XnggQf44osv+Mc//kHv3r1Pb99F5KRenbeZV+ZtAuDW/q146oou6h8iUkKnaSyydetWHA4HycnJnmmNGjUqc8O8O++8k//85z8UFBTgcDj4+OOPue222zzzs7KyWLhwIVdeeSUA69evJykpyRNEAPr163fCezds2JB33nmHN954g7Zt26q/iUgNe2XuJk8QGX1xB8YOURAROZb/tYwEhbtbKKx672o0ZMgQQkJC+PLLLwkODqaoqIjrrrvOM//bb7+lS5cuJCUleb3tRYsWERAQwL59+8jNzSUyUgMridSEV+dt5tX57j5aYwZ34u6BbS2uSKTu8b+WEZvNfarEiocX/UXatm1LUFAQy5cv90w7fPgwmzZt8rwODAxkxIgRTJ06lalTp3LDDTcQFhbmmX/sKRqAzp07s3v3bvbt2+eZtmzZshPee8mSJTz//PN8/fXXREREcN9991W6bhGpvKk/bfe0iCiIiFTM/1pGfERERAS33347jz76KI0bNyYuLo6//e1v2O1l8+Edd9xB586dAfjpp58804uLi/n222/561//6pmWkpJChw4dGDFiBC+++CJZWVn87W9/K7O97OxsbrnlFh544AEGDx5M8+bNOeussxgyZEiZVhcROT0z16R6OquOvriDgojISfhfy4gPefHFFzn33HMZMmQIKSkpnHPOOSd0JG3fvj39+/enU6dOZfqXLFy4kIiICM4880zPNLvdzpdffkl+fj59+/bljjvu4Nlnny2zvQcffJAGDRowfvx4ALp168b48eO5++67SU1NrcG9Fak/lmzN4JFPfwXcnVXvv7CdxRWJ1G02Y4yxuohTycrK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TuvWrQkLC6Nt27aMHTsWh8Nx0vXq+jGcPHkyrVq1IjQ0lOTkZH7++eeTLv/ZZ5/RqVMnQkND6datG7Nnz66lSr0zYcIEzjrrLCIjI4mLi2Po0KFs3LjxpOu89957Jxyr0NDQWqrYe//4xz9OqLdTp04nXcdXjh+U/3lis9kYNWpUucvX9eO3aNEihgwZQtOmTbHZbMyYMaPMfGMMTz31FImJiYSFhZGSksLmzZtPuV1v/4a95fdhxOFwcP3113PPPfeUO9/pdHL55ZfjcDhYsmQJ77//Pu+99x5PPfXUSbd78803s27dOubOncs333zDokWLuOuuu2piFyqtf//+7Nu3r8zjjjvuoHXr1vTp0+ek6955551l1nvhhRdqqeqqefrpp8vUe//99590+Ycffpivv/6azz77jIULF7J3716uueaaWqq28jZs2IDL5eLNN99k3bp1vPLKK0yZMoUnnnjilOvW1WM4ffp0Ro8ezdixY1m1ahU9evRg0KBB7N+/v9zllyxZwo033sjtt9/O6tWrGTp0KEOHDuX333+v5cpPbeHChYwaNYply5Yxd+5cioqKuOSSS8jNzT3pelFRUWWO1c6dO2up4qo544wzytS7ePHiCpf1peMHsGLFijL7NnfuXACuv/76Ctepy8cvNzeXHj16MHny5HLnv/DCC/zzn/9kypQpLF++nAYNGjBo0CAKCgoq3Ka3f8NVYuqJqVOnmujo6BOmz54929jtdpOWluaZ9sYbb5ioqChTWFhY7rb++OMPA5gVK1Z4pn377bfGZrOZ1NTUaq+9qhwOh2nSpIl5+umnT7rcwIEDzYMPPlg7RVWDli1bmldeeaXSyx85csQEBQWZzz77zDNt/fr1BjBLly6tgQqr1wsvvGBat2590mXq8jHs27evGTVqlOe10+k0TZs2NRMmTCh3+T/96U/m8ssvLzMtOTnZ3H333TVaZ3XYv3+/AczChQsrXKaiz6K6auzYsaZHjx6VXt6Xj58xxjz44IOmbdu2xuVylTvfl44fYL788kvPa5fLZRISEsyLL77omXbkyBETEhJi/vOf/1S4HW//hqvC71tGTmXp0qV069aN+Ph4z7RBgwaRlZXFunXrKlwnJiamTGtDSkoKdrud5cuX13jNlfXVV19x8OBBRo4cecplP/roI2JjY+natStjxowhLy+vFiqsuueee47GjRvTq1cvXnzxxZOeVlu5ciVFRUWkpKR4pnXq1IkWLVqwdOnS2ij3tGRmZtKoUaNTLlcXj6HD4WDlypVlfvd2u52UlJQKf/dLly4tszy4/yZ95VgBpzxeOTk5tGzZkqSkJK666qoKP2vqis2bN9O0aVPatGnDzTffzK5duypc1pePn8PhYNq0adx2220nvSmrrx2/Utu3byctLa3M8YmOjiY5ObnC41OVv+Gq8Ikb5dWktLS0MkEE8LxOS0urcJ24uLgy0wIDA2nUqFGF61jhnXfeYdCgQae8yeBNN91Ey5Ytadq0Kb/99huPPfYYGzdu5IsvvqilSr3zwAMPcOaZZ9KoUSOWLFnCmDFj2LdvHxMnTix3+bS0NIKDg0/oMxQfH1+njld5tmzZwmuvvcZLL7100uXq6jHMyMjA6XSW+ze2YcOGctep6G+yrh8rl8vFQw89xIABA+jatWuFy3Xs2JF3332X7t27k5mZyUsvvUT//v1Zt25djd4QtKqSk5N577336NixI/v27WPcuHGce+65/P7770RGRp6wvK8eP4AZM2Zw5MgRbr311gqX8bXjd6zSY+DN8anK33BV+GQYefzxx3n++edPusz69etP2cnKV1Rlf/fs2cN3333Hp59+esrtH9vXpVu3biQmJnLRRRexdetW2rZtW/XCveDNPo4ePdozrXv37gQHB3P33XczYcKEOjtcc1WOYWpqKpdeeinXX389d95550nXrQvHsL4bNWoUv//++0n7UwD069ePfv36eV7379+fzp078+abb/LMM8/UdJleGzx4sOd59+7dSU5OpmXLlnz66afcfvvtFlZW/d555x0GDx5M06ZNK1zG146fr/DJMPLII4+cNLkCtGnTplLbSkhIOKFXcOlVFgkJCRWuc3zHneLiYg4dOlThOqejKvs7depUGjduzJVXXun1+yUnJwPu/5XX1hfZ6RzT5ORkiouL2bFjBx07djxhfkJCAg6HgyNHjpRpHUlPT6+R41Ueb/dv7969XHDBBfTv35+33nrL6/ez4hiWJzY2loCAgBOuXDrZ7z4hIcGr5euC++67z9OR3dv/HQcFBdGrVy+2bNlSQ9VVr5iYGDp06FBhvb54/AB27tzJvHnzvG5N9KXjV3oM0tPTSUxM9ExPT0+nZ8+e5a5Tlb/hKqm23id13Kk6sKanp3umvfnmmyYqKsoUFBSUu63SDqy//PKLZ9p3331XZzqwulwu07p1a/PII49Uaf3FixcbwPz666/VXFnNmDZtmrHb7ebQoUPlzi/twPr55597pm3YsKHOdmDds2ePad++vbnhhhtMcXFxlbZRl45h3759zX333ed57XQ6TbNmzU7agfWKK64oM61fv351sgOky+Uyo0aNMk2bNjWbNm2q0jaKi4tNx44dzcMPP1zN1dWM7Oxs07BhQ/Pqq6+WO9+Xjt+xxo4daxISEkxRUZFX69Xl40cFHVhfeuklz7TMzMxKdWD15m+4SrVW25bqqJ07d5rVq1ebcePGmYiICLN69WqzevVqk52dbYxx/0Pq2rWrueSSS8yaNWvMnDlzTJMmTcyYMWM821i+fLnp2LGj2bNnj2fapZdeanr16mWWL19uFi9ebNq3b29uvPHGWt+/8sybN88AZv369SfM27Nnj+nYsaNZvny5McaYLVu2mKefftr88ssvZvv27WbmzJmmTZs25rzzzqvtsitlyZIl5pVXXjFr1qwxW7duNdOmTTNNmjQxw4cP9yxz/D4aY8xf/vIX06JFC/P999+bX375xfTr18/069fPil04qT179ph27dqZiy66yOzZs8fs27fP8zh2GV86hp988okJCQkx7733nvnjjz/MXXfdZWJiYjxXsN1yyy3m8ccf9yz/008/mcDAQPPSSy+Z9evXm7Fjx5qgoCCzdu1aq3ahQvfcc4+Jjo42CxYsKHOs8vLyPMscv3/jxo0z3333ndm6datZuXKlueGGG0xoaKhZt26dFbtwSo888ohZsGCB2b59u/npp59MSkqKiY2NNfv37zfG+PbxK+V0Ok2LFi3MY489dsI8Xzt+2dnZnu85wEycONGsXr3a7Ny50xhjzHPPPWdiYmLMzJkzzW+//Wauuuoq07p1a5Ofn+/ZxoUXXmhee+01z+tT/Q1XB78PIyNGjDDACY8ffvjBs8yOHTvM4MGDTVhYmImNjTWPPPJImXT8ww8/GMBs377dM+3gwYPmxhtvNBERESYqKsqMHDnSE3CsduONN5r+/fuXO2/79u1l9n/Xrl3mvPPOM40aNTIhISGmXbt25tFHHzWZmZm1WHHlrVy50iQnJ5vo6GgTGhpqOnfubMaPH1+mFev4fTTGmPz8fHPvvfeahg0bmvDwcHP11VeX+YKvK6ZOnVruv9djGzF98Ri+9tprpkWLFiY4ONj07dvXLFu2zDNv4MCBZsSIEWWW//TTT02HDh1McHCwOeOMM8ysWbNqueLKqehYTZ061bPM8fv30EMPeX4X8fHx5rLLLjOrVq2q/eIradiwYSYxMdEEBwebZs2amWHDhpktW7Z45vvy8Sv13XffGcBs3LjxhHm+dvxKv6+Of5Tug8vlMk8++aSJj483ISEh5qKLLjphv1u2bGnGjh1bZtrJ/oarg80YY6rvpI+IiIiId+r9OCMiIiJiLYURERERsZTCiIiIiFhKYUREREQspTAiIiIillIYEREREUspjIiIiIilFEZERETEUgojIiIiYimFEREREbGUwoiIiIhYSmFERGrdgQMHSEhIYPz48Z5pS5YsITg4mPnz51tYmYhYQTfKExFLzJ49m6FDh7JkyRI6duxIz549ueqqq5g4caLVpYlILVMYERHLjBo1innz5tGnTx/Wrl3LihUrCAkJsbosEallCiMiYpn8/Hy6du3K7t27WblyJd26dbO6JBGxgPqMiIhltm7dyt69e3G5XOzYscPqckTEImoZERFLOBwO+vbtS8+ePenYsSOTJk1i7dq1xMXFWV2aiNQyhRERscSjjz7K559/zq+//kpERAQDBw4kOjqab775xurSRKSW6TSNiNS6BQsWMGnSJD788EOioqKw2+18+OGH/Pjjj7zxxhtWlycitUwtIyIiImIptYyIiIiIpRRGRERExFIKIyIiImIphRERERGxlMKIiIiIWEphRERERCylMCIiIiKWUhgRERERSymMiIiIiKUURkRERMRSCiMiIiJiqf8PTCdlTkI8lFsAAAAASUVORK5CYII=\n",
"text/plain": [
"