TensorFlow ValueError: Невозможно передать значение формы (32, 2) для Tensor 'InputData / X: 0', которая имеет форму '(?, 100)' - PullRequest
0 голосов
/ 15 октября 2018

Я новичок в TensorFlow и машинном обучении.Я пытаюсь создать анализ настроений NN с тензорным потоком.

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

ValueError: Невозможно передать значение shape (32, 2) для Tensor 'InputData / X: 0', который имеет shape '(?, 100)'

Я думаю, что ошибка связана с моим вводом"layer net = tflearn.input_data ([None, 100])".В учебном пособии, за которым я следовал, была предложена форма ввода, размер пакета как None и длина 100, поскольку это длина последовательности.Следовательно (Нет, 100), насколько я понимаю, это размеры, которыми должны быть обучающие данные, подаваемые в сеть, верно?

Может ли кто-нибудь объяснить, почему предлагаемая форма ввода размера пакета была Нет, а также почемуТензорный поток пытается питать сеть в форме (32,2).Откуда берется длина последовательности 2?

Если мое понимание где-либо в этом объяснении неверно, не стесняйтесь поправлять меня, я все еще пытаюсь изучить теорию.

Заранее спасибо

In [1]:

import tflearn
from tflearn.data_utils import to_categorical, pad_sequences
from tflearn.datasets import imdb

In [2]:

#Loading IMDB dataset
train, test, _ = imdb.load_data(path='imdb.pkl', n_words=10000,
                                valid_portion=0.1)
trainX, trainY = train
testX, testY = test

In [3]:

#Data sequence padding 
trainX = pad_sequences(trainX, maxlen=100, value=0.)  
testX = pad_sequences(testX, maxlen=100, value=0.)
#converting labels of each review to vectors
trainY = to_categorical(trainY, nb_classes=2)
trainX = to_categorical(testY, nb_classes=2)


In [4]:

#network building 
net = tflearn.input_data([None, 100])
net = tflearn.embedding(net, input_dim=10000, output_dim=128)
net = tflearn.lstm(net, 128, dropout = 0.8)
net = tflearn.fully_connected(net, 2, activation='softmax') 
net = tflearn.regression(net, optimizer = 'adam', learning_rate=0.0001,
                         loss='categorical_crossentropy')


WARNING:tensorflow:From C:\Users\Nason\Anaconda33\envs\TensorFlow1.8CPU\lib\site-packages\tflearn\objectives.py:66: calling reduce_sum (from tensorflow.python.ops.math_ops) with keep_dims is deprecated and will be removed in a future version.
Instructions for updating:
keep_dims is deprecated, use keepdims instead


In [5]:

#Training
model = tflearn.DNN(net, tensorboard_verbose=0)   #train using tensorflow Deep nueral net
model.fit(trainX, trainY, validation_set=(testX, testY), show_metric=True,    #fit launches training process for training and validation data, metric displays data as its training.
          batch_size=32)


---------------------------------
Run id: U7NONK
Log directory: /tmp/tflearn_logs/
INFO:tensorflow:Summary name Accuracy/ (raw) is illegal; using Accuracy/__raw_ instead.
---------------------------------
Training samples: 2500
Validation samples: 2500
--

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-5-7ffd0a8836f9> in <module>()
      2 model = tflearn.DNN(net, tensorboard_verbose=0)   #train using tensorflow Deep nueral net
      3 model.fit(trainX, trainY, validation_set=(testX, testY), show_metric=True,    #fit launches training process for training and validation data, metric displays data as its training.
----> 4           batch_size=32)

~\Anaconda33\envs\TensorFlow1.8CPU\lib\site-packages\tflearn\models\dnn.py in fit(self, X_inputs, Y_targets, n_epoch, validation_set, show_metric, batch_size, shuffle, snapshot_epoch, snapshot_step, excl_trainops, validation_batch_size, run_id, callbacks)
    214                          excl_trainops=excl_trainops,
    215                          run_id=run_id,
--> 216                          callbacks=callbacks)
    217 
    218     def fit_batch(self, X_inputs, Y_targets):

~\Anaconda33\envs\TensorFlow1.8CPU\lib\site-packages\tflearn\helpers\trainer.py in fit(self, feed_dicts, n_epoch, val_feed_dicts, show_metric, snapshot_step, snapshot_epoch, shuffle_all, dprep_dict, daug_dict, excl_trainops, run_id, callbacks)
    337                                                        (bool(self.best_checkpoint_path) | snapshot_epoch),
    338                                                        snapshot_step,
--> 339                                                        show_metric)
    340 
    341                             # Update training state

~\Anaconda33\envs\TensorFlow1.8CPU\lib\site-packages\tflearn\helpers\trainer.py in _train(self, training_step, snapshot_epoch, snapshot_step, show_metric)
    816         tflearn.is_training(True, session=self.session)
    817         _, train_summ_str = self.session.run([self.train, self.summ_op],
--> 818                                              feed_batch)
    819 
    820         # Retrieve loss value from summary string

~\Anaconda33\envs\TensorFlow1.8CPU\lib\site-packages\tensorflow\python\client\session.py in run(self, fetches, feed_dict, options, run_metadata)
    898     try:
    899       result = self._run(None, fetches, feed_dict, options_ptr,
--> 900                          run_metadata_ptr)
    901       if run_metadata:
    902         proto_data = tf_session.TF_GetBuffer(run_metadata_ptr)

~\Anaconda33\envs\TensorFlow1.8CPU\lib\site-packages\tensorflow\python\client\session.py in _run(self, handle, fetches, feed_dict, options, run_metadata)
   1109                              'which has shape %r' %
   1110                              (np_val.shape, subfeed_t.name,
-> 1111                               str(subfeed_t.get_shape())))
   1112           if not self.graph.is_feedable(subfeed_t):
   1113             raise ValueError('Tensor %s may not be fed.' % subfeed_t)

ValueError: Cannot feed value of shape (32, 2) for Tensor 'InputData/X:0', which has shape '(?, 100)'

Ответы [ 3 ]

0 голосов
/ 15 октября 2018

Вы оставили число категорий для trainX как 2, но ваша модель ожидает 100.

РЕДАКТИРОВАТЬ:

Я просто заметил, что вы устанавливаете trainX с testY в этом бите кода:

trainX = to_categorical(testY, nb_classes=2)

Принимая во внимание, что это должно быть:

trainX = to_categorical(trainX, nb_classes=100)

Поэтому вам необходимо изменить код на:

#Data sequence padding
trainX = pad_sequences(trainX, maxlen=100, value=0.)  
testX = pad_sequences(testX, maxlen=100, value=0.)
#converting labels of each review to vectors
trainY = to_categorical(trainY, nb_classes=2)
#change the number of Classes
trainX = to_categorical(trainX, nb_classes=100) #CHANGE HERE!!

С этим изменением у вас все будет в порядке.Я только что проверил, и это работает!

Можно задать форму ввода с помощью [Нет, 100], это дает вам больше гибкости для изменения размера партии позже, если вам нужно!

0 голосов
/ 15 октября 2018
tflearn.input_data([None, 100])

Вы ожидаете, что вход будет тензором любого числа экземпляров с 100 функциями.

trainX = pad_sequences(trainX, maxlen=100, value=0.)  
testX = pad_sequences(testX, maxlen=100, value=0.)
#converting labels of each review to vectors
trainY = to_categorical(trainY, nb_classes=2)
trainX = to_categorical(testY, nb_classes=2) #HEREEEEEE

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

testY = to_categorical(testY, nb_classes=2)

Если это все еще не работает.

Я подозреваю, что вы пропускаете изменение формы данных.Вы действительно используете padding, но на всем trainX, trainY и т. Д.Попробуйте заполнить каждый «ряд» отдельно.Тогда каждый экземпляр будет иметь длину 100, как вы ожидаете.

Перед этим распечатайте формы тензоров (например, print(trainX.shape)), чтобы увидеть, действительно ли вы предварительно обрабатываете данные (я также предлагаю сделать два сценария, один с полной загрузкой, предварительной обработкой, изменением формы и заполнением идругой с логикой тензорного потока)

0 голосов
/ 15 октября 2018

Ошибка исходит от trainX = to_categorical(testY, nb_classes=2).Это должно быть изменено на testY = to_categorical(testY, nb_classes=2)

Кроме того, установка размера партии на None означает, что следует ожидать, что партия будет любого размера.В вашем случае вы устанавливаете размер пакета на 32, чтобы вы могли также установить форму ввода на [32, 100]

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