TensorFlow/TFLearn: ValueError: невозможно передать значение формы (64,) для Tensor u'target/Y: 0 ', которая имеет форму' (?, 10) '

Я пытаюсь выполнить регрессию с помощью tflearn и моего собственного набора данных.

Используя tflearn, я пытаюсь реализовать сверточную сеть, основанную на example с использованием набора данных MNIST. Вместо использования набора данных MNIST я попытался заменить данные обучения и тестирования собственными. Мои данные считываются из csv файла и имеют другую форму для данных MNIST. У меня есть 255 функций, которые представляют собой сетку 15 * 15 и целевое значение. В примере я заменил строки 24-30 (и включил импорт numpy как np):

#read in train and test csv where there are 255 features (15*15) and a target
csvTrain = np.genfromtxt('train.csv', delimiter=",")
X = np.array(csvTrain[:, :225]) #225, 15
Y = csvTrain[:,225]

csvTest = np.genfromtxt('test.csv', delimiter=",")
testX = np.array(csvTest[:, :225])
testY = csvTest[:,225]

#reshape features for each instance in to 15*15, targets are just a single number
X = X.reshape([-1,15,15,1])
testX = testX.reshape([-1,15,15,1])

## Building convolutional network
network = input_data(shape=[None, 15, 15, 1], name='input')

Я получаю следующую ошибку:

ValueError: невозможно передать значение формы (64,) для Tensor u'target/Y: 0 ', который имеет форму '(?, 10)'

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

Как использовать собственные данные?

Ответ 1

Короткий ответ

В строке 41 примера MNIST вам также необходимо изменить размер вывода 10 на 1 в network = fully_connected(network, 10, activation='softmax') на network = fully_connected(network, 1, activation='linear'), Обратите внимание, что вы можете удалить окончательный softmax.

Посмотрев на свой код, кажется, что у вас есть целевое значение Y, что означает использование потерь L2 с mean_square (вы найдете здесь все возможные потери):

regression(network, optimizer='adam', learning_rate=0.01,
                 loss='mean_square', name='target')

Также измените Y и Y_test на форму (batch_size, 1).


Длинный ответ: как проанализировать ошибку и найти ошибку

Вот как анализировать ошибку:

  • Ошибка Cannot feed value ... for Tensor 'target/Y', что означает, что она исходит из аргумента feed_dict.
  • Опять же, согласно ошибке, вы пытаетесь передать значение Y of shape (64,), тогда как сеть ожидает форму (?, 10).
    • Он ожидает форму (batch_size, 10), потому что изначально она представляет собой сеть для MNIST (10 классов)
  • Теперь мы хотим изменить ожидаемое значение сети для Y.
    • в коде, мы видим, что последний слой fully_connected(network, 10, activation='softmax') возвращает вывод размера 10
    • Мы меняем это на вывод размера 1 без softmax: fully_connected(network, 1, activation='linear')

В конце концов, это была не ошибка, а неправильная архитектура модели.