Как перебрать два массива разных размеров - PullRequest
0 голосов
/ 19 октября 2018

Я работаю с набором данных MNIST, x_test имеет размерность (10000,784), а y_test имеет размерность (10000,10).Мне нужно перебирать каждую выборку из этих двух пустых массивов одновременно, так как мне нужно передать их индивидуально 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 голосов
/ 22 октября 2018

Предполагая , что вы на самом деле пытаетесь здесь получить индивидуальную потерю на выборку в своем тестовом наборе, вот способ сделать это (в вашем подходе, даже если вы пройдете мимоВ итерационной части у вас будут проблемы с model.evaluate, который не был разработан для одиночных пар выборок) ...

Чтобы сделать пример воспроизводимым, здесь я также предполагаю, что мы выполнили первый запускпример Keras MNIST CNN только для 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,)

т.е. 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), возможно, прямолинейна ...

0 голосов
/ 19 октября 2018

Вы смешиваете между функциями обучения и ярлыками тестирования.В обучающем наборе 60 000 образцов, а в тестовом наборе 10 000 образцов (т. Е. Ваш x_test должен иметь размер (10000,784)).Убедитесь, что вы загрузили все правильные данные и не путайте данные тренировок с данными тестирования.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...