diff --git a/Tensorflow/TensorFlow2.0/11 联邦学习.ipynb b/Tensorflow/TensorFlow2.0/11 联邦学习.ipynb index 3040fc5f..69f42296 100644 --- a/Tensorflow/TensorFlow2.0/11 联邦学习.ipynb +++ b/Tensorflow/TensorFlow2.0/11 联邦学习.ipynb @@ -10,12 +10,12 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.8" + "version": "3.6.9" }, "orig_nbformat": 2, "kernelspec": { - "name": "python388jvsc74a57bd0238245627cfcfafd0885ed67ad6caa77217e3abcf58754ab647d5e61878a8b28", - "display_name": "Python 3.8.8 64-bit ('tensorflow': conda)" + "name": "python369jvsc74a57bd04b23302ac1afbd304ec4e8c0fc43b716576fbc7dc9e2bf77d7de3e404cbbffbc", + "display_name": "Python 3.6.9 64-bit ('tensorflow')" } }, "nbformat": 4, @@ -26,7 +26,16 @@ "# 开始\n", "\n", "> tensorflow的学习成本有点高。而且。现在好像更多的人pytorch在做训练。改成pytorch吧。改天回来复习这一块,试一试能不能用上。\n", - "> 我发现我这种菜鸡,无论是什么框架都搞不出来。这几天,先把这个搞定。然后按着计划复习。" + "> 我发现我这种菜鸡,无论是什么框架都搞不出来。这几天,先把这个搞定。然后按着计划复习。\n", + "\n", + "## 实现过程\n", + "\n", + "1. 通过tff.simulation.datasets加载tff.simulation.ClientData类型的数据集。\n", + "2. 并使用tf.data.dataset处理数据集。\n", + "3.1. 通过tf.keras.models和tff.learning.Model构造联邦学习模型。\n", + "3.2. 通过tff.learning.build_federated_averaging_process实现联邦聚合算法。通过tf.keras实现前向传播算法。\n", + "3.3. 通过tf.kerase.loss实现损失计算方法\n", + "3.4. 通过tf.kerase.optimizers.SGD实现优化算法" ], "cell_type": "markdown", "metadata": {} @@ -36,6 +45,18 @@ "execution_count": 1, "metadata": {}, "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "WARNING:tensorflow:From /home/ykl/.virtualenvs/tensorflow/lib/python3.6/site-packages/tensorflow_federated/python/core/impl/compiler/tensorflow_computation_transformations.py:59: extract_sub_graph (from tensorflow.python.framework.graph_util_impl) is deprecated and will be removed in a future version.\n", + "Instructions for updating:\n", + "Use `tf.compat.v1.graph_util.extract_sub_graph`\n", + "WARNING:tensorflow:From /home/ykl/.virtualenvs/tensorflow/lib/python3.6/site-packages/tensorflow_federated/python/core/impl/compiler/tensorflow_computation_transformations.py:59: extract_sub_graph (from tensorflow.python.framework.graph_util_impl) is deprecated and will be removed in a future version.\n", + "Instructions for updating:\n", + "Use `tf.compat.v1.graph_util.extract_sub_graph`\n" + ] + }, { "output_type": "execute_result", "data": { @@ -63,11 +84,29 @@ "tff.federated_computation(lambda: 'Hello, World!')()" ] }, + { + "source": [ + "## 1 加载数据\n", + "\n", + "× 通过tff.simulation.datasets加载实验数据。返回多个tff.simulation.ClientData实例。" + ], + "cell_type": "markdown", + "metadata": {} + }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Downloading data from https://storage.googleapis.com/tff-datasets-public/fed_emnist_digitsonly.tar.bz2\n", + "97402880/97398400 [==============================] - 10s 0us/step\n" + ] + } + ], "source": [ "# 1 加载数据\n", "emnist_train, emnist_test = tff.simulation.datasets.emnist.load_data()" @@ -75,16 +114,14 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 8, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ - "3383\n", - "OrderedDict([('label', TensorSpec(shape=(), dtype=tf.int32, name=None)), ('pixels', TensorSpec(shape=(28, 28), dtype=tf.float32, name=None))])\n", - "5\n" + "3383\nOrderedDict([('label', TensorSpec(shape=(), dtype=tf.int32, name=None)), ('pixels', TensorSpec(shape=(28, 28), dtype=tf.float32, name=None))])\nodict_keys(['label', 'pixels'])\n5\ntf.Tensor(\n[[1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. ]\n [1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. ]\n [1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. ]\n [1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. ]\n [1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. ]\n [1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. ]\n [1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. ]\n [1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 0.99607843\n 0.99215686 0.99607843 1. 1. 1. 1.\n 1. 1. 1. 1. ]\n [1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 0.9882353 0.9882353 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. ]\n [1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 0.99215686 1. 1. 1. 1.\n 0.8117647 0.91764706 1. 0.99607843 1. 1.\n 1. 1. 1. 1. ]\n [1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 0.9882353 1. 1. 0.7176471 0.3137255 0.14117648\n 0.02352941 0.47058824 1. 0.9882353 1. 1.\n 1. 1. 1. 1. ]\n [1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 0.9882353\n 1. 0.7647059 0.16078432 0.11372549 0.33333334 0.5803922\n 0.88235295 0.98039216 0.99607843 1. 1. 1.\n 1. 1. 1. 1. ]\n [1. 1. 1. 1. 1. 1.\n 1. 1. 1. 0.99607843 1. 1.\n 0.6901961 0.2627451 0.64705884 0.9764706 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. ]\n [1. 1. 1. 1. 1. 1.\n 1. 1. 0.99607843 0.98039216 0.99607843 0.38039216\n 0.29803923 1. 1. 1. 0.9843137 0.9882353\n 0.99215686 1. 1. 1. 1. 1.\n 1. 1. 1. 1. ]\n [1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 0.18431373\n 0.25882354 0.92941177 0.98039216 0.99215686 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. ]\n [1. 1. 1. 1. 1. 1.\n 0.99607843 0.99607843 0.9137255 0.5019608 0.92156863 1.\n 0.08627451 0.3882353 1. 0.9843137 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. ]\n [1. 1. 1. 1. 1. 1.\n 0.9882353 1. 0.42745098 0.01176471 0.5529412 0.56078434\n 0.05882353 0.7294118 0.99607843 0.9882353 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. ]\n [1. 1. 1. 1. 1. 1.\n 0.99607843 1. 0.92156863 0.48235294 0.23529412 0.23529412\n 0.6901961 1. 0.99607843 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. ]\n [1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 0.99607843 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. ]\n [1. 1. 1. 1. 1. 1.\n 1. 1. 0.99607843 0.9843137 0.9882353 0.9882353\n 0.9882353 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. ]\n [1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. ]\n [1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. ]\n [1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. ]\n [1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. ]\n [1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. ]\n [1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. ]\n [1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. ]\n [1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. 1. 1.\n 1. 1. 1. 1. ]], shape=(28, 28), dtype=float32)\n" ] } ], @@ -99,29 +136,30 @@ "\n", "example_element = next(iter(example_dataset))\n", "\n", - "print(example_element['label'].numpy())" + "print(example_element.keys())\n", + "print(example_element['label'].numpy())\n", + "print(example_element['pixels'])" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 4, "metadata": {}, "outputs": [ { - "output_type": "error", - "ename": "ImportError", - "evalue": "DLL load failed while importing ft2font: 找不到指定的模块。", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mImportError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[0mmatplotlib\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mpyplot\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mimshow\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mexample_element\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'pixels'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mnumpy\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcmap\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'gray'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0maspect\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'equal'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mgrid\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;32mFalse\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[0m_\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshow\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mD:\\anaconda\\envs\\tensorflow\\lib\\site-packages\\matplotlib\\__init__.py\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 172\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 173\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 174\u001b[1;33m \u001b[0m_check_versions\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 175\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 176\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mD:\\anaconda\\envs\\tensorflow\\lib\\site-packages\\matplotlib\\__init__.py\u001b[0m in \u001b[0;36m_check_versions\u001b[1;34m()\u001b[0m\n\u001b[0;32m 157\u001b[0m \u001b[1;31m# Quickfix to ensure Microsoft Visual C++ redistributable\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 158\u001b[0m \u001b[1;31m# DLLs are loaded before importing kiwisolver\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 159\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[1;33m.\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mft2font\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 160\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 161\u001b[0m for modname, minver in [\n", - "\u001b[1;31mImportError\u001b[0m: DLL load failed while importing ft2font: 找不到指定的模块。" - ] + "output_type": "display_data", + "data": { + "text/plain": "
", + "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-05-06T19:39:48.714997\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + } } ], "source": [ + "# 1 查看数据几中的数据。\n", "from matplotlib import pyplot as plt\n", "plt.imshow(example_element['pixels'].numpy(), cmap='gray', aspect='equal')\n", "plt.grid(False)\n", @@ -130,27 +168,474 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 9, "metadata": {}, "outputs": [ { - "output_type": "error", - "ename": "ImportError", - "evalue": "DLL load failed while importing ft2font: 找不到指定的模块。", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mImportError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mimport\u001b[0m \u001b[0mmatplotlib\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpyplot\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[1;32mD:\\anaconda\\envs\\tensorflow\\lib\\site-packages\\matplotlib\\__init__.py\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 172\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 173\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 174\u001b[1;33m \u001b[0m_check_versions\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 175\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 176\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mD:\\anaconda\\envs\\tensorflow\\lib\\site-packages\\matplotlib\\__init__.py\u001b[0m in \u001b[0;36m_check_versions\u001b[1;34m()\u001b[0m\n\u001b[0;32m 157\u001b[0m \u001b[1;31m# Quickfix to ensure Microsoft Visual C++ redistributable\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 158\u001b[0m \u001b[1;31m# DLLs are loaded before importing kiwisolver\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 159\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[1;33m.\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mft2font\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 160\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 161\u001b[0m for modname, minver in [\n", - "\u001b[1;31mImportError\u001b[0m: DLL load failed while importing ft2font: 找不到指定的模块。" + "output_type": "display_data", + "data": { + "text/plain": "
", + "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-05-06T19:49:43.314200\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", + "image/png": "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jOMaXQN96ThYPka99Pd5DXRGvOM+FVjZkvT444+js7MTjz/+OPbt24c777wTdXV1sNvt67E9l3Fcw6tn5WeVybcnAchk5SNjuOKy3oviPFG+ZWydxqai9bl6ViT+wd7sRgdmVnOPeMKuPJ6MY+4RO57CwkJs2LABTqeTJYE55k/1raRcYn+pUqlQWlqKdDoNi8XCyrgcJMZKo9HA7Xbjfe97HzZu3IjKykqYTCbpaxjT3HBpnOT/zhgqmzgJdjqdqK2txZ133onGxkZ4vV4YjUbGLwfJ+062xdwhzhOVWFmckcoOMQsnZucutY6DdLaMFWtS2XEpVuisq1w/RpwxXHFZcby0ouPNBukZbpOMI9tivliTKivxOuiCggIUFhYCWLd3I+PIsU2+eMdxTKVSEAQBfX19UKlUaGhokCZbrJZbV3wv5ofLquwQ25w8tyD2p9nsUzO2jQWAEvbH8cO7gp1Q7lvzGMpLBdcBY7hiTcqugaytcjCOjGG+WJM+VUx46HS69b6SlHHk2CZfXPZcIxwOA4B0vso6zz8YR7bFfLFmcczSOGf9kx0KwA/vCsYx961pDMUMLJMd645tMfet2Wpylso9GcMVbIu5jzHMD2seRyY71h3bYn7IyzjyqHCidyHuJyfKHiXuaaV3LsuVOkTvepe2QbZFIhJxxEVERER0GTi5IiIiUh5WdhARERG9Q0x0EGUX2yARvRVWdhARERERERFRXmGyg4iIiIiIiIjyCpMdRERERERERJRXmOwgIiIiIiIiorzCZAcRERERERER5RUmO4iIiIiIiIgorzDZQURERERERER5hckOIiIiIiIiIsorTHYQERERERERUV5RpdPpbD8DEREREREREdGaYWUHEREREREREeUVJjuIiIiIiIiIKK8w2UFEREREREREeYXJDiIiIiIiIiLKK0x2EBEREREREVFeYbKDiIiIiIiIiPIKkx1ERERERERElFeY7CAiIiIiIiKivKJ9m99Pr8tTZI4q2w+gEIxj7mMM8wPjmPsYw/zAOOY+xjA/MI65jzHMD3kZR1Z2EBEREREREVFeYbKDiIiIiIiIiPIKkx1ERERERERElFeY7CAiIiIiIiKivMJkBxERERERERHlFSY7iIiIiIiIiCivMNlBRERERERERHlFEcmOdDrXr/Ulyi/pdFr6i4iIiIiIKNdos/kf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\n" + }, + "metadata": { + "needs_background": "light" + } + } + ], + "source": [ + "# 1 探索数据集中的异构性。\n", + "# 从某一个用户的数据集中取出40条数据,验证数据内容。\n", + "figure = plt.figure(figsize=(20, 4))\n", + "j = 0\n", + "\n", + "for example in example_dataset.take(40):\n", + " plt.subplot(4, 10, j+1)\n", + " plt.imshow(example['pixels'].numpy(), cmap='gray', aspect='equal')\n", + " plt.axis('off')\n", + " j += 1" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": "
", + "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-05-06T19:50:57.939518\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAr8AAAHOCAYAAACRj2EXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAxj0lEQVR4nO3de5RldX3n/fdHGoKIXAz1oIJtE2NQowZcncRblIBJUFF8njHxLiiuHtd410QxJrGTlUQnUQcTSZyOEJjIg3EA411hQAZNlKRBokBLdBSlsRtaEVTUQOt3/ji7TFHWrevsc86us9+vtXr1Obv2+e1vn6pv70/9zr6kqpAkSZL64G6TLkCSJEkaF8OvJEmSesPwK0mSpN4w/EqSJKk3DL+SJEnqDcOvJEmSesPwK/VYkkuTvGjcr+2qJHdP8sEktyX5n5OuZ1KSbE7y7hGMO9T7m2RDkkqyrnn+0SQntV2npOlm+JWmQJLrkzxh0nXMleTnkvzPJN9ows7nkrw6yV4j3u5ZSf54lS9/OnAo8NNV9ZstlrUiSR6b5J+a9+uWJP+Y5BfHXccILfv+7snPTVU9sarOHraoJCcn+dSw40haGwy/klqX5AHA5cANwMOq6kDgN4GNwD0nWdsy7g/8W1Xt3tMXzs5GrlaSA4APAX8J3As4DPhD4N+HGbdjlnx/1/DPjaQ1xPArTbEkByf5UJJdSb7VPD583moPSPLPSb6d5P1J7jXn9Y9sZiJvTfKvSY5Z4ab/EPinqnp1Ve0AqKrrqurZVXVrM/ZTk1zTjH1pkgfP2W4l+dk5z388m5vkmCTbk7wmyc1JdiR5QfO1TcBzgNcm+W6SDzbLX5fkxiTfSXJdkuMWeK/+EPgD4BnNa09Jcrckv5fkq822/keSA5v1Zz+CPyXJ14BLVvn+z/q55n06t6p+WFXfr6oLq+pzzVgPSHJJkm82s6LnJDlozrauT/I7zUzp7UnOSHJoc2jAd5L8ryQHz6t9U5KvN+/hby/2zdyTn4MkD26+n7c239+nLvb+LvDyZX9u5m3rLofeJHlhkm3Ne/3xJPef87VK8uIkX2xqOz0DDwbeCTyqqevWZv0nJbm2ee9uXOr9kbS2GH6l6XY34G8ZzLitB74PvGPeOs8HXgjcB9gN/AVAksOADwN/zGAm8reB85PMrGC7TwDOW+yLSX4OOBd4JTADfAT4YJJ9VvjvujdwIIPZ0VOA05McXFVbgHOAP6uq/avqKUmOBF4K/GJV3RP4DeD6+QNW1RuBPwX+vnntGcDJzZ9fBX4G2J+ffP8eDzy4GXe+lbz/s/4N+GGSs5M8cTaozhHgTcB9m+3dD9g8b53/BPwagyD9FOCjwO8yeI/vBrx83vq/CjwQ+HXgdVng0Jk9+TlIsjfwQeBC4P8BXgack+TIRd7f+Zb8uVlKkhObf+v/x+Df+0kGP2NznQD8IvBw4LeA36iqbcCLgU83dR3UrHsG8J+bn5mHssAvN5LWJsOvNMWq6ptVdX5Vfa+qvgP8CYOwNtffVdXVVXU78PvAb2VwfOVzgY9U1Ueq6kdVdRGwFXjSCjb908COJb7+DODDVXVRVd0JvAW4O/DoFf7T7gT+qKrurKqPAN8Fjlxk3R8CPwU8JMneVXV9Vf2fFW7nOcDbqurLVfVd4PXAM3PXQxw2V9XtVfX9+S9e4fs/u+63gccCBfwNsCvJB5Ic2nz9S8379e9VtQt42wJj/WVV3VRVNzIIf5dX1Wer6gfA+4Cj563/h03tn2cQ0p+1QGl78nPwSAa/ILy5qu6oqksYHMqx0LgLWe7nZikvBt5UVduawyr+FDhq7uxvU9etVfU14BPAUUuMdyeDn5kDqupbVXXlKuuS1DGGX2mKJdkvyX9vPrb/NnAZcFDuevLQDXMefxXYGziEwWzlbzYfEd/afBz8WAYzxMv55jLr3bfZFgBV9aOmjsNWMDbAN+cdN/o9BqHrJ1TVlxjMMG8Gbk7yniT3XeF27lJn83gdg5O2Zt3AIlb4/s+tdVtVnVxVhzOYbbwvcFoz1qFN7Tc2Y72bwfdprpvmPP7+As/nv0fzv/cLvS978nNwX+CG5vs5d9wVf18XGXcl7g+8fU6NtzCYLZ+77Z1zHi/6M9P4TwwC/leT/O8kj1plXZI6xvArTbfXMJgR/eWqOgB4XLM8c9a535zH6xnMeH2DQTD6u6o6aM6fe1TVm1ew3f/FIDws5usMwsqgmCRNHTc2i74H7Ddn/XuvYJuz6icWVP3/VfXYZpsF/NcVjnWXOhm8P7u5a6j8ie3NsZL3f0FV9QXgLAYhGAYzmcXgRLADGMzILjvOMuZ/77++wDp78nPwdeB+SebuW9bzH9/X5Sz3c7OUGxgcpjC3zrtX1T+t4LUL/cz8S1WdyODwjX8A3rvKuiR1jOFXmh57J9l3zp91DM6Q/z5wawYnsr1xgdc9N8lDkuwH/BFwXlX9kMHM4lOS/EaSvZoxj8niJ2zN9Ubg0Un+PMm9AZL8bJJ3NydpvRd4cpLjmuNEX8PgqgazQeUq4NnNdo9nkUMFFnETg+NzabZ7ZJJjk/wU8IPm/fjRYi+e51zgVUmOSLI//3HM6kqvBrGS93+2zgdlcBLf4c3z+zE4XOAzc8b6LnBbcxzu76ywhqX8fjM7/fPAC4C/X2CdPfk5uJzBLy6vTbJ3BifGPQV4zwrrWe7nZinvBF7f/FtIcmCSlV6u7ibg8NljzpPsk+Q5SQ5sDsv5Niv/mZHUcYZfaXp8hEHQmv2zmcFH5ndnMJP7GeBjC7zu7xjMMO4E9qU5KaqqbgBmTyLaxWBm7XdYwf8bzTG1jwI2ANckuQ04n8Gxot+pqusYzFz+ZVPbU4CnVNUdzRCvaJbdyuC4239YyRvQOIPBsZq3JvkHBsf7vrnZzk4GM3mvX+FYZzJ4fy4DvsIgPL9sD2o5jeXf/1nfAX4ZuDzJ7c36VzP4xQAGV0J4BHAbgxPQLtiDOhbzv4EvARcDb6mqC+evsCc/B8337ynAExn8m/8KeH4zi72s5X5ulnnt+xjM6L+nOSzk6qaOlbgEuAbYmeQbzbLnAdc3Y72Ywc+hpCmQqqU+sZMkTZskGxiE+b1Xc01jSVrLnPmVJElSbxh+JUmS1Bse9iBJkqTecOZXkiRJvWH4lSRJUm8YfiVJktQbhl9JkiT1huFXkiRJvWH4lSRJUm8YfiVJktQbhl9JkiT1huFXkiRJvWH4lSRJUm8YfiVJktQbhl9JkiT1huFXkiRJvWH4lSRJUm8YfiVJktQbhl9JkiT1huFXkiRJvWH4lSRJUm8YfiVJktQbhl9JkiT1huFXkiRJvWH4XcOSbE7y7ubx+iTfTbLXpOuStDB7Vlo77NfpZfjtuCTPTrK1abodST6a5LHz16uqr1XV/lX1wxa2eWmSFy2zzlFJrkjyvebvo4bdrjQNOtyzW5Jcl+RHSU4edpvSNOhivyb5uSTvT7IryS1JPp7kyGG3q/9g+O2wJK8GTgP+FDgUWA/8FXDiBMsiyT7A+4F3AwcDZwPvb5ZLvdXVnm38K/BfgCsnXYjUBR3u14OADwBHMqjrnxnsc9USw29HJTkQ+CPgJVV1QVXdXlV3VtUHq+p3Flh/Q5JKsm729UnOaH6TvTHJH89+XJPk5CSfSvKWJN9K8pUkT2y+9ifArwDvaH4TfscC5R0DrANOq6p/r6q/AAIcO4r3QloLOt6zVNXpVXUx8IMRvQXSmtHlfq2qf66qM6rqlqq6E/hvwJFJfnp070i/GH6761HAvsD7Vvn6s4DdwM8CRwO/Dsz9mOWXgeuAQ4A/A85Ikqp6A/BJ4KXNRzwvXWDsnwc+V1U1Z9nnmuVSX3W5ZyXd1Vrq18cBO6vqm6usVfMYfrvrp4FvVNXuPX1hkkOBJwGvbH6bvZnBb47PnLPaV6vqb5rjl84G7sPg45WV2B+4bd6y24B77mmt0hTpcs9Kuqs10a9JDgdOB169p6/V4tZNugAt6pvAIUnWraI57w/sDexIMrvsbsANc9bZOfugqr7XrLf/Csf/LnDAvGUHAN/ZwzqladLlnpV0V53v1yQzwIXAX1XVuXtYo5bgzG93fRr4d+Bpq3jtDc1rD6mqg5o/B1TVSg9LqGW+fg3w8MzpeuDhzXKpr7rcs5LuqtP9muRgBsH3A1X1J6uoUUsw/HZUVd0G/AFwepKnJdkvyd5Jnpjkz5Z57Q4GTfPWJAckuVuSByR5/Ao3fxPwM0t8/VLgh8DLk/xUktljli5Z4fjS1Ol4z5JknyT7Mjg5de8k+yZxH6Be6nK/JjkA+Djwj1V16grH1B7wP74Oq6q3MjjO5/eAXQx+23wp8A8rePnzgX2Aa4FvAecxOOZoJd4OPL05S/UvFqjrDga/LT8fuBV4IfC0ZrnUW13t2caFwPeBRwNbmsePW+H40tTpcL/+v8AvAi9orggx+2f9CsfXMnLXE/YlSZKk6eXMryRJknrD8CtJkqTeMPxKkiSpNwy/kiRJ6o2x3uTikEMOqQ0bNoxzk1KnXXHFFd+oqplJ17EQ+1W6qy73K9iz0nyL9exYw++GDRvYunXrODcpdVqSr066hsXYr9JddblfwZ6V5lusZz3sQZIkSb1h+JUkSVJvGH4lSZLUG4ZfacokOTPJzUmunrPsz5N8IcnnkrwvyUETLFFSw36Vxs/wK02fs4Dj5y27CHhoVT0c+Dfg9eMuStKCzsJ+lcbK8CtNmaq6DLhl3rILq2p38/QzwOFjL0zST7BfpfEz/Er980Lgo5MuQtKK2K9Sy8Z6nd+V2HDqh1sZ5/p9n93KOA87Yn0r47z3TbuXX2kFHvyFba2M0yWbN2/u1DjTLMkbgN3AOYt8fROwCWD9+uV/9lvr1zc/uZVxuub0F1/SyjgveeexrYyjtWW5fm3W2aOebcXmA1sa57Z2xpH2kDO/Uk8kORk4AXhOVdVC61TVlqraWFUbZ2Y6eyMraeqtpF/BnpVWo3Mzv5Lal+R44LXA46vqe5OuR9Li7FdptJz5laZMknOBTwNHJtme5BTgHcA9gYuSXJXknRMtUhJgv0qT4MyvNGWq6lkLLD5j7IVIWpb9Ko2fM7+SJEnqDcOvJEmSesPwK0mSpN4w/EqSJKk3DL+SJEnqDcOvJEmSemPZ8JvkzCQ3J7l6zrJ7JbkoyRebvw8ebZmSJEnS8FYy83sWcPy8ZacCF1fVA4GLm+eSJElSpy17k4uquizJhnmLTwSOaR6fDVwKvK7NwiRpTz3s7Ie1Ms5737S7lXE45vR2xmnJ9lM/2co479r34qHH2Lx58/CFAPf+xFWtjLPzV49qZRxJ3bfaY34PraodzeOdwKGLrZhkU5KtSbbu2rVrlZuTJEmShjf0CW9VVUAt8fUtVbWxqjbOzMwMuzlJkiRp1VYbfm9Kch+A5u+b2ytJkiRJGo3Vht8PACc1j08C3t9OOZIkSdLorORSZ+cCnwaOTLI9ySnAm4FfS/JF4AnNc0mSJKnTVnK1h2ct8qXjWq5FkiRJGinv8CZJkqTeMPxKkiSpNwy/kiRJ6g3DrzRlkpyZ5OYkV89Zdq8kFyX5YvP3wZOsUdKA/SqNn+FXmj5nAcfPW3YqcHFVPRC4uHkuafLOwn6VxsrwK02ZqroMuGXe4hOBs5vHZwNPG2dNkhZmv0rjZ/iV+uHQqtrRPN4JHDrJYiQtyX6VRmjZ6/xKmi5VVUlqoa8l2QRsAli/fv34itp8YDvjHDHGmsforc84oZVxnnHE61oZpw0XX/KAdgbK+e2M01FL9StMsGelNcyZX6kfbkpyH4Dm75sXWqmqtlTVxqraODMzM9YCJf3YivoV7FlpNZz51aptP/WT7Qy0bzvDaEkfAE5icCvyk4D3T7YcSUuwX6URcuZXmjJJzgU+DRyZZHuSUxjsRH8tyReBJzTPJU2Y/SqNnzO/0pSpqmct8qXjxlqIpGXZr9L4OfMrSZKk3jD8SpIkqTcMv5IkSeoNw68kSZJ6w/ArSZKk3jD8SpIkqTcMv5IkSeoNw68kSZJ6w/ArSZKk3hjqDm9JXgW8CCjg88ALquoHbRQmSZKk4WzevLlT49z7E1e1Ms7OXz1q1a9d9cxvksOAlwMbq+qhwF7AM1ddiSRJkjRiwx72sA64e5J1wH7A14cvSZIkSRqNVR/2UFU3JnkL8DXg+8CFVXXh/PWSbAI2Aaxfv361m5PGpgsfyUiSpNEY5rCHg4ETgSOA+wL3SPLc+etV1Zaq2lhVG2dmZlZfqSRJkjSkYQ57eALwlaraVVV3AhcAj26nLEmSJKl9w4TfrwGPTLJfkgDHAdvaKUuSJElq36rDb1VdDpwHXMngMmd3A7a0VJckSZLUuqGu81tVbwTe2FItkiRJ0kh5hzdJkiT1huFX6pEkr0pyTZKrk5ybZN9J1yRpYfarNBqGX6knvCujtHbYr9LoGH6lfvGujNLaYb9KIzDUCW+S1o6V3JXROzJK3eBdVMfv9Bdf0so4L3nnsa2Mo9Fx5lfqiZXcldE7Mkrd4F1UpdEx/Er94V0ZpbXDfpVGxPAr9Yd3ZZTWDvtVGhHDr9QT3pVRWjvsV2l0POFtjWnjgPwffOttLVQCzzjida2M05aLL3lAOwPl/HbG6SDvyiitHfarNBrO/EqSJKk3DL+SJEnqDcOvJEmSesPwK0mSpN4w/EqSJKk3DL+SJEnqDcOvJEmSesPwK0mSpN7wJheSJGnN2vagB7cz0DGntzOOOs+ZX0mSJPWG4VeSJEm9MVT4TXJQkvOSfCHJtiSPaqswSZIkqW3DHvP7duBjVfX0JPsA+7VQkyRJkjQSqw6/SQ4EHgecDFBVdwB3tFOWJEmS1L5hDns4AtgF/G2SzyZ5V5J7zF8pyaYkW5Ns3bVr1xCbkyRJkoYzTPhdBzwC+OuqOhq4HTh1/kpVtaWqNlbVxpmZmSE2J0mSJA1nmPC7HdheVZc3z89jEIYlSZKkTlp1+K2qncANSY5sFh0HXNtKVZIkSdIIDHud35cB5yT5HHAU8KdDVyRpZLw8obR22K/SaAx1qbOqugrY2E4pksbAyxNKa4f9Ko3AsNf5lbRGeHlCae2wX6XR8fbGUn+s6PKEkjrBfpVGxJlfqT9mL0/4sqq6PMnbGVye8PdnV0iyCdgEsH79+okUKQlYQb+CPdtFb33GCa2M84wjXtfKOOzbzjAXX/KAdgbK+e2MMwRnfqX+WPbyhF6XW+qMFV1O1J6V9pzhV+oJL08orR32qzQ6HvYg9cvs5Qn3Ab4MvGDC9UhanP0qjYDhV+oRL08orR32qzQaHvYgSZKk3jD8SpIkqTcMv5IkSeoNw68kSZJ6w/ArSZKk3jD8SpIkqTcMv5IkSeoNw68kSZJ6w/ArSZKk3vAOb5Ik9cSGUz889BjX79tCIcDDzn5YK+O8t5VR1CfO/EqSJKk3DL+SJEnqDcOvJEmSesPwK0mSpN4YOvwm2SvJZ5N8qI2CJEmSpFFpY+b3FcC2FsaRJEmSRmqo8JvkcODJwLvaKUeSJEkanWFnfk8DXgv8aLEVkmxKsjXJ1l27dg25OUmSJGn1Vh1+k5wA3FxVVyy1XlVtqaqNVbVxZmZmtZuTJEmShjbMzO9jgKcmuR54D3Bskne3UpWkkfAEVWltsWel9q06/FbV66vq8KraADwTuKSqnttaZZJGwRNUpbXFnpVa5nV+pZ7wBFVpbbFnpdFoJfxW1aVVdUIbY0kamdPwBFVpLTkNe1ZqnTO/Ug94gqq0ttiz0ugYfqV+8ARVaW2xZ6URMfxKPeAJqtLaYs9Ko2P4lSRJUm+sm3QBksarqi4FLp1wGZJWyJ6V2uXMryRJknrD8CtJkqTeMPxKkiSpNwy/kiRJ6g3DryRJknrD8CtJkqTeMPxKkiSpNwy/kiRJ6g3DryRJknrD8CtJkqTeMPxKkiSpNwy/kiRJ6g3DryRJknrD8CtJkqTeMPxKkiSpNwy/kiRJ6o1Vh98k90vyiSTXJrkmySvaLEySJElq27ohXrsbeE1VXZnknsAVSS6qqmtbqk2SJElq1apnfqtqR1Vd2Tz+DrANOKytwiS1y09rpLXDfpVGZ5iZ3x9LsgE4Grh8ga9tAjYBrF+/vo3NSVodP62R1g77VRqRoU94S7I/cD7wyqr69vyvV9WWqtpYVRtnZmaG3ZykVfLTGmntsF+l0Rkq/CbZm0HwPaeqLminJEmjttSnNZK6xX6V2jXM1R4CnAFsq6q3tVeSpFFa6tOaJJuSbE2yddeuXZMpUNKPLffpqj0r7blhZn4fAzwPODbJVc2fJ7VUl6QRWO7TGg9TkrpjJZ+u2rPSnlv1CW9V9SkgLdYiaYT8tEZaO+xXaXS8w5vUH35aI60d9qs0Iq1c6kxS9/lpjbR22K/S6DjzK0mSpN4w/EqSJKk3DL+SJEnqDcOvJEmSesPwK0mSpN4w/EqSJKk3DL+SJEnqDcOvJEmSesPwK0mSpN4w/EqSJKk3DL+SJEnqDcOvJEmSesPwK0mSpN4w/EqSJKk3DL+SJEnqDcOvJEmSesPwK0mSpN4w/EqSJKk3DL+SJEnqjaHCb5Ljk1yX5EtJTm2rKEmjYc9Ka4f9Ko3GqsNvkr2A04EnAg8BnpXkIW0VJqld9qy0dtiv0ugMM/P7S8CXqurLVXUH8B7gxHbKkjQC9qy0dtiv0oikqlb3wuTpwPFV9aLm+fOAX66ql85bbxOwqXl6JHDdMkMfAnxjVUWNhvUsrku1wNqs5/5VNTOOYlbSs/Zr66xncV2qBdZgvzbL13LPdqkWsJ7lrMV6FuzZdaOp5z9U1RZgy0rXT7K1qjaOsKQ9Yj2L61ItYD1tsF/bZT2L61It0L16Vmot92yXagHrWc401TPMYQ83Aveb8/zwZpmkbrJnpbXDfpVGZJjw+y/AA5MckWQf4JnAB9opS9II2LPS2mG/SiOy6sMeqmp3kpcCHwf2As6sqmtaqGnFH9+MifUsrku1gPUsaUQ926l/I9aznC7V06VaoGP19GQf26VawHqWMzX1rPqEN0mSJGmt8Q5vkiRJ6g3DryRJknqjM+G3S7dxTHK/JJ9Icm2Sa5K8YpL1zEqyV5LPJvlQB2o5KMl5Sb6QZFuSR024nlc136urk5ybZN8xb//MJDcnuXrOsnsluSjJF5u/Dx5nTaNmzy5bk/26eD3265jZr8vW1Jl+hW717DT2ayfCb7p3G8fdwGuq6iHAI4GXTLieWa8Atk26iMbbgY9V1YOAX2CCdSU5DHg5sLGqHsrg5JBnjrmMs4Dj5y07Fbi4qh4IXNw8nwr27IrYrwuwX8fPfl2RLvUrdKRnp7VfOxF+6dhtHKtqR1Vd2Tz+DoMfusMmVQ9AksOBJwPvmmQdTS0HAo8DzgCoqjuq6taJFjW4csndk6wD9gO+Ps6NV9VlwC3zFp8InN08Pht42jhrGjF7dgn267Ls1/GyX5fQpX6FTvbs1PVrV8LvYcANc55vZ8Jhc1aSDcDRwOUTLuU04LXAjyZcB8ARwC7gb5uPid6V5B6TKqaqbgTeAnwN2AHcVlUXTqqeOQ6tqh3N453AoZMspmX27NJOw35dkP06Efbr0k6jO/0KHerZae3XroTfTkqyP3A+8Mqq+vYE6zgBuLmqrphUDfOsAx4B/HVVHQ3czgQ/ImyO9TmRwX8Y9wXukeS5k6pnITW4pqDXFRyxLvSs/bo0+1Wz7NdFdaZnp7VfuxJ+O3cbxyR7M2jKc6rqgknWAjwGeGqS6xl8XHVskndPsJ7twPaqmv1N/TwGjTopTwC+UlW7qupO4ALg0ROsZ9ZNSe4D0Px984TraZM9uzj7dWn26/jZr4vrWr9Ct3p2Kvu1K+G3U7dxTBIGx9psq6q3TaqOWVX1+qo6vKo2MHhvLqmqif3mVVU7gRuSHNksOg64dlL1MPg45pFJ9mu+d8fRjRMXPgCc1Dw+CXj/BGtpmz27CPt1Wfbr+Nmvi+havzY1dalnp7JfV3174zaN8DaOq/UY4HnA55Nc1Sz73ar6yORK6pyXAec0/5F+GXjBpAqpqsuTnAdcyeAs4s8y5tswJjkXOAY4JMl24I3Am4H3JjkF+CrwW+OsaZTs2TXHfp3DfrVf14BO9Oy09qu3N5YkSVJvdOWwB0mSJGnkDL+SJEnqDcPvGpZk8+xZqUnWJ/lucycfSR1kz0prh/06vQy/HZfk2Um2Nk23I8lHkzx2/npV9bWq2r+qftjCNi9N8qIlvn5Ikn9M8s0ktyb5dJLHDLtdaRp0sWfnrfv8JLXS9aVp1tV+bXr09qau7ybpxN3npoXht8OSvJrBnWf+lMHdS9YDf8UEb0vZ+C7wQmAGOBj4r8AHM7j1odRbHe5Z4McXrP9dYJJn+kud0PV+BX6hCdz7V5W/rLbI8NtRGdzb+4+Al1TVBVV1e1XdWVUfrKrfWWD9Dc1viutmX5/kjOY32RuT/PHsxzVJTk7yqSRvSfKtJF9J8sTma38C/Arwjua3zXfM31ZV/aCqrquqHwEBfsggBN9rVO+H1HVd7tk53gT8BfCNlv/50pqyRvpVI2L47a5HAfsC71vl689icE2+n2Vw3/RfB+b+5vjLwHXAIcCfAWckSVW9Afgk8NLmt82XLraBJJ8DfsDgYtPvqqppuiOStKc63bNJfgnYCLxzlfVJ06TT/dq4LMnOJBck2bDKOrUAw293/TTwjaravacvTHIo8CQG90u/vQml/43B3WtmfbWq/qY5fuls4D4MPvZZsap6OHAA8GzgU3tapzRlOtuzzYzUXzHY4f5oT+uTplBn+7XxeGAD8CDg68CHPLSwPb6R3fVNBnczWbeK5rw/sDewI8nssrsBN8xZZ+fsg6r6XrPe/ntaZFX9ADg3ybYkV1XVv+7pGNKU6HLP/hfgc1X1mT2sS5pWXe5Xquqy5uEdSV4BfBt4MPD5PaxVCzD8dtengX8Hngact4evvaF57SGr+a0WWM1t//YGfgYw/KqvutyzxwGPT/Kk5vm9gKOTHLXMx67StOpyvy72miy7llbEwx46qqpuA/4AOD3J05Lsl2TvJE9M8mfLvHYHcCHw1iQHJLlbkgckefwKN38TgyC7oCSPTPLYJPskuXuS1zH4OOfyFY4vTZ0u9yxwMoNZo6OaP1uBPwTesMLxpanS5X5N8vNJjkqyV5L9gbcCNwLbVji+lmH47bCqeivwauD3gF0Mftt8KfAPK3j584F9gGuBbzH4zfY+K9z024GnN2ep/sUCX/8p4HQGHxvdyODYpydX1ddXOL40lbras1V1a1XtnP0D3AF8uwkAUi91tV8ZTCb9PYNDHb7M4NjfE6rqzhWOr2WkajWz75IkSdLa48yvJEmSesPwK0mSpN4w/EqSJKk3DL+SJEnqDcOvJEmSemOsN7k45JBDasOGDePcpNRpV1xxxTeqambSdSzEfpXuqsv9CvasNN9iPTvW8Lthwwa2bt06zk1KnZbkq5OuYTH2q3RXXe5XsGel+RbrWQ97kCRJUm8YfiVJktQbhl9pyiQ5M8nNSa6es+zPk3whyeeSvC/JQRMsUZKkiTH8StPnLOD4ecsuAh5aVQ8H/g14/biLkiSpCwy/0pSpqsuAW+Ytu7CqdjdPPwMcPvbCJEnqAMOv1D8vBD466SIkSZqEsV7qbKw2H9jSOLe1M47UAUneAOwGzlnk65uATQDr169fdrwNp364lbqu3/fZrYzTVr9ue9CDWxnnwV/Y1so4bdl+6idbGefwN/9KK+NIbehav771GSe0Ms5r/v5DrYyjn+TMr9QTSU4GTgCeU1W10DpVtaWqNlbVxpmZzl7LX5KkVZvemV9JP5bkeOC1wOOr6nuTrkeSpElx5leaMknOBT4NHJlke5JTgHcA9wQuSnJVkndOtEhJkibEmV9pylTVsxZYfMbYC5EkqYOc+ZUkSVJvGH4lSZLUG4ZfSZIk9YbhV5IkSb2xbPhNcmaSm5NcPWfZnyf5QpLPJXlfkoNGWqUkSVPIfaw0fiuZ+T0LOH7esouAh1bVw4F/A17fcl2SJPXBWbiPlcZq2fBbVZcBt8xbdmFV7W6efgY4fAS1SZI01dzHSuPXxjG/LwQ+2sI4kiTprtzHSi0b6iYXSd4A7AbOWWKdTcAmgPXr1w+zOQGnv/iSocd4yTuPbaESSdIouY9VGzZv3typcbpg1eE3ycnACcBxVVWLrVdVW4AtABs3blx0PUnS2tDGTnCadqSj4D5WGp1Vhd8kxwOvBR5fVd9rtyRJkvrLfaw0Wiu51Nm5wKeBI5NsT3IK8A7gnsBFSa5K8s4R1ylJ0tRxHyuN37Izv1X1rAUWnzGCWiRJ6hX3sdL4eYc3SZIk9YbhV5IkSb1h+JUkSVJvGH4lSZLUG4ZfSZIk9YbhV5IkSb1h+JWmTJIzk9yc5Oo5y+6V5KIkX2z+PniSNUqSNCmrvr2x1Ja2bnP6K4/7u1bGOe7Y/9PKOBN0FoOL5P+POctOBS6uqjcnObV5/roJ1CZJ0kQ58ytNmaq6DLhl3uITgbObx2cDTxtnTZIkdYXhV+qHQ6tqR/N4J3DoJIuRJGlSPOxB6pmqqiS10NeSbAI2Aaxfv36sdbXhYWc/rJVx3tvKKHD6iy9pZZyXvPPYVsbpkosveUAr40zBYUqSxsyZX6kfbkpyH4Dm75sXWqmqtlTVxqraODMzM9YCJUkaB8Ov1A8fAE5qHp8EvH+CtUiSNDGGX2nKJDkX+DRwZJLtSU4B3gz8WpIvAk9onkuS1Dse8ytNmap61iJfOm6shUiS1EHO/EqSJKk3lg2/3i1KkqTRcB8rjd9KZn7PAo6ft2z2blEPBC5unkuSpD1zFu5jpbFaNvx6tyhJkkbDfaw0fqs95te7RUmSNBruY6URGvpqD0vdLQq8Y9Ss975pdyvjcMzp7YzTgu2nfrKdgfZtZxhJmjZt72M3nPrhoWu6ft9nDz0GwMOOaCcTtHVHxq5xHzs6q535XdHdosA7RkmStIfcx0ojtNrw692iJEkaDfex0ggte9hDc7eoY4BDkmwH3sjg7lDvbe4c9VXgt0ZZpCRJC7n3J65qZZydv3pUK+PsKfex0vgtG369W5QkSaPhPlYaP+/wJkmSpN4w/EqSJKk3DL+SJEnqDcOvJEmSesPwK0mSpN4w/EqSJKk3DL+SJEnqDcOvJEmSemPZm1xIfbPW7xi1lCSvAl4EFPB54AVV9YPJViVJ6osu7GOd+ZV6IslhwMuBjVX1UGAv4JmTrUqSpPEy/Er9sg64e5J1wH7A1ydcjyRJY2X4lXqiqm4E3gJ8DdgB3FZVF062KkmSxsvwK/VEkoOBE4EjgPsC90jy3HnrbEqyNcnWXbt2TaJMSZJGyvAr9ccTgK9U1a6quhO4AHj03BWqaktVbayqjTMzMxMpUpKkUTL8Sv3xNeCRSfZLEuA4YNuEa5IkaawMv1JPVNXlwHnAlQwuc3Y3YMtEi5Ikacy8zq/UI1X1RuCNk65DkqRJGWrmN8mrklyT5Ook5ybZt63CJEnqM/ex0misOvx6wXxJkkbDfaw0OsMe8+sF8yVJGg33sdIIrPqY36q6McnsBfO/D1y40AXzk2wCNgGsX79+tZuTJKk33MeO3+kvvmTSJXTaxZc8oJ2Bcn474wxhmMMelr1gPnjdUEmS9pT7WGl0hjnsYdkL5kuSpFVxHyuNyDDh1wvmS5I0Gu5jpRFZdfj1gvmSJI2G+1hpdIa6yYUXzJckaTTcx0qj4R3eJKnj3vqME1oZ5xlHvK6VcSRpLRv2Or+SJEnSmmH4lSRJUm8YfiVJktQbhl9JkiT1huFXkiRJvWH4lSRJUm907lJnG079cCvjXL9vK8NMJS+bJEmS+sqZX0mSJPWG4VeSJEm9YfiVeiTJQUnOS/KFJNuSPGrSNUmSNE6dO+ZX0ki9HfhYVT09yT7AfpMuSJKkcTL8Sj2R5EDgccDJAFV1B3DHJGuSJGncPOxB6o8jgF3A3yb5bJJ3JbnH3BWSbEqyNcnWXbt2TaZKSZJGyPAr9cc64BHAX1fV0cDtwKlzV6iqLVW1sao2zszMTKJGSZJGyvAr9cd2YHtVXd48P49BGJYkqTeGCr+eOS6tHVW1E7ghyZHNouOAaydYkqQluI+VRmPYE948c1xaW14GnNP065eBF0y4HkmLcx8rjcCqw69njktrT1VdBWycdB2SluY+VhqdYQ57WPbMcUmStCruY6URGSb8LnvmOHjpJEmSVsF9rDQiw4TfFZ057qWTJEnaY+5jpRFZdfj1zHFJkkbDfaw0OsNe7cEzxyVJGg33sdIIDBV+PXNckqTRcB8rjYZ3eJMkSVJvGH4lSZLUG4ZfSZIk9YbhV5IkSb1h+JUkSVJvGH4lSZLUG4ZfSZIk9YbhV5IkSb1h+JUkSVJvGH4lSZLUG4ZfSZIk9YbhV5IkSb1h+JV6JMleST6b5EOTrkWSpEkw/Er98gpg26SLkCRpUgy/Uk8kORx4MvCuSdciSdKkGH6l/jgNeC3wownXIUnSxAwdfj2GUOq+JCcAN1fVFcustynJ1iRbd+3aNabqJC3GfazUvjZmfj2GUOq+xwBPTXI98B7g2CTvnr9SVW2pqo1VtXFmZmbcNUr6Se5jpZYNFX49hlBaG6rq9VV1eFVtAJ4JXFJVz51wWZKW4D5WGo1hZ35Pw2MIJUkahdNwHyu1btXh12MIpbWpqi6tqhMmXYekxbmPlUZnmJlfjyGUJGk03MdKI7Lq8OsxhJIkjYb7WGl0vM6vJEmSemNdG4NU1aXApW2MJUmS/oP7WKldzvxKkiSpNwy/kiRJ6g3DryRJknrD8CtJkqTeMPxKkiSpNwy/kiRJ6g3DryRJknrD8CtJkqTeMPxKkiSpNwy/kiRJ6g3DryRJknrD8CtJkqTeMPxKkiSpNwy/kiRJ6g3DryRJknrD8Cv1RJL7JflEkmuTXJPkFZOuSZKkcVs36QIkjc1u4DVVdWWSewJXJLmoqq6ddGGSJI3Lqmd+nUWS1paq2lFVVzaPvwNsAw6bbFWSFuI+VhqdYWZ+nUWS1qgkG4CjgcvnLd8EbAJYv379+AuTNMt9rDQiq575dRZJWpuS7A+cD7yyqr4992tVtaWqNlbVxpmZmckUKMl9rDRCrZzwttgsUvO1TUm2Jtm6a9euNjYnaZWS7M0g+J5TVRdMuh5Jy3MfK7Vr6PC71CwSOJMkdUWSAGcA26rqbZOuR9Ly3MdK7Rsq/DqLJK0pjwGeBxyb5Krmz5MmXZSkhbmPlUZj1Se8OYskrS1V9Skgk65D0vLcx0qjM8zMr7NIkiSNhvtYaURWPfPrLJIkSaPhPlYaHW9vLEmSpN4w/EqSJKk3DL+SJEnqDcOvJEmSesPwK0mSpN4w/EqSJKk3DL+SJEnqDcOvJEmSesPwK0mSpN4w/EqSJKk3DL+SJEnqDcOvJEmSesPwK0mSpN4w/EqSJKk3DL+SJEnqDcOvJEmSemOo8Jvk+CTXJflSklPbKkrSaNiz0tphv0qjserwm2Qv4HTgicBDgGcleUhbhUlqlz0rrR32qzQ6w8z8/hLwpar6clXdAbwHOLGdsiSNgD0rrR32qzQiw4Tfw4Ab5jzf3iyT1E32rLR22K/SiKwb9QaSbAI2NU+/m+S6ZV5yCPCNobc77AA/dnUr9bT2WdV1x7VSTxt+mw93ppZGS/UcPfwQQFZWz/1b2VhL7NeBaexX6FzP2q8tmETP2q/j0bF+hSnq2WHC743A/eY8P7xZdhdVtQXYstJBk2ytqo1D1NUq61lcl2oB61mBZXvWfm2X9SyuS7VA9+qhB/vYLtUC1rOcaapnmMMe/gV4YJIjkuwDPBP4wBDjSRote1ZaO+xXaURWPfNbVbuTvBT4OLAXcGZVXdNaZZJaZc9Ka4f9Ko3OUMf8VtVHgI+0VMusFX98MybWs7gu1QLWs6wR9GzX/o3Ws7Qu1dOlWqB79fRhH9ulWsB6ljM19aSq2ixEkiRJ6ixvbyxJkqTe6Ez47dJtHJPcL8knklyb5Jokr5hkPbOS7JXks0k+1IFaDkpyXpIvJNmW5FETrudVzffq6iTnJtl3zNs/M8nNSa6es+xeSS5K8sXm74PHWdOo2bPL1mS/Ll6P/Tpm9uuyNXWmX6FbPTuN/dqJ8Jvu3cZxN/CaqnoI8EjgJROuZ9YrgG2TLqLxduBjVfUg4BeYYF1JDgNeDmysqocyODnkmWMu4yzg+HnLTgUurqoHAhc3z6eCPbsi9usC7Nfxs19XpEv9Ch3p2Wnt106EXzp2G8eq2lFVVzaPv8Pgh26id9ZJcjjwZOBdk6yjqeVA4HHAGQBVdUdV3TrRogYnb949yTpgP+Dr49x4VV0G3DJv8YnA2c3js4GnjbOmEbNnl2C/Lst+HS/7dQld6lfoZM9OXb92Jfx29jaOSTYwuB3J5RMu5TTgtcCPJlwHwBHALuBvm4+J3pXkHpMqpqpuBN4CfA3YAdxWVRdOqp45Dq2qHc3jncChkyymZfbs0k7Dfl2Q/ToR9uvSTqM7/Qod6tlp7deuhN9OSrI/cD7wyqr69gTrOAG4uaqumFQN86wDHgH8dVUdDdzOBD8ibI71OZHBfxj3Be6R5LmTqmchNbisipdWGbEu9Kz9ujT7VbPs10V1pmentV+7En5XdBvHcUqyN4OmPKeqLphkLcBjgKcmuZ7Bx1XHJnn3BOvZDmyvqtnf1M9j0KiT8gTgK1W1q6ruBC4AHj3BembdlOQ+AM3fN0+4njbZs4uzX5dmv46f/bq4rvUrdKtnp7JfuxJ+O3UbxyRhcKzNtqp626TqmFVVr6+qw6tqA4P35pKqmthvXlW1E7ghyZHNouOAaydVD4OPYx6ZZL/me3cc3Thx4QPASc3jk4D3T7CWttmzi7Bfl2W/jp/9uoiu9WtTU5d6dir7dag7vLWlg7dxfAzwPODzSa5qlv1uc7cdDbwMOKf5j/TLwAsmVUhVXZ7kPOBKBmcRf5Yx34kmybnAMcAhSbYDbwTeDLw3ySnAV4HfGmdNo2TPrjn26xz2q/26BnSiZ6e1X73DmyRJknqjK4c9SJIkSSNn+JUkSVJvGH4lSZLUG4ZfSZIk9YbhV5IkSb1h+JUkSVJvGH4lSZLUG4ZfSZIk9cb/BQbSBXWtbRlaAAAAAElFTkSuQmCC\n" + }, + "metadata": { + "needs_background": "light" + } + } + ], + "source": [ + "# 1 探索数据集中的异构行\n", + "# 每个客户端上数字标签的示例数量,可能不同。取决于用户的行为(不平衡的)\n", + "# Number of examples per layer for a sample of clients\n", + "f = plt.figure(figsize=(12, 7))\n", + "f.suptitle('Label Counts for a Sample of Clients')\n", + "for i in range(6):\n", + " client_dataset = emnist_train.create_tf_dataset_for_client(\n", + " emnist_train.client_ids[i])\n", + " plot_data = collections.defaultdict(list)\n", + " for example in client_dataset:\n", + " # Append counts individually per label to make plots\n", + " # more colorful instead of one color per plot.\n", + " label = example['label'].numpy()\n", + " plot_data[label].append(label)\n", + " plt.subplot(2, 3, i+1)\n", + " plt.title('Client {}'.format(i))\n", + " for j in range(10):\n", + " plt.hist(\n", + " plot_data[j],\n", + " density=False,\n", + " bins=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": "
", + "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-05-06T19:58:14.870869\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "text/plain": "
", + "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-05-06T19:58:15.078079\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "text/plain": "
", + "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-05-06T19:58:15.286576\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "text/plain": "
", + "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-05-06T19:58:15.498459\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + } + }, + { + "output_type": "display_data", + "data": { + "text/plain": "
", + "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-05-06T19:58:15.708897\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + } + } + ], + "source": [ + "# 1 查看数据的异构行。\n", + "# 用来显示每个用户的平局图像\n", + "# Each client has different mean images, meaning each client will be nudging\n", + "# the model in their own directions locally.\n", + "\n", + "for i in range(5):\n", + " client_dataset = emnist_train.create_tf_dataset_for_client(\n", + " emnist_train.client_ids[i])\n", + " plot_data = collections.defaultdict(list)\n", + " for example in client_dataset:\n", + " plot_data[example['label'].numpy()].append(example['pixels'].numpy())\n", + " f = plt.figure(i, figsize=(12, 5))\n", + " f.suptitle(\"Client #{}'s Mean Image Per Label\".format(i))\n", + " for j in range(10):\n", + " mean_img = np.mean(plot_data[j], 0)\n", + " plt.subplot(2, 5, j+1)\n", + " plt.imshow(mean_img.reshape((28, 28)))\n", + " plt.axis('off')" + ] + }, + { + "source": [ + "# 2 数据处理\n", + "\n", + "主要使用tf.dataset方法,将原始数据转换为list,方便输入和训练。" + ], + "cell_type": "markdown", + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "# 2 对数据进行预处理\n", + "# 将数据分成多个不同的批次(某一个客户端的数据)\n", + "\n", + "NUM_CLIENTS = 10\n", + "NUM_EPOCHS = 5\n", + "BATCH_SIZE = 20\n", + "SHUFFLE_BUFFER = 100\n", + "PREFETCH_BUFFER = 10\n", + "\n", + "def preprocess(dataset):\n", + "\n", + " def batch_format_fn(element):\n", + " \"\"\"Flatten a batch `pixels` and return the features as an `OrderedDict`.\"\"\"\n", + " return collections.OrderedDict(\n", + " x=tf.reshape(element['pixels'], [-1, 784]),\n", + " y=tf.reshape(element['label'], [-1, 1]))\n", + "\n", + " return dataset.repeat(NUM_EPOCHS).shuffle(SHUFFLE_BUFFER).batch(BATCH_SIZE).map(batch_format_fn).prefetch(PREFETCH_BUFFER)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "OrderedDict([('x',\n", + " array([[1., 1., 1., ..., 1., 1., 1.],\n", + " [1., 1., 1., ..., 1., 1., 1.],\n", + " [1., 1., 1., ..., 1., 1., 1.],\n", + " ...,\n", + " [1., 1., 1., ..., 1., 1., 1.],\n", + " [1., 1., 1., ..., 1., 1., 1.],\n", + " [1., 1., 1., ..., 1., 1., 1.]], dtype=float32)),\n", + " ('y',\n", + " array([[7],\n", + " [2],\n", + " [8],\n", + " [6],\n", + " [6],\n", + " [3],\n", + " [1],\n", + " [7],\n", + " [1],\n", + " [8],\n", + " [3],\n", + " [7],\n", + " [4],\n", + " [3],\n", + " [6],\n", + " [3],\n", + " [0],\n", + " [3],\n", + " [1],\n", + " [5]], dtype=int32))])" + ] + }, + "metadata": {}, + "execution_count": 13 + } + ], + "source": [ + "# 2 检验数据处理的结果\n", + "preprocessed_example_dataset = preprocess(example_dataset)\n", + "\n", + "sample_batch = tf.nest.map_structure(lambda x: x.numpy(),\n", + " next(iter(preprocessed_example_dataset)))\n", + "\n", + "sample_batch" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "# 2 通过simulation dataset构建训练数据的列表.\n", + "def make_federated_data(client_data, client_ids):\n", + " return [\n", + " preprocess(client_data.create_tf_dataset_for_client(x))\n", + " for x in client_ids\n", + " ]" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Number of client datasets: 10\nFirst dataset: \n" ] } ], "source": [ - "import matplotlib.pyplot as plt" + "# 2 实现客户端的选择\n", + "sample_clients = emnist_train.client_ids[0:NUM_CLIENTS]\n", + "\n", + "federated_train_data = make_federated_data(emnist_train, sample_clients)\n", + "\n", + "print('Number of client datasets: {l}'.format(l=len(federated_train_data)))\n", + "print('First dataset: {d}'.format(d=federated_train_data[0]))" ] }, + { + "source": [ + "# 3 模型训练\n", + "1. 构建了keras模型,转换为tff模型。\n", + "2. 进行正向传播,实现联邦聚合算法。\n", + "3. 定义损失函数。\n", + "4. 定义优化方法。\n", + "5. 进行反向传播。" + ], + "cell_type": "markdown", + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "# 3.1 使用keras创建模型\n", + "def create_keras_model():\n", + " return tf.keras.models.Sequential([\n", + " tf.keras.layers.InputLayer(input_shape=(784,)),\n", + " tf.keras.layers.Dense(10, kernel_initializer='zeros'),\n", + " tf.keras.layers.Softmax(),\n", + " ])" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "# 3.1 通过keras模型转换为tff模型\n", + "def model_fn():\n", + " # We _must_ create a new model here, and _not_ capture it from an external\n", + " # scope. TFF will call this within different graph contexts.\n", + " keras_model = create_keras_model()\n", + " return tff.learning.from_keras_model(\n", + " keras_model,\n", + " input_spec=preprocessed_example_dataset.element_spec,\n", + " loss=tf.keras.losses.SparseCategoricalCrossentropy(),\n", + " metrics=[tf.keras.metrics.SparseCategoricalAccuracy()])" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "# 3.2-3.3-3.4定义前像传播过程、定义损失计算方法、定义优化方法\n", + "iterative_process = tff.learning.build_federated_averaging_process(\n", + " model_fn,\n", + " client_optimizer_fn=lambda: tf.keras.optimizers.SGD(learning_rate=0.02),\n", + " server_optimizer_fn=lambda: tf.keras.optimizers.SGD(learning_rate=1.0))" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "( -> ,non_trainable=<>>,optimizer_state=,delta_aggregate_state=,weight_sum_process=<>>,model_broadcast_state=<>>@SERVER)\n" + ] + } + ], + "source": [ + "# 3 查看联邦计算过程\n", + "print(str(iterative_process.initialize.type_signature))" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "# 3 服务器初始化状态\n", + "\n", + "state = iterative_process.initialize()" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "round 1, metrics=OrderedDict([('broadcast', ()), ('aggregation', OrderedDict([('mean_value', ()), ('mean_weight', ())])), ('train', OrderedDict([('sparse_categorical_accuracy', 0.119135804), ('loss', 3.0766096)])), ('stat', OrderedDict([('num_examples', 4860)]))])\n" + ] + } + ], + "source": [ + "# 3 客户端进行单轮训练\n", + "state, metrics = iterative_process.next(state, federated_train_data)\n", + "print('round 1, metrics={}'.format(metrics))" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "round 2, metrics=OrderedDict([('broadcast', ()), ('aggregation', OrderedDict([('mean_value', ()), ('mean_weight', ())])), ('train', OrderedDict([('sparse_categorical_accuracy', 0.35864198), ('loss', 1.9986831)])), ('stat', OrderedDict([('num_examples', 4860)]))])\n", + "round 3, metrics=OrderedDict([('broadcast', ()), ('aggregation', OrderedDict([('mean_value', ()), ('mean_weight', ())])), ('train', OrderedDict([('sparse_categorical_accuracy', 0.38539094), ('loss', 1.8443733)])), ('stat', OrderedDict([('num_examples', 4860)]))])\n", + "round 4, metrics=OrderedDict([('broadcast', ()), ('aggregation', OrderedDict([('mean_value', ()), ('mean_weight', ())])), ('train', OrderedDict([('sparse_categorical_accuracy', 0.43024692), ('loss', 1.7397194)])), ('stat', OrderedDict([('num_examples', 4860)]))])\n", + "round 5, metrics=OrderedDict([('broadcast', ()), ('aggregation', OrderedDict([('mean_value', ()), ('mean_weight', ())])), ('train', OrderedDict([('sparse_categorical_accuracy', 0.3962963), ('loss', 1.8008647)])), ('stat', OrderedDict([('num_examples', 4860)]))])\n", + "round 6, metrics=OrderedDict([('broadcast', ()), ('aggregation', OrderedDict([('mean_value', ()), ('mean_weight', ())])), ('train', OrderedDict([('sparse_categorical_accuracy', 0.44547325), ('loss', 1.675535)])), ('stat', OrderedDict([('num_examples', 4860)]))])\n", + "round 7, metrics=OrderedDict([('broadcast', ()), ('aggregation', OrderedDict([('mean_value', ()), ('mean_weight', ())])), ('train', OrderedDict([('sparse_categorical_accuracy', 0.48209876), ('loss', 1.6074551)])), ('stat', OrderedDict([('num_examples', 4860)]))])\n", + "round 8, metrics=OrderedDict([('broadcast', ()), ('aggregation', OrderedDict([('mean_value', ()), ('mean_weight', ())])), ('train', OrderedDict([('sparse_categorical_accuracy', 0.4973251), ('loss', 1.5451111)])), ('stat', OrderedDict([('num_examples', 4860)]))])\n", + "round 9, metrics=OrderedDict([('broadcast', ()), ('aggregation', OrderedDict([('mean_value', ()), ('mean_weight', ())])), ('train', OrderedDict([('sparse_categorical_accuracy', 0.5067901), ('loss', 1.5109721)])), ('stat', OrderedDict([('num_examples', 4860)]))])\n", + "round 10, metrics=OrderedDict([('broadcast', ()), ('aggregation', OrderedDict([('mean_value', ()), ('mean_weight', ())])), ('train', OrderedDict([('sparse_categorical_accuracy', 0.5388889), ('loss', 1.4563706)])), ('stat', OrderedDict([('num_examples', 4860)]))])\n", + "round 11, metrics=OrderedDict([('broadcast', ()), ('aggregation', OrderedDict([('mean_value', ()), ('mean_weight', ())])), ('train', OrderedDict([('sparse_categorical_accuracy', 0.5617284), ('loss', 1.3862591)])), ('stat', OrderedDict([('num_examples', 4860)]))])\n", + "round 12, metrics=OrderedDict([('broadcast', ()), ('aggregation', OrderedDict([('mean_value', ()), ('mean_weight', ())])), ('train', OrderedDict([('sparse_categorical_accuracy', 0.58312756), ('loss', 1.3402764)])), ('stat', OrderedDict([('num_examples', 4860)]))])\n", + "round 13, metrics=OrderedDict([('broadcast', ()), ('aggregation', OrderedDict([('mean_value', ()), ('mean_weight', ())])), ('train', OrderedDict([('sparse_categorical_accuracy', 0.58312756), ('loss', 1.3353041)])), ('stat', OrderedDict([('num_examples', 4860)]))])\n", + "round 14, metrics=OrderedDict([('broadcast', ()), ('aggregation', OrderedDict([('mean_value', ()), ('mean_weight', ())])), ('train', OrderedDict([('sparse_categorical_accuracy', 0.6238683), ('loss', 1.253434)])), ('stat', OrderedDict([('num_examples', 4860)]))])\n", + "round 15, metrics=OrderedDict([('broadcast', ()), ('aggregation', OrderedDict([('mean_value', ()), ('mean_weight', ())])), ('train', OrderedDict([('sparse_categorical_accuracy', 0.63580245), ('loss', 1.2053648)])), ('stat', OrderedDict([('num_examples', 4860)]))])\n", + "round 16, metrics=OrderedDict([('broadcast', ()), ('aggregation', OrderedDict([('mean_value', ()), ('mean_weight', ())])), ('train', OrderedDict([('sparse_categorical_accuracy', 0.6393004), ('loss', 1.207883)])), ('stat', OrderedDict([('num_examples', 4860)]))])\n", + "round 17, metrics=OrderedDict([('broadcast', ()), ('aggregation', OrderedDict([('mean_value', ()), ('mean_weight', ())])), ('train', OrderedDict([('sparse_categorical_accuracy', 0.6674897), ('loss', 1.1293923)])), ('stat', OrderedDict([('num_examples', 4860)]))])\n", + "round 18, metrics=OrderedDict([('broadcast', ()), ('aggregation', OrderedDict([('mean_value', ()), ('mean_weight', ())])), ('train', OrderedDict([('sparse_categorical_accuracy', 0.6895062), ('loss', 1.0926687)])), ('stat', OrderedDict([('num_examples', 4860)]))])\n", + "round 19, metrics=OrderedDict([('broadcast', ()), ('aggregation', OrderedDict([('mean_value', ()), ('mean_weight', ())])), ('train', OrderedDict([('sparse_categorical_accuracy', 0.677572), ('loss', 1.0902609)])), ('stat', OrderedDict([('num_examples', 4860)]))])\n", + "round 20, metrics=OrderedDict([('broadcast', ()), ('aggregation', OrderedDict([('mean_value', ()), ('mean_weight', ())])), ('train', OrderedDict([('sparse_categorical_accuracy', 0.70308644), ('loss', 1.0715235)])), ('stat', OrderedDict([('num_examples', 4860)]))])\n", + "round 21, metrics=OrderedDict([('broadcast', ()), ('aggregation', OrderedDict([('mean_value', ()), ('mean_weight', ())])), ('train', OrderedDict([('sparse_categorical_accuracy', 0.6995885), ('loss', 1.0483558)])), ('stat', OrderedDict([('num_examples', 4860)]))])\n", + "round 22, metrics=OrderedDict([('broadcast', ()), ('aggregation', OrderedDict([('mean_value', ()), ('mean_weight', ())])), ('train', OrderedDict([('sparse_categorical_accuracy', 0.7074074), ('loss', 1.0288506)])), ('stat', OrderedDict([('num_examples', 4860)]))])\n", + "round 23, metrics=OrderedDict([('broadcast', ()), ('aggregation', OrderedDict([('mean_value', ()), ('mean_weight', ())])), ('train', OrderedDict([('sparse_categorical_accuracy', 0.7308642), ('loss', 0.99303496)])), ('stat', OrderedDict([('num_examples', 4860)]))])\n", + "round 24, metrics=OrderedDict([('broadcast', ()), ('aggregation', OrderedDict([('mean_value', ()), ('mean_weight', ())])), ('train', OrderedDict([('sparse_categorical_accuracy', 0.73209876), ('loss', 0.98611385)])), ('stat', OrderedDict([('num_examples', 4860)]))])\n", + "round 25, metrics=OrderedDict([('broadcast', ()), ('aggregation', OrderedDict([('mean_value', ()), ('mean_weight', ())])), ('train', OrderedDict([('sparse_categorical_accuracy', 0.75226337), ('loss', 0.930803)])), ('stat', OrderedDict([('num_examples', 4860)]))])\n", + "round 26, metrics=OrderedDict([('broadcast', ()), ('aggregation', OrderedDict([('mean_value', ()), ('mean_weight', ())])), ('train', OrderedDict([('sparse_categorical_accuracy', 0.7547325), ('loss', 0.91434574)])), ('stat', OrderedDict([('num_examples', 4860)]))])\n", + "round 27, metrics=OrderedDict([('broadcast', ()), ('aggregation', OrderedDict([('mean_value', ()), ('mean_weight', ())])), ('train', OrderedDict([('sparse_categorical_accuracy', 0.74053496), ('loss', 0.93025583)])), ('stat', OrderedDict([('num_examples', 4860)]))])\n", + "round 28, metrics=OrderedDict([('broadcast', ()), ('aggregation', OrderedDict([('mean_value', ()), ('mean_weight', ())])), ('train', OrderedDict([('sparse_categorical_accuracy', 0.75781894), ('loss', 0.9082405)])), ('stat', OrderedDict([('num_examples', 4860)]))])\n", + "round 29, metrics=OrderedDict([('broadcast', ()), ('aggregation', OrderedDict([('mean_value', ()), ('mean_weight', ())])), ('train', OrderedDict([('sparse_categorical_accuracy', 0.7660494), ('loss', 0.87998044)])), ('stat', OrderedDict([('num_examples', 4860)]))])\n" + ] + } + ], + "source": [ + "# 3 客户端进行多伦训练\n", + "NUM_ROUNDS = 30\n", + "for round_num in range(2, NUM_ROUNDS):\n", + " state, metrics = iterative_process.next(state, federated_train_data)\n", + " print('round {:2d}, metrics={}'.format(round_num, metrics))" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "# 4 使用tensorboard进行可视化,并对过程进行评估\n", + "logdir = \"/tmp/logs/scalars/training/\"\n", + "summary_writer = tf.summary.create_file_writer(logdir)\n", + "state = iterative_process.initialize()" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "# 4 绘制相关的标量,包括accurate和loss\n", + "with summary_writer.as_default():\n", + " for round_num in range(1, NUM_ROUNDS):\n", + " state, metrics = iterative_process.next(state, federated_train_data)\n", + " for name, value in metrics['train'].items():\n", + " tf.summary.scalar(name, value, step=round_num)" + ] + }, + { + "source": [ + "!ls {logdir}\n", + "\n", + "%tensorboard --logdir {logdir} --port=0\n", + "\n", + "![tensorboard过程](2021-05-06 20-44-37屏幕截图.png)" + ], + "cell_type": "markdown", + "metadata": {} + }, { "cell_type": "code", "execution_count": null, diff --git a/Tensorflow/TensorFlow2.0/12 联邦学习-文本生成.ipynb b/Tensorflow/TensorFlow2.0/12 联邦学习-文本生成.ipynb new file mode 100644 index 00000000..e69de29b diff --git a/Tensorflow/TensorFlow2.0/2021-05-06 20-44-37屏幕截图.png b/Tensorflow/TensorFlow2.0/2021-05-06 20-44-37屏幕截图.png new file mode 100644 index 00000000..be512265 Binary files /dev/null and b/Tensorflow/TensorFlow2.0/2021-05-06 20-44-37屏幕截图.png differ diff --git a/工作日志/2021年3月18日-今日计划.md b/工作日志/2021年3月18日-今日计划.md index ab932140..37ae7f30 100644 --- a/工作日志/2021年3月18日-今日计划.md +++ b/工作日志/2021年3月18日-今日计划.md @@ -3,7 +3,7 @@ > 完成昨天的任务。 - [x] 学习、复习图算法,动手实现所有的图算法。 -- [ ] ~~看完数据结构与算法的三本书!!!对相关的原理进行复习和总结。~~ +- [x] ~~看完数据结构与算法的三本书!!!对相关的原理进行复习和总结。~~ - [x] 学习机器学习的实现方案。毕设计划真正的开始执行。 - [x] 关于字符串分割。字符串格式化方法的总结。转换成流,作为流对象处理。转换为容器。作为容器对象处理,使用泛型算法。 diff --git a/工作日志/2021年3月19日-四月份计划.md b/工作日志/2021年3月19日-四月份计划.md index 72592e2a..315db032 100644 --- a/工作日志/2021年3月19日-四月份计划.md +++ b/工作日志/2021年3月19日-四月份计划.md @@ -29,8 +29,8 @@ - tensorflow - [x] 学习 TensorFlow2.0 基础 - [x] TensorFlow 恶意软件神经网络分类 - - [ ] tensorflow federated学习 - - [ ] TensorFlow 联邦学习实现 + - [x] tensorflow federated学习 + - [x] TensorFlow 联邦学习实现 - pytorch - [x] pytoch学习 - [x] pytorch 恶意软件神经网络分类 diff --git a/工作日志/2021年3月20日-今日计划.md b/工作日志/2021年3月20日-今日计划.md index 779a0ed7..e36d10e4 100644 --- a/工作日志/2021年3月20日-今日计划.md +++ b/工作日志/2021年3月20日-今日计划.md @@ -17,7 +17,7 @@ 2. 每天一个联邦学习框架 - [x] pytorch学习 3. 每天一篇联邦学习的文章。 - - [ ] ~~deepAMD~~ + - [x] ~~deepAMD~~ 4. 每天数据集处理一小步。 - [X] 获取2020年的两个超大型数据集,并存到云盘当中 - [X] 获取CIC关于恶意软件分析的论文 diff --git a/工作日志/2021年3月21日-今日计划.md b/工作日志/2021年3月21日-今日计划.md index 582197d4..690defe6 100644 --- a/工作日志/2021年3月21日-今日计划.md +++ b/工作日志/2021年3月21日-今日计划.md @@ -4,7 +4,7 @@ 2. 每天一个联邦学习框架 - [x] pytorch 3. 每天一篇联邦学习的文章。 - - [ ] ~~联邦半监督学习~~ + - [x] ~~联邦半监督学习~~ > 明天实现动态数据处理的脚本 diff --git a/工作日志/2021年3月22日-今日计划.md b/工作日志/2021年3月22日-今日计划.md index 1e58abff..1f49fc36 100644 --- a/工作日志/2021年3月22日-今日计划.md +++ b/工作日志/2021年3月22日-今日计划.md @@ -4,7 +4,7 @@ - [x] 支持向量机(学习原理、sklearn实践 - [x] 集成方法(学习原理、sklearn实践 2. 每天一个联邦学习框架 - - [ ] pysyft学习 + - [x] pysyft学习 ## 收获 diff --git a/工作日志/2021年3月23日-今日计划.md b/工作日志/2021年3月23日-今日计划.md index be26ed7d..6b37592b 100644 --- a/工作日志/2021年3月23日-今日计划.md +++ b/工作日志/2021年3月23日-今日计划.md @@ -1,7 +1,7 @@ ## 计划 1. 每天一个联邦学习框架 - - [ ] pysft学习 + - [x] pysft学习 ## 收获 diff --git a/工作日志/2021年3月25日-今日计划.md b/工作日志/2021年3月25日-今日计划.md index 80c5cb8c..e0081596 100644 --- a/工作日志/2021年3月25日-今日计划.md +++ b/工作日志/2021年3月25日-今日计划.md @@ -1,9 +1,9 @@ ## 计划 1. 每天数据集处理一小步。 - - [ ] 实现静态数据处理脚本 + - [x] 实现静态数据处理脚本 2. 每天数据集处理一小步。 - - [ ] 实现动态数据处理脚本 + - [x] 实现动态数据处理脚本 > 阅读完之前的论文 diff --git a/工作日志/2021年3月26日-开组会.md b/工作日志/2021年3月26日-开组会.md index c1e5ef0b..03ade338 100644 --- a/工作日志/2021年3月26日-开组会.md +++ b/工作日志/2021年3月26日-开组会.md @@ -3,7 +3,7 @@ ## 计划 > 执行之前的计划 -- [ ] 整理会议记录发到群里。 +- [x] 整理会议记录发到群里。 ## 收获 diff --git a/工作日志/2021年3月29日-今日计划.md b/工作日志/2021年3月29日-今日计划.md index 136de95f..ce3731fe 100644 --- a/工作日志/2021年3月29日-今日计划.md +++ b/工作日志/2021年3月29日-今日计划.md @@ -3,6 +3,6 @@ - [x] 数据结构预算法——蛮力法整理完成 - [x] 基础知识与项目经历——操作系统整理开始part1 -- [ ] 联邦学习与恶意软件——pysyft学习完成 +- [x] 联邦学习与恶意软件——pysyft学习完成 ## 收获 \ No newline at end of file diff --git a/工作日志/2021年3月31日-今日计划.md b/工作日志/2021年3月31日-今日计划.md index c7dc09f1..e6dc1383 100644 --- a/工作日志/2021年3月31日-今日计划.md +++ b/工作日志/2021年3月31日-今日计划.md @@ -4,6 +4,6 @@ - [x] 数据结构与算法——动态规划和贪心整理完成 - [x] 基础知识与项目经历——数据库整理完成 -- [ ] 联邦学习与恶意软件——TensorFlow学习完成part2 +- [x] 联邦学习与恶意软件——TensorFlow学习完成part2 ## 收获 \ No newline at end of file diff --git a/工作日志/2021年4月21日-今日计划.md b/工作日志/2021年4月21日-今日计划.md index b8600574..f6ddd1d9 100644 --- a/工作日志/2021年4月21日-今日计划.md +++ b/工作日志/2021年4月21日-今日计划.md @@ -7,13 +7,13 @@ ### sklearn -- [ ] 复习教程(包括tutorial、API、code) +- [x] 复习教程(包括tutorial、API、code) ### pytorch -- [ ] 复习教程(包括tutorial、API、code) -- [ ] pytorch 数据流水线技术 -- [ ] 学习pysyft框架并应用 +- [x] 复习教程(包括tutorial、API、code) +- [x] pytorch 数据流水线技术 +- [x] 学习pysyft框架并应用 ### TensorFlow diff --git a/工作日志/2021年4月27日-今日计划.md b/工作日志/2021年4月27日-今日计划.md index acca1340..2cfd0c2e 100644 --- a/工作日志/2021年4月27日-今日计划.md +++ b/工作日志/2021年4月27日-今日计划.md @@ -1,8 +1,8 @@ ## 计划 -- [ ] pysyft框架学习(一个小时) -- [ ] pysyft框架实验(一个小时)快点搞完这个吧,弄完这个就可以真正的开始论文的时间了。五一劳动节,需要多花点时间,补一下拉下的进度了。 -- [ ] 整理相关的论文() +- [x] pysyft框架学习(一个小时) +- [x] pysyft框架实验(一个小时)快点搞完这个吧,弄完这个就可以真正的开始论文的时间了。五一劳动节,需要多花点时间,补一下拉下的进度了。 +- [x] 整理相关的论文() ## 收获 diff --git a/工作日志/2021年4月2日-今日计划.md b/工作日志/2021年4月2日-今日计划.md index 077e4641..172f29f5 100644 --- a/工作日志/2021年4月2日-今日计划.md +++ b/工作日志/2021年4月2日-今日计划.md @@ -3,5 +3,5 @@ > 每日计划包括三方面的内容:数据结构与算法、基础知识与项目经历、联邦学习与恶意软件 - [x] 数据结构预算法——图算法和随机化算法整理完成 -- [ ] 基础知识与项目经历——项目经历整理完成 -- [ ] 联邦学习与恶意软件——TensorFlow federated学习完成part2 +- [x] 基础知识与项目经历——项目经历整理完成 +- [x] 联邦学习与恶意软件——TensorFlow federated学习完成part2 diff --git a/工作日志/2021年4月17日-五月份计划.md b/工作日志/2021年5月1日-五月份计划.md similarity index 76% rename from 工作日志/2021年4月17日-五月份计划.md rename to 工作日志/2021年5月1日-五月份计划.md index 8e80ff77..9ec57701 100644 --- a/工作日志/2021年4月17日-五月份计划.md +++ b/工作日志/2021年5月1日-五月份计划.md @@ -1,8 +1,11 @@ ## 任务 > 四月份计划主要进行基础知识的学习和复习。完成了初步的数据处理。接下来的主要任务是阅读论文并完成论文复习计划。 +> 开始执行五月份计划,与四月份计划进行衔接。完成工程上与学术上的推进工作。 + +### **阅读论文**(两周) +> (100篇计划)蒋师兄前前后后分享了估计也有一百篇了,现在重新开始读论文,在复现文章的同时进行广泛的阅读。利用citavi这个工具。 -### **阅读论文计划(100篇计划)**(两周) ### **联邦学习文章复现**(四周) diff --git a/工作日志/2021年5月6日-今日计划.md b/工作日志/2021年5月6日-今日计划.md new file mode 100644 index 00000000..fb0c3bbe --- /dev/null +++ b/工作日志/2021年5月6日-今日计划.md @@ -0,0 +1,12 @@ +## 任务 + +- [x] 四月份计划——tensorflow federated +- [ ] 四月份计划——pysyft + + + +## 收获 + +1. 我发现python机器学习这一套在linux下更好运行,windows配置环境果然要麻烦一百倍。从今天开始将主要的工作环境转移到linux上边。算法的运行和学习都在linux上执行。去Windows上做一下收尾工作。 +2. 当前的主要任务包括两个,一个是四月份未完成的计划。一个是五月份新开始的计划。 +3. tensorflow federated已经学习完成了,能够完成基本的联邦学习过程。因为与学弟合作的部分还是pytorch。今后最好使用pytorch进行开发吧。除非由绝对的优势,不会回到tensorflow上了。 \ No newline at end of file diff --git a/工作日志/2021年5月7日-今日计划.md b/工作日志/2021年5月7日-今日计划.md new file mode 100644 index 00000000..fae7c26e --- /dev/null +++ b/工作日志/2021年5月7日-今日计划.md @@ -0,0 +1,6 @@ +## 计划 + +- [ ] 四月份计划——pytorch 两个数据集训练 +- [ ] 四月份计划——pysyft 两个数据集训练 + +## 收获 \ No newline at end of file diff --git a/工作日志/2021年5月8日-今日计划.md b/工作日志/2021年5月8日-今日计划.md new file mode 100644 index 00000000..823ebea9 --- /dev/null +++ b/工作日志/2021年5月8日-今日计划.md @@ -0,0 +1,6 @@ +## 计划 + +- [ ] 五月份计划——ida 实现 +- [ ] 五月份计划——prox实现 + +## 收获 \ No newline at end of file diff --git a/工作日志/2021年5月9日-今日计划.md b/工作日志/2021年5月9日-今日计划.md new file mode 100644 index 00000000..844a5ece --- /dev/null +++ b/工作日志/2021年5月9日-今日计划.md @@ -0,0 +1,6 @@ +## 计划 + +- [ ] 五月份计划——静态数据处理脚本 +- [ ] 五月份计划——动态数据处理脚本 + +## 收获 \ No newline at end of file