Я пытаюсь создать 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)
Это то, что У меня так далеко. Любая помощь очень ценится :)