Как исправить размер ввода плотного слоя в CNN Keras? - PullRequest
1 голос
/ 02 апреля 2019

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

Но когда я пытаюсь уместить свои данные, я получаю эту ошибку:

ValueError: Ошибка при проверке цели: ожидалось, что плотность_2 имеет 2 измерения, но получен массив с формой (3, 243, 320, 3)

Я пытался изменитьфункция потерь от sparse_categorical_crossentropy до categorical_crossentropy.

С закодированными в горячем виде метками с использованием функции "to_categorical" keras

Но она не будет работать

ЗдесьВот как я заполняю свои списки изображениями и метками

###### fill with images
for i in range(0,num_classes):
k=0
for j in range(len(features)):
    k+=1
    if(i < 10):
        sub = "subject0"+str(i)+"."+features[j]+".png"
    else:
        sub = "subject"+str(i)+"."+features[j]+".png"
    imgfile = Image.open(sub)
    img = np.array(imgfile)
    #print(img.shape)
    #print(type(img))
    if(k != 3):
        train.append(img)
        train_labels.append(i)
    else :
        test.append(img)
        test_labels.append(i)

########## train 
train = np.asarray(train)
train_labels = np.asarray(train_labels)

########## test 
test = np.asarray(test)
test_labels = np.asarray(test_labels)

У меня сейчас 3 класса!(1 класс - один предмет)

Ниже показано, как изображения изменяются и нормализуются.

# Reshape  243x320 pixels, 1 channel (B/W)
train = train.reshape(train.shape[0], img_rows, img_cols, 1)
# Reshape  243x320 pixels, 1 channel (B/W)
test = test.reshape(test.shape[0], img_rows, img_cols, 1)

# Normalize pixel values: [0-255] --> [0.0-1.0]
train, test = train / 255.0, test / 255.0

# One-hot encode labels
test = to_categorical(test, num_classes)
test_labels = to_categorical(test_labels, num_classes)

Я строю простую модель CNN

######### build cnn models

model = Sequential()
model.add(Conv2D(32, kernel_size=(5, 5), padding='same', activation='relu', input_shape=(img_rows,img_cols,1)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(32, (3, 3), padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))


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

batch_size = 128
epochs = 10

model.fit(train, test, validation_data=(train_labels, test_labels), batch_size=batch_size, epochs=epochs)

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

Спасибо за вашу помощь!

1 Ответ

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

Вместо этого test = to_categorical(test, num_classes) должно быть train_labels = ..., а ваш model.fit(...) вызов должен быть model.fit(train, train_labels).

Это самые поразительные ошибки, которые я мог найти.

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