Как мне подготовить форму тестового набора для модели.оценить с помощью keras и tensorflow?

#python-3.x #tensorflow #keras #syntax-error #google-colaboratory

#python-3.x #tensorflow #keras #синтаксическая ошибка #google-colaboratory

Вопрос:

Я пытаюсь запустить простой пример с NN, используя набор данных MNIST, предоставленный самим tensorflow, работающий в Google Colab. Я хочу получить необработанные данные и самостоятельно смонтировать структуру, содержащую эти данные. Я могу обучить NN, но когда я пытаюсь предсказать один пример из тестового набора, я получаю ошибку

 ValueError: Error when checking input: expected dense_input to have shape (784,) but got array with shape (1,).
  

Может ли кто-нибудь помочь мне с этой проблемой? Я довольно новичок в Python и Keras / TensorFlow.

Когда я бегу

 print(inp.shape)
  

Я получаю (784,), а не (1,), как указано в ошибке.

Я также попытался оценить набор тестов, используя

 test_loss, test_accuracy = model.evaluate(test_input.T)
  

, но я также получаю сообщение об ошибке

 ValueError: Arguments and signature arguments do not match: 25 27.
  

Исходный код выглядит следующим образом:

 # Importing stuff
import tensorflow as tf
import tensorflow_datasets as tfds
import matplotlib.pyplot as plt
import numpy as np
import math
import time
import keras

tf.enable_eager_execution()

# Functions
def normalize(images, labels):
  images = tf.cast(images, tf.float32)
  images /= 255
  return images, labels

# Getting dataset
ds, meta = tfds.load('fashion_mnist', as_supervised=True, with_info=True)

test_ds, train_ds = ds['test'], ds['train']

# Preprocess the data
train_ds =  train_ds.map(normalize)
test_ds  =  test_ds.map(normalize)

num_train_examples = meta.splits['train'].num_examples
num_test_examples = meta.splits['test'].num_examples

# Making the train set
train_input = np.empty(shape=(784, num_train_examples))
train_label = np.empty(shape=(1, num_train_examples))

i = 0
for image, label in train_ds:
  image = image.numpy().reshape((784, 1))
  train_input[:, i] = image.ravel()
  label = label.numpy().reshape(1)
  train_label[:, i] = label
  i = i   1;

# Making the test set
test_input = np.empty(shape=(784, num_test_examples))
test_label = np.empty(shape=(1, num_test_examples))

i = 0
for image, label in test_ds:
  image = image.numpy().reshape((784, 1))
  test_input[:, i] = image.ravel()
  label = label.numpy().reshape(1)
  test_label[:, i] = label
  i = i   1;

# Network
input_layer = tf.keras.layers.Dense(units=784, input_shape=[784])
h1 = tf.keras.layers.Dense(128, activation=tf.nn.relu)
output_layer = tf.keras.layers.Dense(10, activation=tf.nn.softmax)

model = tf.keras.Sequential([input_layer, h1, output_layer])

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

model.fit(train_input.T, train_label.T, epochs=3, steps_per_epoch=100, batch_size=1)

test_loss, test_accuracy = model.evaluate(test_input.T)

inp = test_input[:, 0].T
res = model.predict(inp)
  

Ответ №1:

Все функции API сначала ожидают форму ввода, содержащую размер пакета. В вашем случае вы пытаетесь передать только 1 пример и, следовательно, размер пакета не указан. Вам просто нужно указать размер вашего пакета как 1, изменив форму данных.

Использование numpy:

 res = model.predict(np.reshape(inp, len(inp))
  

Аргумент predict метода теперь получает массив с формой (1, 784) в вашем случае, указывая размер пакета как 1.

Когда вы предоставляете функции больше примеров для оценки, накладывая их друг на друга, размер пакета неявно задается формой массива, поэтому дальнейшее преобразование не требуется.

Комментарии:

1. Спасибо за ваш быстрый ответ! Я попытался запустить команду, как вы сказали, но я все еще получил «ValueError: ошибка при проверке ввода: ожидаемый dense_input должен иметь форму (784,), но получил массив с формой (1,)».