InvalidArgumentError:ConcatOp:输入的维度应该匹配

2024-04-20

Tensorflow 1.7使用dynamic_rnn时。一开始运行良好,但在第32步(当我运行代码时它发生变化)时,出现错误。当我使用较小的批次时,代码似乎可以运行更长时间,但是错误仍然弹出。只是无法弄清楚出了什么问题。

    from mapping import *


def my_input_fn(features, targets, batch_size=20, shuffle=True, num_epochs=None, sequece_lenth=None):
    ds = tf.data.Dataset.from_tensor_slices(
        (features, targets, sequece_lenth))  # warning: 2GB limit
    ds = ds.batch(batch_size).repeat(num_epochs)

    if shuffle:
        ds = ds.shuffle(10000)
    features, labels, sequence = ds.make_one_shot_iterator().get_next()
    return features, labels, sequence


def lstm_cell(lstm_size=50):
    return tf.contrib.rnn.BasicLSTMCell(lstm_size)


class RnnModel:
    def __init__(self,
                 batch_size,
                 hidden_units,
                 time_steps,
                 num_features
                 ):
        self.batch_size = batch_size
        self.hidden_units = hidden_units
        stacked_lstm = tf.contrib.rnn.MultiRNNCell(
            [lstm_cell(i) for i in self.hidden_units])
        self.initial_state = stacked_lstm.zero_state(batch_size, tf.float32)
        self.model = stacked_lstm
        self.state = self.initial_state
        self.time_steps = time_steps
        self.num_features = num_features

    def loss_mean_squre(self, outputs, targets):
        pos = tf.add(outputs, tf.ones(self.batch_size))
        eve = tf.div(pos, 2)
        error = tf.subtract(eve,
                            targets)
        return tf.reduce_mean(tf.square(error))

    def train(self,
              num_steps,
              learningRate,
              input_fn,
              inputs,
              targets,
              sequenceLenth):

        periods = 10
        step_per_periods = int(num_steps / periods)

        input, target, sequence = input_fn(inputs, targets, self.batch_size, shuffle=True, sequece_lenth=sequenceLenth)

        initial_state = self.model.zero_state(self.batch_size, tf.float32)

        outputs, state = tf.nn.dynamic_rnn(self.model, input, initial_state=initial_state)  

        loss = self.loss_mean_squre(tf.reshape(outputs, [self.time_steps, self.batch_size])[-1], target)
        optimizer = tf.train.AdamOptimizer(learning_rate=learningRate)
        grads_and_vars = optimizer.compute_gradients(loss, self.model.variables)
        optimizer.apply_gradients(grads_and_vars)

        init_op = tf.global_variables_initializer()
        with tf.Session() as sess:

            for i in range(num_steps):
                sess.run(init_op)
                state2, current_loss= sess.run([state, loss])
                if i % step_per_periods == 0:
                    print("period " + str(int(i / step_per_periods)) + ":" + str(current_loss))
        return self.model, self.state


def processFeature(df):
    df = df.drop('class', 1)
    features = []

    for i in range(len(df["vecs"])):
        features.append(df["vecs"][i])

    aa = pd.Series(features).tolist()  # tramsform into list
    featuresList = []
    for i in features:
        p1 = []
        for k in i:
            p1.append(list(k))
        featuresList.append(p1)

    return featuresList


def processTargets(df):
    selected_features = df[
        "class"]
    processed_features = selected_features.copy()
    return tf.convert_to_tensor(processed_features.astype(float).tolist())


if __name__ == '__main__':
    dividNumber = 30
    """
    some code here to modify my data to input 
    
    it looks like this:
    inputs before use input function : [fullLenth, charactorLenth, embeddinglenth]
    """

    model = RnnModel(15, [100, 80, 80, 1], time_steps=dividNumber, num_features=25)
    model.train(5000, 0.0001, my_input_fn, training_examples, training_targets, sequenceLenth=trainSequenceL)

错误就在这里

Traceback (most recent call last):
      File "D:\Anaconda3\envs\tensorflow-cpu\lib\site-packages\tensorflow\python\client\session.py", line 1330, in _do_call
        return fn(*args)
      File "D:\Anaconda3\envs\tensorflow-cpu\lib\site-packages\tensorflow\python\client\session.py", line 1315, in _run_fn
        options, feed_dict, fetch_list, target_list, run_metadata)
      File "D:\Anaconda3\envs\tensorflow-cpu\lib\site-packages\tensorflow\python\client\session.py", line 1423, in _call_tf_sessionrun
        status, run_metadata)
      File "D:\Anaconda3\envs\tensorflow-cpu\lib\site-packages\tensorflow\python\framework\errors_impl.py", line 516, in __exit__
        c_api.TF_GetCode(self.status.status))
    tensorflow.python.framework.errors_impl.InvalidArgumentError: ConcatOp : Dimensions of inputs should match: shape[0] = [20,25] vs. shape[1] = [30,100]
         [[Node: rnn/while/rnn/multi_rnn_cell/cell_0/basic_lstm_cell/concat = ConcatV2[N=2, T=DT_FLOAT, Tidx=DT_INT32, _device="/job:localhost/replica:0/task:0/device:CPU:0"](rnn/while/TensorArrayReadV3, rnn/while/Switch_4:1, rnn/while/rnn/multi_rnn_cell/cell_3/basic_lstm_cell/Const)]]
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "D:/programming/mlwords/dnn_gragh.py", line 198, in <module>
        model.train(5000, 0.0001, my_input_fn, training_examples, training_targets, sequenceLenth=trainSequenceL)
      File "D:/programming/mlwords/dnn_gragh.py", line 124, in train
        state2, current_loss, nowAccuracy = sess.run([state, loss, accuracy])
      File "D:\Anaconda3\envs\tensorflow-cpu\lib\site-packages\tensorflow\python\client\session.py", line 908, in run
        run_metadata_ptr)
      File "D:\Anaconda3\envs\tensorflow-cpu\lib\site-packages\tensorflow\python\client\session.py", line 1143, in _run
        feed_dict_tensor, options, run_metadata)
      File "D:\Anaconda3\envs\tensorflow-cpu\lib\site-packages\tensorflow\python\client\session.py", line 1324, in _do_run
        run_metadata)
      File "D:\Anaconda3\envs\tensorflow-cpu\lib\site-packages\tensorflow\python\client\session.py", line 1343, in _do_call
        raise type(e)(node_def, op, message)
    tensorflow.python.framework.errors_impl.InvalidArgumentError: ConcatOp : Dimensions of inputs should match: shape[0] = [20,25] vs. shape[1] = [30,100]
         [[Node: rnn/while/rnn/multi_rnn_cell/cell_0/basic_lstm_cell/concat = ConcatV2[N=2, T=DT_FLOAT, Tidx=DT_INT32, _device="/job:localhost/replica:0/task:0/device:CPU:0"](rnn/while/TensorArrayReadV3, rnn/while/Switch_4:1, rnn/while/rnn/multi_rnn_cell/cell_3/basic_lstm_cell/Const)]]

Caused by op 'rnn/while/rnn/multi_rnn_cell/cell_0/basic_lstm_cell/concat', defined at:
  File "D:/programming/mlwords/dnn_gragh.py", line 198, in <module>
    model.train(5000, 0.0001, my_input_fn, training_examples, training_targets, sequenceLenth=trainSequenceL)
  File "D:/programming/mlwords/dnn_gragh.py", line 95, in train
    outputs, state = tf.nn.dynamic_rnn(self.model, input, initial_state=initial_state)#,sequence_length=sequence
  File "D:\Anaconda3\envs\tensorflow-cpu\lib\site-packages\tensorflow\python\ops\rnn.py", line 627, in dynamic_rnn
    dtype=dtype)
  File "D:\Anaconda3\envs\tensorflow-cpu\lib\site-packages\tensorflow\python\ops\rnn.py", line 824, in _dynamic_rnn_loop
    swap_memory=swap_memory)
  File "D:\Anaconda3\envs\tensorflow-cpu\lib\site-packages\tensorflow\python\ops\control_flow_ops.py", line 3205, in while_loop
    result = loop_context.BuildLoop(cond, body, loop_vars, shape_invariants)
  File "D:\Anaconda3\envs\tensorflow-cpu\lib\site-packages\tensorflow\python\ops\control_flow_ops.py", line 2943, in BuildLoop
    pred, body, original_loop_vars, loop_vars, shape_invariants)
  File "D:\Anaconda3\envs\tensorflow-cpu\lib\site-packages\tensorflow\python\ops\control_flow_ops.py", line 2880, in _BuildLoop
    body_result = body(*packed_vars_for_body)
  File "D:\Anaconda3\envs\tensorflow-cpu\lib\site-packages\tensorflow\python\ops\control_flow_ops.py", line 3181, in <lambda>
    body = lambda i, lv: (i + 1, orig_body(*lv))
  File "D:\Anaconda3\envs\tensorflow-cpu\lib\site-packages\tensorflow\python\ops\rnn.py", line 795, in _time_step
    (output, new_state) = call_cell()
  File "D:\Anaconda3\envs\tensorflow-cpu\lib\site-packages\tensorflow\python\ops\rnn.py", line 781, in <lambda>
    call_cell = lambda: cell(input_t, state)
  File "D:\Anaconda3\envs\tensorflow-cpu\lib\site-packages\tensorflow\python\ops\rnn_cell_impl.py", line 232, in __call__
    return super(RNNCell, self).__call__(inputs, state)
  File "D:\Anaconda3\envs\tensorflow-cpu\lib\site-packages\tensorflow\python\layers\base.py", line 714, in __call__
    outputs = self.call(inputs, *args, **kwargs)
  File "D:\Anaconda3\envs\tensorflow-cpu\lib\site-packages\tensorflow\python\ops\rnn_cell_impl.py", line 1283, in call
    cur_inp, new_state = cell(cur_inp, cur_state)
  File "D:\Anaconda3\envs\tensorflow-cpu\lib\site-packages\tensorflow\python\ops\rnn_cell_impl.py", line 339, in __call__
    *args, **kwargs)
  File "D:\Anaconda3\envs\tensorflow-cpu\lib\site-packages\tensorflow\python\layers\base.py", line 714, in __call__
    outputs = self.call(inputs, *args, **kwargs)
  File "D:\Anaconda3\envs\tensorflow-cpu\lib\site-packages\tensorflow\python\ops\rnn_cell_impl.py", line 620, in call
    array_ops.concat([inputs, h], 1), self._kernel)
  File "D:\Anaconda3\envs\tensorflow-cpu\lib\site-packages\tensorflow\python\ops\array_ops.py", line 1181, in concat
    return gen_array_ops.concat_v2(values=values, axis=axis, name=name)
  File "D:\Anaconda3\envs\tensorflow-cpu\lib\site-packages\tensorflow\python\ops\gen_array_ops.py", line 1101, in concat_v2
    "ConcatV2", values=values, axis=axis, name=name)
  File "D:\Anaconda3\envs\tensorflow-cpu\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 787, in _apply_op_helper
    op_def=op_def)
  File "D:\Anaconda3\envs\tensorflow-cpu\lib\site-packages\tensorflow\python\framework\ops.py", line 3309, in create_op
    op_def=op_def)
  File "D:\Anaconda3\envs\tensorflow-cpu\lib\site-packages\tensorflow\python\framework\ops.py", line 1669, in __init__
    self._traceback = self._graph._extract_stack()  # pylint: disable=protected-access

InvalidArgumentError (see above for traceback): ConcatOp : Dimensions of inputs should match: shape[0] = [20,25] vs. shape[1] = [30,100]
     [[Node: rnn/while/rnn/multi_rnn_cell/cell_0/basic_lstm_cell/concat = ConcatV2[N=2, T=DT_FLOAT, Tidx=DT_INT32, _device="/job:localhost/replica:0/task:0/device:CPU:0"](rnn/while/TensorArrayReadV3, rnn/while/Switch_4:1, rnn/while/rnn/multi_rnn_cell/cell_3/basic_lstm_cell/Const)]]

这是我用来检查我的输入的代码

def checkData(inputs, targets, sequencelence):
    batch_size = 20
    features, target, sequece = my_input_fn(inputs, targets, batch_size=batch_size, shuffle=True, num_epochs=None,
                                            sequece_lenth=sequencelence)
    with tf.Session() as sess:
        for i in range(1000):
            features1, target1, sequece1 = sess.run([features, target, sequece])
            assert len(features1) == batch_size
            for sentence in features1 :
                assert len(sentence) == 30
                for word in sentence:
                    assert len(word) == 25

            assert len(target1) == batch_size
            assert len(sequece1) == batch_size
            print(target1)
    print("OK")

错误来自LSTMCell.call call method https://github.com/tensorflow/tensorflow/blob/92e6c3e4f5c1cabfda1e61547a6a1b268ef95fa5/tensorflow/python/ops/rnn_cell_impl.py#L579。在那里,我们正在努力tf.concat([inputs, h], 1)这意味着我们想要将下一个输入与之前的当前隐藏状态连接起来matmul与内核变量矩阵进行运算。该错误表明您无法执行此操作,因为batch (0th) 尺寸不匹配 - 您的输入已成形[20,25]你的隐藏状态就成形了[30,100].

由于某种原因,在第 32 次迭代中,或者每当您看到错误时,输入不会批量处理30,但仅限于20。当训练示例总数不能均匀划分批次大小时,这种情况通常会发生在训练数据结束时。这个假设也符合“当我使用较小的批次时,代码似乎可以运行更长的时间”的说法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

InvalidArgumentError:ConcatOp:输入的维度应该匹配 的相关文章

随机推荐

  • 根据 pandas DataFrame 中的列值条件替换多列

    我想根据第一组列中的值 具体来说 第一列为空白 同时将多个列的值替换为其他列中的相应值 这是我正在尝试做的一个例子 import pandas as pd df pd DataFrame a1 m n o p a2 q r s t b1 a
  • SMTP Mandrill 端口 587 连接超时

    我有一个应用程序 可以使用 Mandrillapp 的 SMTP 服务器为自己发送一些通知电子邮件 它在我的 localhost development 上运行良好 但在 DigitalOcean 的 Droplet 中我收到一个 PHP
  • 在 HttpAuthenticationContext 中为 IAuthenticationFilter 设置 Cookie 值

    我需要在 WebAPI 管道的身份验证步骤中读取 写入 cookie 我为此创建了一个自定义过滤器 为了遵守自托管概念 访问 cookie 并将其写入客户端的安全方法是什么 里克 斯特拉尔 http weblog west wind com
  • Android Locationprovider 需要太长时间才能暂时不可用

    根据这篇文章 UPD 链接已删除 因为它现在会导致一些废话 设置minTime当请求位置更新时将导致提供程序将自身设置为 TEMPORARILY UNAVAILABLEminTime毫秒以节省电池电量 在此不活动期间 GPS 提供商将自行关
  • if (flag==0) 和 if (0==flag) 哪一个执行得更快?

    面试问题 哪一个执行得更快 if flag 0 or if 0 flag Why 我还没有看到任何正确答案 已经有一些了 警告 纳瓦兹确实指出了用户定义的陷阱 我很遗憾我仓促地对 最愚蠢的问题 投了赞成票 因为似乎很多人都没有得到正确的答案
  • 如何查找当前选定 DOM 对象的所有兄弟姐妹

    在 JavaScript 中查找所有 nextSiblings 和 previousSiblings 的完美方法是什么 我尝试了几种方法但没有得到准确的解决方案 如果选择任何元素 我需要获取所有下一个同级元素的长度 不包括空格 任何空格或换
  • CKContainer accountStatusWithCompletionHandler 返回错误值

    accountStatusWithCompletionHandler方法返回 NoAccount价值 知道为什么返回值不是 Available 我已登录 iCloud 并连接到互联网 医生说 NoAccount means 用户的 iClo
  • 有没有办法像“举手发言”功能一样监控用户的 iPhone 移动情况?

    我想在用户将 iPhone 举到脸上时收到通知 就像 Siri 一样 是否可以 添加更具体的要求 当用户将手机放在耳朵附近时 我想使屏幕变暗 我知道可以启用接近传感器来实现这一点 但令人烦恼的是 当用户在传感器上移动手指时 屏幕会时不时变暗
  • 为什么有些对象属性是 UnaryExpression,而另一些对象属性是 MemberExpression?

    根据我的答案采取行动使用 lambda 而不是字符串属性名称选择模型属性 https stackoverflow com questions 3558974 select a model property using a lambda an
  • 删除记录时找不到元素

    JqG rid 4 6 一切正常 唯一的问题是 当我打开 Firefox 调试器并转到控制台时 如果我删除一条记录 单击垃圾桶图标 然后弹出删除对话框 单击删除按钮并刷新页面等 调试器会警告我 没有找到元素 可能的脚本是 gridSelec
  • Python 中 Comet 的最新推荐? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 对 numpy 屏蔽数组的操作给出屏蔽的无效值

    来自 numpy 中屏蔽数组的文档numpy 数组上的操作 https docs scipy org doc numpy reference maskedarray generic html operations on masked arr
  • Java 中的内存管理

    如何在Java中手动删除对象 有没有类似的方法obj delete or obj kill 没有真正的办法 Java有一个特殊的垃圾收集器这会为你做到这一点 一旦您的对象没有任何对它的引用 它就会在某个时候被垃圾收集器拾取并销毁 From
  • 带有多个 webapp 的 tomcat ajp 连接器

    我有一个 tomcat 服务器 带有 webapps ROOT 应用程序 以 Apache 为前端 LoadModule proxy ajp module modules mod proxy ajp so and ProxyPass ajp
  • 如何在 Swift 中返回序列?

    我正在尝试编写一个扩展Matrix书中的例子 稍微调整为通用的 https stackoverflow com q 24136604 458193 我正在尝试编写一个名为的方法getRow返回给定行的值序列 在 C 中 我会这样写 IEnu
  • 迭代 JSON 数据? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有一个如下所示的 JSON 数据
  • 数据源中 String 类型的给定值无法转换为指定目标列的 bigint 类型

    这是我的代码 protected void SendToServer Click object sender EventArgs e DataTable Values Session valuesdt as DataTable if Val
  • 必须在创建 QCoreApplication 之前设置属性 Qt::AA_UseSoftwareOpenGL

    所以我的环境是 Windows 10 截至 2019 年 11 月 8 日更新 通过 miniconda 安装了 Python 3 6 Spyder 4 运行 miniconda shell 激活虚拟环境 运行 Spyder 我得到以下信息
  • .PO 到 .MO - 程序转换 (PHP)

    我计划允许用户通过 PHP 用户界面生成 POT 文件 PO 文件 作为 CMS 解决方案的一部分 一旦生成这些文件 简单一点 我希望允许我的系统自动将这些文件转换为 MO 文件以响应用户 POST 请求 我在SO上看到了以下问题 php
  • InvalidArgumentError:ConcatOp:输入的维度应该匹配

    Tensorflow 1 7使用dynamic rnn时 一开始运行良好 但在第32步 当我运行代码时它发生变化 时 出现错误 当我使用较小的批次时 代码似乎可以运行更长时间 但是错误仍然弹出 只是无法弄清楚出了什么问题 from mapp