python tflearn — ValueError: невозможно передать значение формы (10, 250, 250, 3) для тензора «TargetsData/Y: 0», который имеет форму «(?, 2)»

Я пытаюсь создать модель для распознавания лиц. Но я продолжаю сталкиваться с этой ошибкой, и ни один из других ответов на подобные вопросы не решил эту конкретную проблему. Код следующий:

X = pickle.load(open('dataset.pkl', 'rb')).astype('float32')
Y = pickle.load(open('dataset.pkl', 'rb')).astype('float32')
X_test = pickle.load(open('dataset.pkl', 'rb')).astype('float32')
Y_test = pickle.load(open('dataset.pkl', 'rb')).astype('float32')

# Input is a 250x250 image with 3 color channels (red, green and blue)       

network = input_data(shape=[None, 250, 250, 3],
                 data_preprocessing=img_prep,
                 data_augmentation=img_aug)

# Step 1: Convolution
network = conv_2d(network, 32, 3, activation='relu')

# Step 2: Max pooling
network = max_pool_2d(network, 2)

# Step 3: Convolution again
network = conv_2d(network, 64, 3, activation='relu')

# Step 4: Convolution yet again
network = conv_2d(network, 64, 3, activation='relu')

# Step 5: Max pooling again
network = max_pool_2d(network, 2)

# Step 6: Fully-connected 512 node neural network
network = fully_connected(network, 512, activation='relu')

# Step 7: Dropout - throw away some data randomly during training to prevent over-fitting
network = dropout(network, 0.5)

# Step 8: Fully-connected neural network with two outputs to make the final prediction
network = fully_connected(network, 2, activation='softmax')

# Tell tflearn how we want to train the network
network = regression(network, optimizer='adam',
                 loss='categorical_crossentropy',
                 learning_rate=0.001)

# Wrap the network in a model object
model = tflearn.DNN(network, tensorboard_verbose=0, checkpoint_path='faceRecog.tfl.ckpt')

# Train it! We'll do 100 training passes and monitor it as it goes.
model.fit(X, Y, n_epoch=10, shuffle=True, validation_set=(X_test, Y_test),
      show_metric=True, batch_size=10,
      snapshot_epoch=True,
      run_id='faceRecog')

я продолжаю получать

ValueError: невозможно передать значение формы (10, 250, 250, 3) для тензора «TargetsData/Y:0», который имеет форму «(?, 2)».

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


person user7091463    schedule 03.02.2017    source источник
comment
Это слишком много кода. Никто не хочет загружать наборы данных, создавать и обучать всю сеть для отладки ValueError. Узнайте, как создать минимальный, полный и проверяемый пример.   -  person gobrewers14    schedule 04.02.2017


Ответы (1)


Ваш ввод имеет форму (?, 250, 250, 3) (на основе комментария в начале и того факта, что вы используете слои свертки на раннем этапе), ваш вывод имеет форму (?, 2) (на основе того, что ваш последний слой является полностью связанным слоем с 2 выходными нейроны). Тем не менее, вы передаете один и тот же набор данных обоим:

X = pickle.load(open('dataset.pkl', 'rb')).astype('float32')
Y = pickle.load(open('dataset.pkl', 'rb')).astype('float32')

^^ Обратите внимание, что вы загружаете один и тот же файл как для X, так и для Y.

Поскольку я не знаю, чего вы пытаетесь достичь, есть два возможных решения:

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

  2. Если вы пытаетесь создать какой-то классификатор, значит, вы читаете не тот файл, который соответствует Y. Y должен содержать метки, которые вы пытаетесь предсказать, а не изображения.

person Ishamael    schedule 03.02.2017
comment
Я пытаюсь построить модель, которая будет распознавать лица на изображениях. 'dataset.pkl' содержит изображения лиц. Есть несколько изображений, на которых нет лиц. Чем именно мне кормить Y в этом случае? - person user7091463; 04.02.2017
comment
Это должна быть матрица формы (number_of_faces, 2), где для каждого лица строка содержит (1, 0), а для каждого изображения, не являющегося лицом, (0, 1) - person Ishamael; 05.02.2017
comment
Спасибо, работает без ошибок. Но моя точность становится больше 1 в самую первую эпоху, а потери составляют около 4000. В моем наборе данных всего 550 изображений из-за аппаратных ограничений. Любые предложения относительно того, что вызывает это и почему? - person user7091463; 06.02.2017
comment
Точность больше 1 должна быть ошибкой в ​​коде. Как правило, рекомендуется задать новый вопрос о переполнении стека для последующих вопросов, чтобы больше людей могли его увидеть и чтобы все было организовано. Кроме того, если этот ответ отвечает на исходный вопрос, рассмотрите возможность его принятия. - person Ishamael; 06.02.2017