通过数据把图像数据.append到数组中,然后通过CSV将数组中的数据下入CSV文件。
def Write_csv(Data=[[None]],csv_file_name="Train.csv"):
"""
向CSV文件中写入数据信息,有标签的话存放在数据最后位
:param csv_file_name: CSV文件名
:return: None,文件夹中会显示写入的数据信息
"""
import csv
with open(csv_file_name,"w",newline='') as csvfile:
writer = csv.writer(csvfile)#写出来存在逗号
# 没有逗号的写入方式,但是在读取的时候需要更改并处理数据
# writer=csv.writer(csvfile, delimiter=' ',quotechar='|', quoting=csv.QUOTE_MINIMAL)
#写入多行用writerows,写入单行用writerow
writer.writerows(Data)
print("Write All!")
def Write_Data():
import os
import cv2
#第一层文件夹目录
filename="..\\imgout\\"
Data = []
for file_1 in os.listdir(filename):
#第二层文件夹目录,第一层文件夹下的下一层文件夹目录
# print(file_1)file_1为文件名
filename_1 = os.path.join(filename, file_1)
Data_tmp = []
# print(file_1)
for file_2 in os.listdir(filename_1):
#第三层文件夹,找到对应文件的地址
filename_2 = os.path.join(filename_1, file_2)
Data_tmp1=[]
# print(filename_2)
img = cv2.imread(filename_2,0)
w,h=img.shape[:2]
# data=np.reshape(img,[w*h])
for i in range(w):
for j in range(h):
Data_tmp1.append(img[i,j])
#添加标签
Data_tmp1.append(file_1)
Data_tmp.append(Data_tmp1)
Data=Data+Data_tmp
Write_csv(Data)
使用FATE进行图片识别的深度神经网络联邦学习 - 知乎 (zhihu.com)
本文使用MNIST数据集,MNIST是手写数字识别的数据集。从kaggle下载csv格式的数据集。
FATE训练时需要数据集有id,MNIST数据集里有6w条数据,模拟横向联邦学习,把数据集分为两个各有3w条记录的数据集。
$ 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条数据。
分别将两个文件拷贝到两台机器上的/data/projects/fate/confs-<partyID>/shared_dir/examples/data目录里。
Shared_dir目录是本地文件系统和docker容器中文件系统的共享目录,使容器可以访问宿主机的文件。
Dataset 类
Dataset是一个抽象类,通常将数据包装为Dataset类,然后传入DataLoader中,我们再使用DataLoader这个类来更加快捷的对数据进行操作。不难发现,无论是使用自己的数据集还是官方的数据集(MNIST、ImageNet等),在使用自己Dataset 类时,需要继承Dataset 类,并且至少需要重写以下几个方法:
- init():构造函数,可自定义数据读取方法以及进行数据预处理;
- len():返回数据集大小;
- getitem():通过索引返回某一个数据。
import torch
from torch.utils.data import Dataset
class myDataset(Dataset):
# 构造函数
def __init__(self, X, Y):
super().__init__() #调用父类-Dataset类的__init__方法
self.X = X
self.Y = Y
# 返回数据集大小
def __len__(self):
return self.X.size(0)
# 返回索引的数据与标签
def __getitem__(self, index):
return self.X[index], self.Y[index]
当有多个数据集可供选择时,可以在选择数据集时比较数据集大小,尽量选择数据集大的数据集