Quando solicito ao Keras para aplicar a previsão com um modelo ajustado a um novo conjunto de dados sem rótulo como este:
model1.predict_classes(X_test)
Funciona bem. Mas quando tento fazer previsão para apenas uma linha, ela falha:
model1.predict_classes(X_test[10])
Exception: Error when checking : expected dense_input_6 to have shape (None, 784) but got array with shape (784, 1)
Eu quero saber porque?
neural-network
keras
Hendrik
fonte
fonte
numpy.ndarray
. Assim, para obter apenas o valor que deseja:q = model.predict(np.array([single_x_test]))[0]
predict_classes
está esperando uma matriz 2D de forma(num_instances, features)
, comoX_test
é. Mas indexar uma única instância como emX_test[10]
retorna uma matriz 1D de forma(features,)
.Para adicionar de volta o eixo extra, você pode usar , ou , ou não se livrar dele em primeiro lugar (por exemplo, usando ).
np.expand_dims
(X_test[10], axis=0)
X_test[10][np.newaxis,:]
X_test[10:11]
fonte
Atualmente (Keras v2.0.8), é necessário um pouco mais de esforço para obter previsões em linhas únicas após o treinamento em lote.
Basicamente, o batch_size é corrigido no tempo de treinamento e deve ser o mesmo no tempo de previsão.
A solução agora é pegar os pesos do modelo treinado e usá-los como pesos em um novo modelo que você acabou de criar, com um lote de tamanho 1.
O código rápido para isso é
Aqui está uma postagem de blog que tem mais detalhes: https://machinelearningmastery.com/use-different-batch-sizes-training-predicting-python-keras/
Eu usei essa abordagem no passado para ter vários modelos no momento da previsão - um que faz previsões em lotes grandes, um que faz previsões em lotes pequenos e outro que faz previsões em itens únicos. Como as previsões de lote são muito mais eficientes, isso nos dá a flexibilidade de receber qualquer número de linhas de previsão (não apenas um número que é igualmente divisível por batch_size), enquanto ainda obtemos previsões rapidamente.
fonte
Isso seria como prever para um elemento, desta vez o número 17.
fonte
Você deve passar uma lista com apenas 1 exemplo, não posso testar agora, mas isso deve funcionar:
fonte
onde X é um array numpy. Foi tudo o que fiz e funcionou.
fonte
Corrigi isso usando a seguinte abordagem:
Observe que a quantidade de recursos (784) na função remodelar é baseada no seu exemplo acima, se você tiver menos recursos, precisará ajustá-lo.
Espero que funcione para você também.
fonte
se você tentar imprimir a instância, verá o seguinte:
então acho que podemos adicionar de volta uma dimensão usando o np.array:
fonte
Isso significa que seus dados de treinamento tinham a forma de (784, 1). Você pode apenas remodelá-lo da seguinte forma. Funcionou para mim.
Você também pode fazer
transpose()
se a forma for (1.784),fonte