Попытка обучить сверточную нейронную сеть на образце набора данных с формой (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.