Попытка обучить выходные данные сети: отрицательный размерный размер, вызванный вычитанием 2 из 1 для max_pooling2d - PullRequest
0 голосов
/ 30 мая 2019

Попытка обучить сверточную нейронную сеть на образце набора данных с формой (256, 256, 3) дает мне ошибку ValueError.

Я проверил форму своих данных (они уже в каналах в прошлом,вроде tenorflow этого хочет).Я пытался использовать тот же код, что и другие люди, но он не работает.Я просмотрел свой набор данных, чтобы проверить правильность формата данных, и я не обнаружил никаких ошибок.

Код для моего CNN следующий:

X = pickle.load(open("X.pickle", "rb")) # Shape (256, 256, 3)
y = pickle.load(open("y.pickle", "rb")) # The labels

X = X / 255.0 # Normalizing the data

model = Sequential()
model.add(Conv2D(64, (3,3), input_shape=(256, 256, 3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(64, (3,3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Flatten())
model.add(Dense(64))

model.add(Dense(1))
model.add(Activation("sigmoid"))

model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])

model.fit(X, y, batch_size=32, validation_split=0.1)

Я ожидал, что сеть будет работать бесперебойно, но он превзошел следующее (не будет публиковать весь журнал ошибок, потому что он слишком длинный):

File "neuralnet.py", line 18, in <module>
    model.add(MaxPooling2D(pool_size=(2,2)))

ValueError: Negative dimension size caused by subtracting 2 from 1 for 'max_pooling2d_1/MaxPool' (op: 'MaxPool') with input shapes: [?,64,128,1].

Редактировать Отправка моих keras.Файл json:

{
    "epsilon": 1e-07, 
    "floatx": "float32", 
    "image_data_format": "channels_last", 
    "backend": "tensorflow"
}

Ранее он был в data_format channel_first и backend theano.Я изменил это, но я должен сказать, что я использую реализацию tenorsflow Keras напрямую.

Изменение на channel_last и backend tenorflow изменило вывод консоли, теперь она выдает эту ошибку наline line:

ValueError: You are passing a target array of shape (8118, 1) while using as loss `categorical_crossentropy`. `categorical_crossentropy` expects targets to be binary matrices (1s and 0s) of shape (samples, classes). If your targets are integer classes, you can convert them to the expected format via:
```
from keras.utils import to_categorical
y_binary = to_categorical(y_int)
```

Alternatively, you can use the loss function `sparse_categorical_crossentropy` instead, which does expect integer targets.

1 Ответ

0 голосов
/ 01 июня 2019

Чтобы решить вашу последнюю проблему, у вас есть это решение.

Сначала измените функцию потерь на "binary_crossentropy" вместо "categorical_crossentropy". (так как у меня есть два класса с сигмовидной активацией), при условии, что ваши данные закодированы в горячем виде.

Если вы не хотите «горячо» кодировать свои данные (чтобы преобразовать 0 и 1 в [1,0] и [0,1]), вы можете использовать «sparse_categorical_crossentropy», как подсказывает ошибка .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...