打算基于这个写一篇深入理解Tensorflow搭建模型的文章。从MNIST数据的手动处理开始谈起。
在MNIST二进制数据集探索–基于Numpy处理这篇文章里,给出了处理MNIST二进制数据的代码。
首先问,为什么要自己动手处理这个二进制数据集呢?
第一,原因在于我们可以这么做,且MNIST数据量很小,训练集和测试集加起来就100多MB。60000 + 10000条数据。
第二,如果是用官方的教程,数据获取方式是:
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("/tmp/data/", one_hot=True) # 自动one_hot编码
然后在后面用到时,只需要:
batch_xs, batch_ys = mnist.train.next_batch(batch_size) # 获取一个batch的数据
print("Accuracy:", accuracy.eval({x: mnist.test.images, y: mnist.test.labels})) # 直接拿到数据
这对于学习TensorFlow这里的Tensor
如何Flow
并没有太大的助益。
如果我们能对数据集更加了解,知道如何处理填充给模型,就会很舒服。
不多说,先把代码丢上来:
import tensorflow as tf
import numpy as np
from load_ubyte_image import *
# mnist =
train_data_filename = "./datasets/mnist/train-images-idx3-ubyte"
train_label_filename = "./datasets/mnist/train-labels-idx1-ubyte"
test_data_filename = "./datasets/mnist/t10k-images-idx3-ubyte"
test_label_filename = "./datasets/mnist/t10k-labels-idx1-ubyte"
imgs, data_head = loadImageSet(train_data_filename)
# 这里的label是60000个数字,需要转成one-hot编码
labels, labels_head = loadLabelSet(train_label_filename)
test_images, test_images_head = loadImageSet(test_data_filename)
test_labels, test_labels_head = loadLabelSet(test_label_filename)
# 手动one_hot编码
def encode_one_hot(labels):
num = labels.shape[0]
res = np.zeros((num,10))
for i in range(num):
res[i,labels[i]] = 1 # labels[i]表示0,1,2,3,4,5,6,7,8,9,则对应的列是1,这就是One-Hot编码</