【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左右,效果好于之前的全连接网络。