Ошибка Keras связана с тем, что у меня только один класс - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь создать CNN в keras, но я хочу, чтобы у него был только один класс и поэтому на выходе была только одна вероятность. Поэтому я использую сигмовидную функцию для прогнозирования вероятности (не могу использовать softmax с одним классом, что я в конце концов вспомнил). Обычно я бы использовал 1 - вероятность получить убыток и использовал оптимизатор, чтобы уменьшить его, потому что все наши ответы будут равны 1. Однако я не уверен, как реализовать тот факт, что цель для всех из них равно 1 в keras, и atm выдает следующую ошибку:

Получено значение метки 1, которое находится за пределами допустимого диапазона [0, 1). Значения меток: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

Поскольку я буквально просто использую список с 120 единицами (у меня 120 изображений), иначе он скажет, что у них нет ярлыков.

Мой код следующий:

import tensorflow as tf
from tensorflow import keras

from keras.utils import to_categorical
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Dense, Flatten
import glob
from PIL import Image

#!unzip not_dog4

images = []
image_data = []

for filename in glob.glob('not_dog/*.jpg'): 
  im = Image.open(filename)
  images.append(im)

for image in images:
  images2 = image.resize((28, 28))
  gs_image = images2.convert(mode='L')
  image_vector = np.array(gs_image)
  image_data.append(image_vector)

image_data = np.array(image_data)[..., None]

image_data_normalised = []

image_data = image_data.astype('float32')
image_data_normalised = image_data / 255 - 0.5

y = []

#y has to be 120 ones...?
for i in range(120):
  y.append(1)


num_filters = 1 #I guess you dictate the number of convolutions through the number of filters - 1 convolution for each filter.
filter_size = 3
pool_filter_size = 2


model = Sequential()
model.add(Conv2D(num_filters, filter_size, strides=(1, 1), input_shape=(28, 28, 1)))  
model.add(MaxPooling2D(pool_size=(3, 3), strides=(1, 1), padding='valid')) 
model.add(Flatten())  
model.add(Dense(1, activation = 'sigmoid'))  

#compile the model
model.compile('adam', loss = 'sparse_categorical_crossentropy')
model.fit(image_data_normalised, y, epochs=3)

Это то, что У меня так далеко. Любая помощь очень ценится :)

1 Ответ

0 голосов
/ 19 июня 2020

Вы импортируете только изображения «not_dogs»

Попробуйте импортировать с помощью ImageDataGenerator.flow_from_directories, потому что он автоматически помечает классы изображений на основе имен папок. Или, возможно, вы хотите создать фрейм данных с функциями пути и класса, а затем использовать ImageDataGenerator.flow_from_dataframe.

Подход ImageGenerator очень предпочтителен, потому что он не вызывает проблем с памятью. Очень рекомендую изучить этот прием, если вы имеете дело с изображениями.

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