当前位置: 首页 > 知识库问答 >
问题:

TensorFlow ValueError:无法为具有形状'(?,100)'的张量'InputData/X: 0'提供形状(32,2)的值

符渊
2023-03-14

我是张量流和机器学习的新手。我正在尝试创建一个具有张量流的情感分析 NN。

我已经建立了我的体系结构,并试图训练模型,但我遇到了错误

ValueError:无法为具有形状'(?,100)'的张量'InputData/X: 0'提供形状(32,2)的值

我认为错误与我的输入“layer net=tflearn.input_data([None,100])”有关。我正在学习的教程建议使用这种输入形状,批大小为None,长度为100,因为这是序列长度。因此(无,100),据我所知,这是输入网络的培训数据需要的维度,对吗?

有人能解释为什么建议的批次大小输入形状为None,以及为什么Tensor流试图为网络输入形状(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.8html" target="_blank">CPU\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个答案

孔光赫
2023-03-14

您将< code>trainX的类别数保留为< code>2,但您的模型预期为< code>100。

编辑:

我只是注意到你正在用这段代码中的testY设置训练X

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]设置输入的形状是可以的,它为您提供了更大的灵活性,可以在以后需要时更改批次大小!

厍浩广
2023-03-14
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)

如果这样还是不行的话。

我怀疑您缺少对数据的重塑。您确实使用了填充,但在整个trainX、trainY等方面。尝试分别填充每个“行”。然后每个实例的长度将如您所期望的那样为“100”。

在此之前,打印张量的形状(如print(trainX.shape)),看看您是否真的在对数据进行预处理(我还建议执行两个脚本,一个是完整加载、预处理、整形和填充,另一个是张量流逻辑)

马侯林
2023-03-14

错误来自trainX=to_categorical(testY,nb_classes=2)。这需要更改为testY=to_categorical(testY,nb_classes=2)

此外,将批处理大小设置为< code>None意味着它应该期望批处理为任意大小。在您的例子中,您将批处理大小设置为32,因此您也可以将输入形状设置为< code>[32,100]

 类似资料:
  • 我正在尝试实现tensorflow回归模型,我的数据形状是train_X=(200,4)和train_Y=(200,)。我得到的形状错误,这是我的一段代码,请任何人都能提到我在哪里做错了。 df=pd。读取\u csv('all.csv') df=df。下降(“时间”,轴=1) 打印(df.descripe())#以了解数据集 列车Y=df[“功率”] 列车X=df。下降('功率',轴=1) 列车

  • 问题内容: 我是TensorFlow和机器学习的新手。我正在尝试将两个对象归类为杯子和Pendrive(jpeg图像)。我已经成功训练并导出了model.ckpt。现在,我正在尝试恢复保存的model.ckpt以进行预测。这是脚本: 当我运行上述脚本进行预测时,出现以下错误: 我究竟做错了什么?以及如何修复numpy数组的形状? 问题答案: 形状为。 您的输入占位符的形状为。 问题是您要为占位符提

  • 目前正在尝试学习卷积网络的Tensorflow MNIST教程,我可以使用一些帮助来理解该死的张量的维度。 所以我们有28x28像素的图像。 卷积将为每个5x5补丁计算32个特征。 让我们暂时接受这一点,并在以后问自己为什么是32个功能和为什么是5x5补丁。 其重量张量的形状为5、5、1、32。前两个维度是面片大小,下一个维度是输入通道数,最后一个维度是输出通道数。 W_conv1weight_v

  • 我是新来的,所以任何帮助都是值得的,这段代码是我的教授给我的,当我问一个例子,我希望有一个工作模型。。。 读取数据 将行走状态定义为0,运行状态定义为1 随机选取50%的数据作为测试数据,其余数据作为列车数据 使用skLearning选择50%的功能 应用支持向量机算法 回溯(最近一次调用):文件“”,第1行,在execfile exec(compile(f.read)()第89行的文件“C:\U

  • TensorFlow用张量这种数据结构来表示所有的数据.你可以把一个张量想象成一个n维的数组或列表.一个张量有一个静态类型和动态类型的维数.张量可以在图中的节点之间流通. 阶 在TensorFlow系统中,张量的维数来被描述为阶.但是张量的阶和矩阵的阶并不是同一个概念.张量的阶(有时是关于如顺序或度数或者是n维)是张量维数的一个数量描述.比如,下面的张量(使用Python中list定义的)就是2阶

  • 我使用imdb示例创建了LSTM模型,并尝试用我自己的字符串预测情绪 但是当我试图做预测时,我被跟踪跟踪弄错了 Traceback(最近的调用最后): 文件“”,第1行,在runfile中('C:/Users/Radosław/nauka/python/motionanalysis/motionconsole.py',wdir='C:/Users/Radosław/nauka/python/mot