原始数据
数据这方面,Kaggle给出的是csv文件,0列表示的是标签,其他28*28列是每个像素的值,而FastAi在设计的时候是没有考虑这种数据的,所以DataLoaders和learner都是不支持该类型的数据的。某些文章的做法是重写DataLoaders和learner的Model,但是个人观点,这样的话直接用Torch不是更好的选择么。FasterAi的API那么用是一定要用的,而数据都是像素值也不必要特殊的预处理,所以生成数据就完事了。
数据生成
采用了PIL.Image中的方法,配合os的文件方法,主要生成思路:
- pandas读取像素值数据,转换为28*28的ndarray
- 按序号生成图片名称,形如0.png,将训练集的图片放至命名为label(0-9)的文件夹。
- 将测试集图片放入任意文件夹。
代码如下:
images = path/'images'
train_image_folder = images/'train'
test_image_folder = images/'test'
m_train = train_df.shape[0]
n_train = train_df.shape[1]
m_test = test_df.shape[0]
n_test = test_df.shape[1]
if not os.path.exists(train_image_folder) and not os.path.exists(test_image_folder):
os.makedirs(train_image_folder)
os.makedirs(test_image_folder)
for i in range(0,m_train):
matrix = train_df.to_numpy()[i,1:].reshape((28,28))
img = Image.fromarray((np.uint8(matrix)))
#img = img.convert('RGB')
if not os.path.exists(train_image_folder/str(train_df.iloc[i,0])):
os.mkdir(train_image_folder/str(train_df.iloc[i,0]))
train_image_name = str(i)
img.save(train_image_folder/str(train_df.iloc[i,0]