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

Arrays 如何遍历两个不同维度的numpy数组,arrays,numpy,keras,Arrays,Numpy,Keras,我正在使用MNIST数据集,x_测试的维度为10000784,y_测试的维度为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)

我正在使用MNIST数据集,x_测试的维度为10000784,y_测试的维度为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)

您正在混合使用培训功能和测试标签。培训集有60000个样本,测试集有10000个样本,也就是说,您的x_测试的尺寸应为10000784。确保下载了所有正确的数据,不要将培训数据与测试数据混淆

假设您在这里实际要做的是获得测试集中每个样本的单个损失,下面是一种在您的方法中实现这一点的方法,即使您通过了迭代部分,您也会遇到model.evaluate的问题,它不是为单样本对设计的

为了使示例重现,这里我还假设我们第一次只运行了2个时代;因此,我们数据的形状是:

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,)
i、 e.ce现在包含了你问题中的分数表应该包含的内容

为了确认,让我们使用model.evaluate计算所有测试样本的损失:

再次手动平均我们刚刚计算的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_检验的形状为10000,784,可以说是严格向前的…

可能您错误地提取了x_检验和y_检验,因为它们应该具有相同的长度。请在得到X_测试和y_测试的地方添加代码。您希望如何迭代两个不同大小的东西?这没有道理。一个项目将在另一个项目之前用完。我已编辑了问题。您需要包含完整的错误回溯,因为您的问题现在还不清楚问题是什么。如果答案解决了您的问题,请接受,否则请留下反馈-谢谢
log_loss == score[0]
# False

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