ValueError: Ошибка при проверке цели: ожидается, что плотность_8 будет иметь 4 измерения, но получен массив с формой (37800, 10, 10) - PullRequest
0 голосов
/ 01 апреля 2019

Я новичок в машинном обучении.Я работаю над набором данных mnist, который я скачал с kaggle.Я делаю этот самый первый проект с помощью учебника.Но я сталкиваюсь с этой проблемой, которую не могу решить.Пожалуйста помоги.Вот ниже.

import keras 
import keras.preprocessing
import numpy as np
import matplotlib.pyplot as plt
from keras.models import Sequential
import pandas as pd
from keras.layers import Dense
from keras.optimizers import SGD
from sklearn.model_selection import ShuffleSplit
from sklearn.metrics import accuracy_score, confusion_matrix

X = pd.read_csv(r'C:\Users\faizan\Desktop\ML\Kaggle\MNIST\train.csv')

Y = pd.read_csv(r'C:\Users\faizan\Desktop\ML\Kaggle\MNIST\test.csv')

y = X["label"]

X = X.drop(["label"], 1)
#x = Y.drop(['label'], 1)

print(y.shape)
print(X.shape)
print(Y.shape)

y = keras.utils.to_categorical(y, num_classes = 10)
X = X / 255.0
X = X.values.reshape(-1,28,28,1)
# Shuffle Split Train and Test from original dataset
seed=2
train_index, valid_index = ShuffleSplit(n_splits=1,
                                        train_size=0.9,
                                        test_size=None,
                                        random_state=seed).split(X).__next__()
x_train = X[train_index]
Y_train = y[train_index]
x_test = X[valid_index]
Y_test = y[valid_index]

model = Sequential()
model.add(Dense(units=128,activation="relu", input_shape=(28, 28, 1)))
model.add(Dense(units=128,activation="relu"))
model.add(Dense(units=128,activation="relu"))
model.add(Dense(units=10,activation="softmax"))

## Compiling Model
model.compile(optimizer=SGD(0.001),loss="categorical_crossentropy",metrics=["accuracy"])


## Training

model.fit(x_train,Y_train,batch_size=32, epochs=10,verbose=1)
accuracy = model.evaluate(x=x_test, y=Y_test, batch_size=32)

## Checking Accuracy
print("Accuracy: ", accuracy[1])

1 Ответ

0 голосов
/ 01 апреля 2019

Вы делаете какую-то ошибку, которая приводит к сбою вашей сети.

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

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 28, 28, 128)       256       
_________________________________________________________________
dense_2 (Dense)              (None, 28, 28, 128)       16512     
_________________________________________________________________
dense_3 (Dense)              (None, 28, 28, 128)       16512     
_________________________________________________________________
dense_4 (Dense)              (None, 28, 28, 10)        1290      
=================================================================
Total params: 34,570
Trainable params: 34,570
Non-trainable params: 0
_________________________________________________________________

Итак : у вас есть четыре измерения на выходе сети.И это не правильно для задачи классификации.Если вы добавите Flatten Layer непосредственно перед последним слоем:

    _________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_5 (Dense)              (None, 28, 28, 128)       256       
_________________________________________________________________
dense_6 (Dense)              (None, 28, 28, 128)       16512     
_________________________________________________________________
dense_7 (Dense)              (None, 28, 28, 128)       16512     
_________________________________________________________________
flatten_1 (Flatten)          (None, 100352)            0         
_________________________________________________________________
dense_8 (Dense)              (None, 10)                1003530   
=================================================================
Total params: 1,036,810
Trainable params: 1,036,810
Non-trainable params: 0
_________________________________________________________________

и здесь вы увидите, что у нас есть десять классов, которые вы хотели.И что у вас есть только два измерения: одно для размера партии (Нет), а другое для классов (10).Для одного образца это будет вектор вероятностей для каждого класса, который суммируется с одним из-за активации softmax (взаимоисключающие классы)

Не могли бы вы попробовать запустить тестирование, чтобы убедиться, что это ваша проблема.Тогда я настоятельно советую вам разобраться с изображениями в Керасе, потому что использование плотных слоев здесь (и только плотных) не оптимально (например, вы можете увидеть это Kaggle tuto )

...