如何遍历两个不同维的numpy数组

时间:2018-10-19 17:35:39

标签: arrays numpy keras

我正在使用MNIST数据集,x_test的维数为(10000,784),y_test的维数为(10000,10)。我需要同时遍历这两个numpy数组的每个样本,因为我需要将它们分别传递给score.evaluate()

我尝试了nditer,但是它引发了一个错误,指出操作数不能一起广播,因为它们的形状不同。

    score=[]
    for x_sample, y_sample in np.nditer ([x_test,y_test]):
         a=x_sample.reshape(784,1)
         a=np.transpose(a)
         b=y_sample.reshape(10,1)
         b=np.transpose(b)
         s=model.evaluate(a,b,verbose=0)
         score.append(s)

2 个答案:

答案 0 :(得分:1)

假设,您实际上要在此处进行的操作是获取测试集中每个样本的单个损失,这是一种解决方法(即使您过去了,也可以采用这种方法)迭代部分,您将遇到model.evaluate的问题,该问题并非为单个样本对设计的)...

为使该示例可重复,在此我还假设我们只对两个时期运行Keras MNIST CNN example;因此,我们的数据形状为:

x_test.shape
# (10000, 28, 28, 1)

y_test.shape
# (10000, 10)

鉴于此,这是一种获取每个样本的单个损失的方法:

from keras import backend as K

y_pred = model.predict(x_test)
y_test = y_test.astype('float32') # necessary, as y_pred.dtype is 'float32'
y_test_tensor = K.constant(y_test)
y_pred_tensor = K.constant(y_pred)
g = K.categorical_crossentropy(target=y_test_tensor, output=y_pred_tensor)

ce = K.eval(g)  # 'ce' for cross-entropy
ce
# array([1.1563368e-05, 2.0206178e-05, 5.4946734e-04, ..., 1.7662416e-04,
#        2.4232995e-03, 1.8954457e-05], dtype=float32)

ce.shape
# (10000,)

ce现在包含您问题中的score列表应该包含的内容。

对于确认,让我们使用model.evaluate计算所有测试样品的损失:

score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
# Test loss: 0.050856544668227435

再次手动,将我们刚刚计算出的ce的值取平均值:

import numpy as np

log_loss = np.sum(ce)/ce.shape[0]
log_loss
# 0.05085654296875

尽管不是完全相等(由于两种计算方式涉及不同的数值精度),但实际上它们实际上是相等的:

log_loss == score[0]
# False

np.isclose(log_loss, score[0])
# True

现在,根据您自己的情况改编x_test的形状为(10000, 784)的情况,可以说是直接的...

答案 1 :(得分:0)

您正在混合训练功能和测试标签。训练集有60,000个样本,测试集有10,000个样本(也就是说,您的x_test的维度应为(10000,784))。确保您已下载所有正确的数据,并且不要将培训数据与测试数据混淆。

http://yann.lecun.com/exdb/mnist/