Вопрос или проблема
Я работаю над кодом классификации 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
. Давайте подробно разберемся в этой ошибке и предложим правильное решение.
Анализ проблемы
-
Формы входящих данных:
- Вы загрузили данные MNIST, которые имеют форму:
x_train
имеет форму(60000, 28, 28)
.y_train
имеет форму(60000,)
.
- Вы загрузили данные MNIST, которые имеют форму:
-
Обработка данных:
- После загрузки данных вы изменили форму
x_train
на(60000, 784)
, аy_train
преобразовали в категориальный формат с помощьюtf.keras.utils.to_categorical
, который преобразует метки в форму(60000, 10)
.
- После загрузки данных вы изменили форму
-
Ошибка в нормализации данных:
- Обратите внимание на следующий фрагмент кода:
x_test = x_train / 255.0
Здесь вы ошибочно нормализовали
x_train
и присвоили результат переменнойx_test
. Таким образом,x_test
получил60000
образцов вместо правильных10000
образцов.
- Обратите внимание на следующий фрагмент кода:
-
Решение:
-
Вам нужно нормализовать сами данные
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 и поездкой в мир глубокого обучения!