我正在使用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)
答案 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)
)。确保您已下载所有正确的数据,并且不要将培训数据与测试数据混淆。