Ошибка в форме входных данных в моей свёрточной сети

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

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)

Основные изменения:

  1. Добавление to_categorical для преобразования train_y и test_y в формат one-hot encoding.
  2. Указание input_shape для первого сверточного слоя в модели.
  3. Нормализация входных даных путем деления на 255, чтобы значения пикселей находились в диапазоне [0, 1].
  4. Добавление функции активации softmax на последнем слое для многоклассовой классификации.

Эти изменения помогут вам избежать ошибки, и ваша модель должна теперь обучаться корректно.

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

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