{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "headers" }, "source": [ "Project: /federated/_project.yaml\n", "Book: /federated/_book.yaml\n", "\n", "\n", "\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "AftvNA5VMemJ" }, "source": [ "# 画像分類のためのフェデレーテッドラーニング" ] }, { "cell_type": "markdown", "metadata": { "id": "coAumH42q9nz" }, "source": [ "
TensorFlow.orgで表示 | \n", "Google Colab で実行 | \n", "GitHub でソースを表示{ | \n", "
master
では動作しない可能性があります。\n",
"\n",
"このチュートリアルでは、クラシックな MNIST トレーニングの例を使用して、TFF の Federated Learning (FL) API レイヤー、`tff.learning`を紹介します。これは TensorFlow に実装されたユーザー指定モデルに対するフェデレーテッドトレーニングなどの一般的なタイプのフェデレーテッドラーニングタスクを実行するために使用できる、より高レベルの一連のインターフェースです。\n",
"\n",
"このチュートリアルと Federated Learning API は、主に TFF に独自の TensorFlow モデルをプラグインし、後者を主にブラックボックスとして扱うユーザーを対象としています。TFF の詳細と独自のフェデレーテッドラーニングアルゴリズムの実装方法については、FC Core API-[カスタムフェデレーテッドアルゴリズムパート 1 ](custom_federated_algorithms_1.ipynb)および[パート 2 ](custom_federated_algorithms_2.ipynb)のチュートリアルを参照してください。\n",
"\n",
"`tff.learning`の詳細については、[「テキスト生成のためのフェデレーテッドラーニング」](federated_learning_for_text_generation.ipynb)チュートリアルに進んでください。このチュートリアルでは、反復モデルだけでなく、事前学習済みのシリアル化された Keras モデルを読み込み、Keras を使用した評価とフェデレーテッドラーニングを使った微調整のためのデモも行います。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "MnUwFbCAKB2r"
},
"source": [
"## 始める前に\n",
"\n",
"始める前に、次のコードを実行し、環境が正しくセットアップされていることを確認してください。挨拶文が表示されない場合は、[インストール](../install.md)ガイドで手順を確認してください。 "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "ZrGitA_KnRO0"
},
"outputs": [],
"source": [
"#@test {\"skip\": true}\n",
"!pip install --quiet --upgrade tensorflow_federated\n",
"\n",
"%load_ext tensorboard"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "8BKyHkMxKHfV"
},
"outputs": [
{
"data": {
"text/plain": [
"b'Hello, World!'"
]
},
"execution_count": 3,
"metadata": {
"tags": []
},
"output_type": "execute_result"
}
],
"source": [
"import collections\n",
"\n",
"import numpy as np\n",
"import tensorflow as tf\n",
"import tensorflow_federated as tff\n",
"\n",
"np.random.seed(0)\n",
"\n",
"tff.federated_computation(lambda: 'Hello, World!')()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "5Cyy2AWbLMKj"
},
"source": [
"## 入力データを準備する\n",
"\n",
"まず、データから始めましょう。フェデレーテッドラーニングには、フェデレーテッドデータセット、つまり複数のユーザーからのデータのコレクションが必要です。フェデレーテッドデータは通常、非 [i.i.d.](https://en.wikipedia.org/wiki/Independent_and_identically_distributed_random_variables) であり、固有の一連の課題があります。\n",
"\n",
"TFF リポジトリには、実験を容易にするためにいくつかのデータセットがシードされています。データセットには、[Leaf](https://github.com/TalwalkarLab/leaf) を使用して再処理された[元の NIST データセット](https://www.nist.gov/srd/nist-special-database-19)のバージョンを含む MNIST のフェデレーテッドバージョンが含まれているので、データは数字の元のライターによってキー設定されています。各ライターには独自のスタイルがあるため、このデータセットは、フェデレーテッドデータセットに期待される非 i.i.d の動作を示します。\n",
"\n",
"以下の手順に従って読み込みます。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "NayDhCX6SjwE"
},
"outputs": [],
"source": [
"emnist_train, emnist_test = tff.simulation.datasets.emnist.load_data()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "yeX8BKgPfeFw"
},
"source": [
"`load_data()`によって返されるデータセットは、`tff.simulation.ClientData`のインスタンスです。これは、ユーザーのセットを列挙したり、特定のユーザーのデータを表す`tf.data.Dataset`を構築したり、個々の要素の構造を照会したりするためのインターフェースです。以下のように、このインターフェースを使用してデータセットのコンテンツを探索します。このインターフェースではクライアント ID を反復処理できますが、これはシミュレーションデータの機能であることに注意してください。以下で説明しますが、クライアント ID はフェデレーテッドラーニングフレームワークでは使用されません。クライアント ID の唯一の目的は、シミュレーション用にデータのサブセットを選択できるようにすることです。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "kN4-U5nJgKig"
},
"outputs": [
{
"data": {
"text/plain": [
"3383"
]
},
"execution_count": 5,
"metadata": {
"tags": []
},
"output_type": "execute_result"
}
],
"source": [
"len(emnist_train.client_ids)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "ZyCzIrSegT62"
},
"outputs": [
{
"data": {
"text/plain": [
"OrderedDict([('pixels', TensorSpec(shape=(28, 28), dtype=tf.float32, name=None)), ('label', TensorSpec(shape=(), dtype=tf.int32, name=None))])"
]
},
"execution_count": 6,
"metadata": {
"tags": []
},
"output_type": "execute_result"
}
],
"source": [
"emnist_train.element_type_structure"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "EsvSXGEMgd9G"
},
"outputs": [
{
"data": {
"text/plain": [
"1"
]
},
"execution_count": 7,
"metadata": {
"tags": []
},
"output_type": "execute_result"
}
],
"source": [
"example_dataset = emnist_train.create_tf_dataset_for_client(\n",
" emnist_train.client_ids[0])\n",
"\n",
"example_element = next(iter(example_dataset))\n",
"\n",
"example_element['label'].numpy()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "OmLV0nfMg98V"
},
"outputs": [
{
"data": {
"image/png": "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\nfTpx4oSGh4fl8/kUDAZ19OjRnA8LIHvSxr927Vo55x67vK2tLScDAcgPXuEHGEX8gFHEDxhF/IBR\nxA8YRfyAUcQPGEX8gFHEDxhF/IBRxA8YRfyAUcQPGEX8gFE+96T36+bIsmXLFAwG575PJBJF+9Fe\nxTpbsc4lMVumsjnb2NiYpqen53XdvMb//8LhsDzPK9TuUyrW2Yp1LonZMlWo2XjaDxhF/IBRpT09\nPT2FHKC5ubmQu0+pWGcr1rkkZstUIWYr6M/8AAqHp/2AUQWJf2BgQC+//LJqamrU29tbiBGSCgaD\ncx9THg6HCzpLV1eX/H7/I2si3Lp1S5FIRLW1tYpEIkmXSSvEbMWycnOylaULfeyKbsVrl2cPHjxw\n1dXVbnR01P3999+usbHRXblyJd9jJPXiiy+6RCJR6DGcc8798MMP7tKlS66urm7uso8++sjt37/f\nOefc/v373ccff1w0s3366afuiy++KMg8/+vmzZvu0qVLzjnn/vrrL1dbW+uuXLlS8GOXbK5CHbe8\nP/IPDQ2ppqZG1dXVWrRokbZs2aL+/v58j/FUaGlp0dKlSx+5rL+/X52dnZKkzs5OnT59uhCjPXG2\nYhEIBLRq1SpJj64sXehjl2yuQsl7/BMTE1qxYsXc91VVVUW15LfP59OGDRvU3NysWCxW6HEeMzk5\nObdkeiAQ0NTUVIEnetR8Vm7Op/9dWbqYjl0mK15nW97jd084ueDz+fI9RlKDg4P65ZdfdPbsWR05\nckQ//vhjoUd6asx35eZ8+f+VpYtFpiteZ1ve46+qqtL4+Pjc9zdu3FBlZWW+x0jqP7P4/X5t2rSp\n6FYfrqiomFskNR6Py+/3F3ii/yqmlZuTrSxd6GNXTCte5z3+1atXa2RkRNevX9e9e/d08uRJtbe3\n53uMJ7p7965u37499/W5c+eKbvXh9vZ29fX1SZL6+vq0cePGAk/0X8WycrNLsrJ0oY9dsrkKdtzy\n/itG59yZM2dcbW2tq66udp9//nkhRnii0dFR19jY6BobG92rr75a8Nm2bNninn/+eVdWVuaWL1/u\nvv76azc9Pe3Wr1/vampq3Pr1692ff/5ZNLO9++67rr6+3jU0NLi33nrL3bx5syCz/fTTT06Sa2ho\ncCtXrnQrV650Z86cKfixSzZXoY4br/ADjOIVfoBRxA8YRfyAUcQPGEX8gFHEDxhF/IBRxA8Y9S85\nOQzW0CUnRwAAAABJRU5ErkJggg==\n",
"text/plain": [
"