單機版FATE實現MNIST手寫數字識別

一、環境配置

操作系統:macOS Sierra 10.12.6
docker版本:19.03.8
FATE版本:1.3
python版本:3.6.10
tensorflow:1.15.2
keras版本:2.2.4

二、準備數據

1. 下載數據

本文使用MNIST數據集,MNIST是手寫數字識別的數據集。從kaggle下載csv格式的數據集。
FATE訓練時需要數據集有id,MNIST數據集裏有6w條數據,模擬橫向聯邦學習,把數據集分爲兩個各有3w條記錄的數據集。

2. 處理數據

首先進入下載到本地的目錄,依次輸入以下命令:

awk -F'\t' -v OFS=',' ' NR == 1 {print "id",$0; next} {print (NR-1),$0}' mnist_train.csv > mnist_train_with_id.csv

目的:在第一行最前面加上id,第二行開始加序號,並用逗號作爲分隔符

sed -i "" "s/label/y/g" mnist_train_with_id.csv

目的:將表頭的label替換成y,在FATE裏label的名字通常爲y。

split -l 30001 mnist_train_with_id.csv mnist_train_3w.csv

目的:將mnist_train_with_id.csv分割,每一個文件有30001行(一行標題和30000行數據)。會生成兩個文件:mnist_train_3w.csvaa和mnist_train_3w.csvab

mv mnist_train_3w.csvaa mnist_train_3w_a.csv
mv mnist_train_3w.csvab mnist_train_3w_b.csv
sed -i "" "`cat -n mnist_train_3w_a.csv |head -n 1`" mnist_train_3w_b.csv

目的:將兩個文件重命名,並將mnist_train_3w_a.csv文件的第一行(csv的表頭)插入mnist_train_3w_b.csv的最前面。這樣我們就得到了兩個有表頭和id的數據集,各有30000條數據

docker cp ${mnist_train_3w_a_path} fate_python: fate/examples/data/
docker cp ${mnist_train_3w_b_path} fate_python: fate/examples/data/

${mnist_train_3w_a_path}:本地保存mnist_train_3w_a.csv的路徑
${mnist_train_3w_b_path}:本地保存mnist_train_3w_b.csv的路徑
目的:將本地數據拷貝至docker容器(fate_python)中的目錄(fate/examples/data/)下

3. 上傳數據

(1)上傳host方數據

首先進入fate容器:

docker exec -it fate_python bash

下載vim和sudo:

apt-get update
apt-get install vim
apt-get install sudo

新建upload_data_host.json

sudo vi examples/federatedml-1.x-examples/homo_nn/upload_data_host.json

編輯保存退出:

{
    "file": "examples/data/mnist_train_3w_a.csv",
    "head": 1,
    "partition": 10,
    "work_mode": 0,
    "table_name": "homo_mnist_host",
    "namespace": "homo_mnist_host"
}

上傳命令:

python fate_flow/fate_flow_client.py -f upload -c examples/federatedml-1.x-examples/homo_nn/upload_data_host.json

(2)上傳guest方數據

新建upload_data_guest.json

sudo vi examples/federatedml-1.x-examples/homo_nn/upload_data_guest.json

編輯保存退出:

{
    "file": "examples/data/mnist_train_3w_b.csv",
    "head": 1,
    "partition": 10,
    "work_mode": 0,
    "table_name": "homo_mnist_guest",
    "namespace": "homo_mnist_guest"
}

上傳命令:

python fate_flow/fate_flow_client.py -f upload -c examples/federatedml-1.x-examples/homo_nn/upload_data_guest.json

可登錄到FateBoard查看上傳任務情況

三、編輯運行配置文件

1. 搭建模型

首先進入python解釋器:

python

搭建一個keras模型:

import keras
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(512,activation='relu',input_shape=(784,)))
model.add(Dense(256,activation='relu'))
model.add(Dense(10,activation='softmax'))

得到json格式的模型:

json = model.to_json()
print(json)

拷貝輸出的一長串 json,退出python解釋器:

exit()

2. 修改運行配置文件

進入配置文件,將剛剛輸出的json格式的模型拷貝到algorithm_parameters:homo_nn_0:$nn_define位置:

vi examples/federatedml-1.x-examples/homo_nn/test_homo_nn_keras_temperate.json

修改guest方數據集的namenamespace

"name": "homo_mnist_guest",
"namespace": "homo_mnist_guest"

修改host方數據集的namenamespace

"name": "homo_mnist_host",
"namespace": "homo_mnist_host"

修改超參數(可自行調整):

"batch_size": 100,
"optimizer": {
  "optimizer": "Adam",
  "learning_rate": 0.01
},
"early_stop": {
  "early_stop": "diff",
  "eps": 1e-5
},
"loss": "categorical_crossentropy",
"max_iter": 5

四、編輯DSL配置文件

使用自帶的DSL配置文件,路徑:

fate/examples/federatedml-1.x-examples/homo_nn/test_homo_nn_train_then_predict.json

五、開始訓練任務

命令:

python fate_flow/fate_flow_client.py -f submit_job -c examples/federatedml-1.x-examples/homo_nn/test_homo_nn_keras_temperate.json -d examples/federatedml-1.x-examples/homo_nn/test_homo_nn_train_then_predict.json

成功後將得到輸出:

{
    "data": {
        "board_url": "http://172.18.0.3:8080/index.html#/dashboard?job_id=202006131204487401867&role=guest&party_id=10000",
        "job_dsl_path": "/fate/jobs/202006131204487401867/job_dsl.json",
        "job_runtime_conf_path": "/fate/jobs/202006131204487401867/job_runtime_conf.json",
        "logs_directory": "/fate/logs/202006131204487401867",
        "model_info": {
            "model_id": "arbiter-10000#guest-10000#host-10000#model",
            "model_version": "202006131204487401867"
        }
    },
    "jobId": "202006131204487401867",
    "retcode": 0,
    "retmsg": "success"
}

可登錄到FateBoard查看訓練任務情況
FateBoard
通過log可以查看訓練過程中損失和精度的變化情況。

參考資料

使用FATE進行圖片識別的深度神經網絡聯邦學習
聯邦學習框架FATE實踐(訓練/測試步驟及參數說明)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章