Формирование данных для линейной регрессии с помощью TFlearn

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

from trafficdata import X,Y

import tflearn

print(X.shape) #(1054, 21)
print(Y.shape) #(1054,)

# Linear Regression graph
input_ = tflearn.input_data(shape=[None,21])
linear = tflearn.single_unit(input_)
regression = tflearn.regression(linear, optimizer='sgd', loss='mean_square',
                                metric='R2', learning_rate=0.01)
m = tflearn.DNN(regression)
m.fit(X, Y, n_epoch=1000, show_metric=True, snapshot_epoch=False)

print("\nRegression result:")
print("Y = " + str(m.get_weights(linear.W)) +
      "*X + " + str(m.get_weights(linear.b)))

Однако tflearn жалуется:

Traceback (most recent call last):
  File "linearregression.py", line 16, in <module>
    m.fit(X, Y, n_epoch=1000, show_metric=True, snapshot_epoch=False)
  File "/usr/local/lib/python3.5/dist-packages/tflearn/models/dnn.py", line 216, in fit
    callbacks=callbacks)
  File "/usr/local/lib/python3.5/dist-packages/tflearn/helpers/trainer.py", line 339, in fit
    show_metric)
  File "/usr/local/lib/python3.5/dist-packages/tflearn/helpers/trainer.py", line 818, in _train
    feed_batch)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py", line 789, in run
    run_metadata_ptr)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py", line 975, in _run
    % (np_val.shape, subfeed_t.name, str(subfeed_t.get_shape())))
ValueError: Cannot feed value of shape (64,) for Tensor 'TargetsData/Y:0', which has shape '(21,)'

Я обнаружил, что форма (64, ) исходит из размера пакета по умолчанию tflearn.regression().

Нужно ли преобразовывать метки (Y)? Каким образом?

Спасибо!


person Tom Rijntjes    schedule 26.06.2017    source источник


Ответы (2)


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

# linear = tflearn.single_unit(input_)
linear = tflearn.fully_connected(input_, 1, activation='linear')

Я предполагаю, что с функциями> 1 вы не можете использовать tflearn.single_unit(). Вы можете добавить дополнительные полносвязные слои, но последний должен иметь только 1 нейрон, потому что Y.shape=(?,1)

person michael    schedule 21.09.2017

У вас есть 21 функция. Поэтому вы не можете использовать linear = tflearn.single_unit(input_)

Вместо этого попробуйте это: linear = tflearn.fully_connected(input_, 21, activation='linear')

Ошибка, которую вы получаете, связана с тем, что ваши метки, т. Е. Y, имеют форму (1054,). Вы должны сначала предварительно обработать его.

Попробуйте использовать приведенный ниже код перед # linear regression graph:

Y = np.expand_dims(Y,-1)

Теперь перед regression = tflearn.regression(linear, optimizer='sgd', loss='mean_square',metric='R2', learning_rate=0.01) введите следующий код:

linear = tflearn.fully_connected(linear, 1, activation='linear')

person Gautam J    schedule 06.05.2018