Zalando数据集
Zalando SE是德国的电子商务公司,位于Berlin.这个人司维护交互平台商店销售 鞋子,衣服,和其它时尚产品。对于 kaggle竞赛(如果你不了解,请看www.kaggle.com, 你可以参加许多的况赛来解决数据科学问题), Zalando 准备了 MNIST-相似的衣服的图数据集,提供了60,000个训练图像和10,000个测试图像.如 MNIST,每张图像为 28 × 28像素的灰 度图像. Zalando分组所有的图像到10类,并给每张图像标签。数据集有785列.第一列是类标签 (从0到 9的整数), 其它的784列是图像的像素灰度值 (你可以计算 28 × 28 = 784),与MNIST数据集一样.
每个训练集和测试集的样本的标签如下 (按官方文档):
- 0: T-shirt/top
- 1: Trouser
- 2: Pullover
- 3: Dress
- 4: Coat
- 5: Sandal
- 6: Shirt
- 7: Sneaker
- 8: Bag
- 9: Ankle boot
在图 4-25, 你可以看到每个类的例子,随机的选自数据集.
这个数据集提供了 MIT授权。数据文件可以下载自kaggle (www.kaggle.com/zalando-research/fashionmnist/data)或者GitHub (https://github.com/zalandoresearch/fashion-mnist).如果你选择第二个,你要准备数据多一些. (你可以转换它到 CSV使用https://pjreddie.com/projects/mnist-in-csv/.提供的脚本)如果你下载自kaggle,数据已要有了正确的格式.你可以找到两个压缩的CSV文件于 kaggle网站.解压后,你有 fashion-mnist_ train.csv, 有 60,000 张图像 (约130MB),和fashion-mnist_test.csv, 有10,000张图像 (约 21MB).我们打开 a Jupyter notebook并开始定代码!
我们需要以下导入:
import pandas as pd import numpy as np import tensorflow as tf
%matplotlib inline import matplotlib
import matplotlib.pyplot as plt from random import *
将 CSV 文件放在 notebook同一个目录.然后你用pandas函数加载文件.
data_train = pd.read_csv('fashion-mnist_train.csv', header = 0)
你也可以用标准NumPy函数读文件 (如 loadtxt()), 但是命名用 read_csv()自pandas会有很多的灵活性来切片和分析数据 .另外,它快很多.读文件 (约130MB) 用 pandas需要10秒钟,而用NumPy, 需要1分种20秒,用我的笔记本电脑.所以如果你要处理大数据集,要注意.最常用的实践是用pandas读和准备数据。如果你不熟悉 pandas,不有担心.我会详细的解释你要理解的东西。
注意 记住:你不用关注于python实现.要关注实现背后的模型,概念 .使用pandas, Numpy, 甚至 C你可以得到相同的结果.专注于如何准备数据,如何归一化它们,如何检查训练,等.
使用命令
data_train.head()
你可以看到数据集的前5行,如图 4-26所示.
图4-26. 使用 data_train.head()命令,你可以检查数据集的前5行
你可以看到每一列者有名字 。pandas追踪它自文件的第一行.检查列名,你就知道它在哪一列 。例如,第一行,我们有类的标签。现在我们必须创建一个数组带有标签和784个特下 (记住我们有像素灰度值作为特征). 对于这一点,我们可以写以下代码:
labels = data_train['label'].values.reshape(1, 60000) train = data_train.drop('label', axis=1).transpose()
我们简单的讨论一下这个代码做什么,从标签开始。在pandas里,每一列都有名称(如图4-26),本例中它自动的从CSV文件的第一行推理出。第一列(“label”)包含类的标签,从0到9的整数.在pandas里,选择这一列,可以用下面的代码:
data_train['label']
在方括号里给出列名.
data_train['label'].shape
你得到值 (60000),如期望的.我们想要一个标签的张量维为 1 × m, 其中 m 是观察数 (本例 60000).所以我们必须用命令改变形状
labels = data_train['label'].values.reshape(1, 60000)
现在张量标签的维为 (1, 60000),是我们想要的.
包含 特征的张量应包含除标签外的所有列。所以我们只简单的去除标签列用drop('label', axis=1),取其它所有列然后转置张量.事实上, data_train.drop('label', axis=1)的维为 (60000, 784),我们需要的张量的维为 nx × m, 这里 nx = 784是特征数.下面是我们的张量的总结 .
- Labels:它的张量为1 × m (1 × 60000)且包含类标签 (自 0到 9的整数).
- Train: 它的维为 nx × m (784 × 60000) 且包含特征,每一行包含图像像素的灰度值 (记住 28 × 28 = 784).
参见 4-25看图片的样本。最后,归一化输入,以便值不是从0到 255 (灰度值),而是 0到 1的值.用下面的代码很容易:
train = np.array(train / 255.0)
用 tensorflow构建模型
labels_ = np.zeros((60000, 10)) labels_[np.arange(60000), labels] = 1 labels_ = labels_.transpose()
labels_ = np.array(labels_)
n_dim = 784 tf.reset_default_graph()
# Number of neurons in the layers
n1 = 5 # Number of neurons in layer 1
n2 = 10 # Number of neurons in output layer
cost_history = np.empty(shape=[1], dtype = float) learning_rate = tf.placeholder(tf.float32, shape=())
X = tf.placeholder(tf.float32, [n_dim, None]) Y = tf.placeholder(tf.float32, [10, None])
W1 = tf.Variable(tf. truncated_normal ([n1, n_dim], stddev=.1)) b1 = tf.Variable(tf.zeros([n1,1]))
W2 = tf.Variable(tf. truncated_normal ([n2, n1], stddev=.1)) b2 = tf.Variable(tf.zeros([n2,1]))
# Let's build our network...
Z1 = tf.nn.relu(tf.matmul(W1, X) + b1) Z2 = tf.nn.relu(tf.matmul(W2, Z1) + b2) y_ = tf.nn.softmax(Z2,0)
cost = - tf.reduce_mean(Y * tf.log(y_)+(1-Y) * tf.log(1-y_)) optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cost)
init = tf.global_variables_initializer()
现在我们进行训练.我们可以重用代码。试一下用笔记本电脑运行下面的代码:
sess = tf.Session() sess.run(tf.global_variables_initializer())
training_epochs = 5000
cost_history = []
for epoch in range(training_epochs+1):
sess.run(optimizer, feed_dict = {X: train, Y: labels_, learning_rate: 0.001})
cost_ = sess.run(cost, feed_dict={ X:train, Y: labels_, learning_rate: 0.001})
cost_history = np.append(cost_history, cost_)
if (epoch % 20 == 0):
print("Reached epoch",epoch,"cost J =", cost_)
最后你需要的代码是用来计算准确率的,你可以用下面的代码:
correct_predictions = tf.equal(tf.argmax(y_,0), tf.argmax(Y,0)) accuracy = tf.reduce_mean(tf.cast(correct_predictions, "float"))
print ("Accuracy:", accuracy.eval({X: train, Y: labels_, learning_rate: 0.001}, session = sess))
我已经展示了如何加载和准备训练集。要进行基础的误差分析,你需 开发集。你可以用下面的代码。我不讨论它,因这它与训练集的代码一样.
data_dev = pd.read_csv('fashion-mnist_test.csv', header = 0) labels_dev = data_test['label'].values.reshape(1, 10000)
labels_dev_ = np.zeros((10000, 10)) labels_dev_[np.arange(10000), labels_dev] = 1 labels_dev_ = labels_dev_.transpose()
dev = data_dev.drop('label', axis=1).transpose()
最后,要计算dev数据集的准确率,你只要重用前面的代码.
correct_predictions = tf.equal(tf.argmax(y_,0), tf.argmax(Y,0)) accuracy = tf.reduce_mean(tf.cast(correct_predictions, "float"))
print ("Accuracy:", accuracy.eval({X: dev, Y: labels_dev_, learning_rate: 0.001}, session = sess))