Ошибка при проверке цели: ожидается, что плотность_1 будет иметь форму (5749,), но получен массив с формой (1,) - PullRequest
0 голосов
/ 20 марта 2020

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

model.fit(imgs_array,Y,batch_size = 401, epochs = 2, validation_split = 0.2)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py", line 1527, in fit
    x, y, sample_weights = self._standardize_user_data(
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py", line 991, in _standardize_user_data
    x, y, sample_weights = self._standardize_weights(x, y, sample_weight,
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py", line 1149, in _standardize_weights
    y = training_utils.standardize_input_data(
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/tensorflow/python/keras/engine/training_utils.py", line 329, in standardize_input_data
    raise ValueError(
ValueError: Error when checking target: expected dense_1 to have shape (5749,) but got array with shape (1,)

Мой полный код:

import os
import numpy as np
from tensorflow.keras.preprocessing.image import load_img, img_to_array
from sklearn.model_selection import train_test_split
from tensorflow.python import keras
from tensorflow.keras.utils import to_categorical
from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import Dense, Flatten, Conv2D, Dropout


folders = os.listdir('lfw/')
# print(len(folders))       #5749
folders_a = np.asarray(folders)

image_files = []
X = []
Y = []
for folder in folders:
    files = os.listdir('lfw/'+folder+'/')       # type of files is a list
    image_files.append(files)
    for file in files:
        X.append(file)
        Y.append(folder)

# print(len(Y))     #13233
img_paths = []
for i in range(0,13233):
    img_paths.append('lfw/'+Y[i]+'/'+X[i])      #img_paths is set now

print(len(img_paths))

imgs = []
for img_path in img_paths:
    img_1 = load_img(img_path, color_mode="grayscale")
    imgs.append(img_to_array(img_1))

    # print(imgs[0].shape)      #(250,250,1)



Y = np.array(Y)
# print(type(Y))
# print(Y.shape)        #(13233,)

#Building Neural Network
imgs_array = np.array(imgs)
imgs_array /= 255


model = Sequential()
model.add(Conv2D(20, kernel_size = 3, activation = 'relu', input_shape =(250,250,1)))
model.add(Conv2D(20, kernel_size =3, activation = 'relu'))
model.add(Flatten())
model.add(Dense(401, activation = 'relu'))
model.add(Dense(5749,activation = 'softmax'))
print("compiling initiated")
model.compile(loss = 'mean_squared_error',optimizer = 'sgd')
print("model compiled")
model.fit(imgs_array,Y,batch_size = 401, epochs = 2, validation_split = 0.2)

Что является причиной ошибки и как Исправить это? Строка print(Y.shape) в приведенном выше коде дает мне вывод (13233,). Почему в ошибке отображается (1, )?

Примечание. Я видел ссылки, приведенные ниже, но они не относятся к моему вопросу.

Ошибка при проверке цели: ожидаемая плотность_1 иметь форму (257, 257), но получил массив с формой (257, 1)

Ошибка при установке модели RNN LSTM

Ошибка при проверке цели: ожидается, что плотность_1 будет иметь форму (1,), но получен массив с формой (256,)

1 Ответ

0 голосов
/ 20 марта 2020

С первого взгляда я думаю, что ваша проблема в следующем: ваша сеть принимает тензоры формы (batch_size, 250, 250, 1) в качестве входных данных и дает тензоры формы (batch_size, 5749) в качестве выходных данных

Когда вы начинаете подгонку, keras принимает партии входных данных и соответствующие метки, поэтому он подает в вашу сеть входные тензоры формы (batch_size,) + imgs_array.shape [1:] и метки формы (batch_size,) + Y.shape [ 1:]

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

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