【FATE】MNIST手寫數字識別——卷積神經網絡
1 環境配置
操作系統:macOS Sierra 10.12.6
docker版本:19.03.8
FATE版本:單機版1.3
python版本:3.6.10
tensorflow:1.15.2
keras版本:2.3.0
2 準備數據
數據的準備與上傳參考上一篇文章【FATE】MNIST手寫數字識別——全連接網絡
本次實踐基於上次準備好的數據,不用再進行上傳操作
3 編輯運行配置文件
3.1 搭建模型
首先進入python解釋器:
python
由於 FATE 目前只接受一維數據輸入,所以在模型搭建一開始我們添加一個Reshape
層,用於把一維數據轉換成卷積層需要接受的數據格式。
model.add(Reshape((28,28,1), input_shape=(784,)))
搭建卷積神經網絡的全部過程:
import keras
from keras.models import Sequential
from keras.layers import Reshape, Dense, Conv2D, Flatten, MaxPooling2D
model = Sequential()
model.add(Reshape((28,28,1), input_shape=(784,)))
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dense(10, activation='softmax'))
得到json格式的模型:
json = model.to_json()
print(json)
拷貝輸出的一長串 json,退出python解釋器:
exit()
3.2 修改運行配置文件
進入配置文件,將剛剛輸出的json格式的模型拷貝到algorithm_parameters:homo_nn_0:[$nn_define]位置:
vi examples/federatedml-1.x-examples/homo_nn/test_homo_nn_keras_temperate.json
修改超參數(可自行調整):
"batch_size": 64,
"optimizer": {
"optimizer": "RMSprop",
"learning_rate": 0.01
},
"early_stop": {
"early_stop": "diff",
"eps": 1e-5
},
"loss": "categorical_crossentropy",
"max_iter": 8
4 編輯DSL配置文件
使用自帶的DSL配置文件,路徑:
fate/examples/federatedml-1.x-examples/homo_nn/test_homo_nn_train_then_predict.json
5 開始訓練任務
命令:
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
6 結果
登錄到FateBoard查看訓練任務情況,通過log查看訓練過程中損失和精度的變化情況。
損失達到了0.17左右,精度達到了0.97左右,效果好於之前的全連接網絡。