Вопрос или проблема
import pandas as pd
import tensorflow as tf
import numpy as np
from keras.datasets import mnist
(train_X, train_y), (test_X, test_y) = mnist.load_data()
num_classes = 10
# определяем модель keras
model = tf.keras.Sequential()
model.add(tf.keras.layers.Conv2D(filters=6, kernel_size=5, activation='sigmoid', padding='same', data_format="channels_last"))
model.add(tf.keras.layers.AvgPool2D(pool_size=2, strides=2))
model.add(tf.keras.layers.Conv2D(filters=16, kernel_size=5, activation='sigmoid'))
model.add(tf.keras.layers.AvgPool2D(pool_size=2, strides=2))
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(120, activation='sigmoid'))
model.add(tf.keras.layers.Dense(84, activation='sigmoid'))
model.add(tf.keras.layers.Dense(num_classes))
model.compile(loss="CategoricalCrossentropy", optimizer="adam", metrics=['accuracy'])
model.fit(train_X.reshape(60000, 28, 28, 1), train_y, epochs=128, batch_size=16)
Привет, ребята, я пытаюсь построить сеть CNN, используя набор данных mnist.
Я пытался изменить масштаб входных данных, чтобы они имели 4 измерения, потому что я понимаю, что именно так работает свёрточный слой Keras, но когда я пытаюсь обучить модель, я получаю следующую ошибку:
ValueError: Аргументы target
и output
должны иметь одинаковый ранг (ndim). Получено: target.shape=(16,), output.shape=(16, 10)
Есть идеи, в чем проблема?
Ответ или решение
Ваша ошибка связана с тем, что целевая переменная train_y
не имеет того формата, который ожидает ваша модель. Вам необходимо преобразовать метки классов (labels) в формат, подходящий для многоклассовой классификации с использованием функции потерь CategoricalCrossentropy
.
Ваша текущая ошибка заключается в том, что train_y
имеет форму (60000,)
, которая содержит только одно значение для каждого примера, а выход модели имеет размерность (16, 10)
, что соответствует 10 классам.
Для решения этой проблемы вам нужно преобразовать train_y
в формат one-hot encoding. Это можно сделать с помощью функции to_categorical
из модуля keras.utils
. Вот исправленный код:
import pandas as pd
import tensorflow as tf
import numpy as np
from keras.datasets import mnist
from keras.utils import to_categorical
# Загружаем данные
(train_X, train_y), (test_X, test_y) = mnist.load_data()
# Преобразовываем метки классов в формат one-hot encoding
train_y = to_categorical(train_y, num_classes)
test_y = to_categorical(test_y, num_classes)
# Определяем модель Keras
model = tf.keras.Sequential()
model.add(tf.keras.layers.Conv2D(filters=6, kernel_size=5, activation='sigmoid', padding='same', data_format="channels_last", input_shape=(28, 28, 1)))
model.add(tf.keras.layers.AvgPool2D(pool_size=2, strides=2))
model.add(tf.keras.layers.Conv2D(filters=16, kernel_size=5, activation='sigmoid'))
model.add(tf.keras.layers.AvgPool2D(pool_size=2, strides=2))
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(120, activation='sigmoid'))
model.add(tf.keras.layers.Dense(84, activation='sigmoid'))
model.add(tf.keras.layers.Dense(num_classes, activation='softmax')) # Добавляем функцию активации softmax для последнего слоя
# Компилируем модель
model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=['accuracy'])
# Обучаем модель, предварительно изменяя форму входных данных
train_X = train_X.reshape(60000, 28, 28, 1).astype('float32') / 255.0 # Нормируем данные
model.fit(train_X, train_y, epochs=128, batch_size=16)
Основные изменения:
- Добавление
to_categorical
для преобразованияtrain_y
иtest_y
в формат one-hot encoding. - Указание
input_shape
для первого сверточного слоя в модели. - Нормализация входных даных путем деления на 255, чтобы значения пикселей находились в диапазоне [0, 1].
- Добавление функции активации
softmax
на последнем слое для многоклассовой классификации.
Эти изменения помогут вам избежать ошибки, и ваша модель должна теперь обучаться корректно.