用Python实现神经网络(三)

发布于:2025-07-21 ⋅ 阅读:(19) ⋅ 点赞:(0)

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, 你可以看到每个类的例子,随机的选自数据集.

4-25. Zalando数据集的10类中随机选择的样本

这个数据集提供了 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)包含类的标签,09的整数.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))


网站公告

今日签到

点亮在社区的每一天
去签到