Тензорфлоу – Я не получаю правильные формы – ValueError: Shapes (100, 10, 10) and (100, 10) are incompatible

Вопрос или проблема

Я работаю над кодом классификации mnist. Такие ошибки продолжают возникать в коде 코드 ниже.

import tensorflow as tf

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
print(x_train.shape) # (60000, 28, 28)
print(y_train.shape)

import matplotlib.pyplot as plt

print("Y[0] : ",  y_train[0])
plt.imshow(x_train[0], cmap=plt.cm.gray_r, interpolation = "nearest")

x_train = x_train.reshape(-1,28*28)
x_test = x_train / 255.0
x_test / 255.0

y_train = tf.keras.utils.to_categorical(y_train, 10)
y_test = tf.keras.utils.to_categorical(y_test, 10)

Это код возникновения ошибки.

model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(units=10, input_dim=784, activation='softmax'))
model.compile(loss="categorical_crossentropy", optimizer=tf.optimizers.Adam(learning_rate=0.001), metrics=['accuracy'])
model.summary()

model.fit(x_train, y_train, batch_size=100, epochs=10, validation_data=(x_test, y_test))


ValueError: Shapes (100, 10, 10) and (100, 10) are incompatible

Это мое сообщение об ошибке.

Сначала произошла ошибка изменения формы, поэтому в код была добавлена строка x_trial.reshape (-1,28*28). Затем возникла эта ошибка. Как я должен изменить форму?

Когда я запустил предоставленный вами код, я не получил упомянутую ошибку, а ошибку, связанную с различием в количестве образцов для переменных x и y. Это произошло из-за строки в вашем коде, где вы нормализуете данные из x_train, но присваиваете выход x_test, оставив у вас 60000 наблюдений в x_test, но только 10000 в y_test. После внесения этих изменений код работает корректно:

import tensorflow as tf
import matplotlib.pyplot as plt

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()

x_train = x_train.reshape(-1, 28 * 28)
x_train = x_train / 255.0 # изменено для сохранения вывода в x_train вместо x_test
x_test = x_test.reshape(-1, 28 * 28) # изменена форма x_test для получения правильных размеров
x_test = x_test / 255.0 # также применяется нормализация к тестовым данным

y_train = tf.keras.utils.to_categorical(y_train, 10)
y_test = tf.keras.utils.to_categorical(y_test, 10)

model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(units=10, input_dim=784, activation='softmax'))
model.compile(loss="categorical_crossentropy", optimizer=tf.optimizers.Adam(learning_rate=0.001), metrics=['accuracy'])
model.summary()

model.fit(x_train, y_train, batch_size=100, epochs=10, validation_data=(x_test, y_test))

Ошибка возникает из-за формы x_test. В вашем коде вы фактически устанавливаете ее в x_train. [x_test = x_train / 255.0] Кроме того, если вы подаете данные в векторе из 784 элементов, вам также нужно преобразовать ваши тестовые данные. Поэтому измените строку на x_test = (x_test / 255.0).reshape(-1,28*28).

Ответ или решение

Проблема, с которой вы столкнулись в коде для классификации рукописных цифр из набора данных MNIST, связана с несоответствием форм данных входных и выходных переменных, а именно ошибкой ValueError: Shapes (100, 10, 10) and (100, 10) are incompatible. Давайте подробно разберемся в этой ошибке и предложим правильное решение.

Анализ проблемы

  1. Формы входящих данных:

    • Вы загрузили данные MNIST, которые имеют форму:
      • x_train имеет форму (60000, 28, 28).
      • y_train имеет форму (60000,).
  2. Обработка данных:

    • После загрузки данных вы изменили форму x_train на (60000, 784), а y_train преобразовали в категориальный формат с помощью tf.keras.utils.to_categorical, который преобразует метки в форму (60000, 10).
  3. Ошибка в нормализации данных:

    • Обратите внимание на следующий фрагмент кода:
      x_test = x_train / 255.0

      Здесь вы ошибочно нормализовали x_train и присвоили результат переменной x_test. Таким образом, x_test получил 60000 образцов вместо правильных 10000 образцов.

  4. Решение:

    • Вам нужно нормализовать сами данные x_test, а не x_train. Исправленный код будет выглядеть следующим образом:

      import tensorflow as tf
      import matplotlib.pyplot as plt
      
      (x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
      
      x_train = x_train.reshape(-1, 28 * 28) / 255.0  # Нормализация и изменение формы для обучающего набора
      x_test = x_test.reshape(-1, 28 * 28) / 255.0     # Нормализация и изменение формы для тестового набора
      
      y_train = tf.keras.utils.to_categorical(y_train, 10)
      y_test = tf.keras.utils.to_categorical(y_test, 10)
      
      model = tf.keras.Sequential()
      model.add(tf.keras.layers.Dense(units=10, input_dim=784, activation='softmax'))
      model.compile(loss="categorical_crossentropy", optimizer=tf.optimizers.Adam(learning_rate=0.001), metrics=['accuracy'])
      model.summary()
      
      model.fit(x_train, y_train, batch_size=100, epochs=10, validation_data=(x_test, y_test))

Резюме

Таким образом, основная причина возникновения ошибки заключалась в несоответствии форм данных, так как вы изменили и нормализовали данные тестового набора неправильно. Убедитесь, что вы обрабатываете входные данные корректно, и форматы x_train и y_train, а также x_test и y_test соответствуют друг другу. следуя приведенным выше исправлениям, ваш код должен работать корректно.

Если у вас возникнут дополнительные вопросы или потребуется дополнительная помощь, не стесняйтесь обращаться. Успехов вам в работе с TensorFlow и поездкой в мир глубокого обучения!

Оцените материал
Добавить комментарий

Капча загружается...