带有变压器的分类模型的 keras 模型中的错误

Posted

技术标签:

【中文标题】带有变压器的分类模型的 keras 模型中的错误【英文标题】:Error in keras model for classification model with transformers 【发布时间】:2022-01-14 07:46:36 【问题描述】:

我遵循了这个教程: https://keras.io/examples/timeseries/timeseries_transformer_classification/ 对于我的时间序列的变压器分类模型。 但是,在该行中:

x = layers.MultiHeadAttention(
            key_dim=head_size, num_heads=num_heads, dropout=dropout
        )(x, x)

我得到错误:

IndexErrortuple index out of range

有什么想法吗?

【问题讨论】:

@okuoub 是否可以提供一些可以重现您上述错误的虚拟数据? @M.Innat 这是教程中的相同代码,因此数据取自 root_url = "raw.githubusercontent.com/hfawaz/cd-diagram/master/FordA" ,但我认为这很重要,因为错误在于构建架构 - 在适合 @okuoub 你能运行上面的官方代码示例吗? @M.Innat 不,当我将其粘贴到我的 pycharm 时,出现上述错误 这个问题在当前状态下是个笑话。没有办法重现它。 【参考方案1】:

披露:我来这里是为了赏金,然后我尝试了 Colab,一切正常..

接下来我阅读了 cmets:“这个问题在当前状态下是个笑话。没有办法重现它。”在这一点上我同意。但由于我是 幸运的汉斯 并且显然有很多时间拖延,我按照 OP 提示启动了 Pycharm:“不,当我将它粘贴到我的 pycharm 时,我得到了上述错误"

但这也对我有用,这让我想知道你是否触摸过某些东西,所以我很高兴为你提供一个(n)(未触摸的)工作版本..

import numpy as np

def readucr(filename):
    data = np.loadtxt(filename, delimiter="\t")
    y = data[:, 0]
    x = data[:, 1:]
    return x, y.astype(int)


root_url = "https://raw.githubusercontent.com/hfawaz/cd-diagram/master/FordA/"

x_train, y_train = readucr(root_url + "FordA_TRAIN.tsv")
x_test, y_test = readucr(root_url + "FordA_TEST.tsv")

x_train = x_train.reshape((x_train.shape[0], x_train.shape[1], 1))
x_test = x_test.reshape((x_test.shape[0], x_test.shape[1], 1))

n_classes = len(np.unique(y_train))

idx = np.random.permutation(len(x_train))
x_train = x_train[idx]
y_train = y_train[idx]

y_train[y_train == -1] = 0
y_test[y_test == -1] = 0


from tensorflow import keras
from tensorflow.keras import layers

def transformer_encoder(inputs, head_size, num_heads, ff_dim, dropout=0):
    # Normalization and Attention
    x = layers.LayerNormalization(epsilon=1e-6)(inputs)
    x = layers.MultiHeadAttention(
        key_dim=head_size, num_heads=num_heads, dropout=dropout
    )(x, x)
    x = layers.Dropout(dropout)(x)
    res = x + inputs

    # Feed Forward Part
    x = layers.LayerNormalization(epsilon=1e-6)(res)
    x = layers.Conv1D(filters=ff_dim, kernel_size=1, activation="relu")(x)
    x = layers.Dropout(dropout)(x)
    x = layers.Conv1D(filters=inputs.shape[-1], kernel_size=1)(x)
    return x + res

还要确保我们谈论的是相同的包版本

我使用了 numpy (1.21.2) 和 tensorflow (2.6.0) - 尝试使用这些版本,如果您使用不同的版本,请告诉我。

【讨论】:

以上是关于带有变压器的分类模型的 keras 模型中的错误的主要内容,如果未能解决你的问题,请参考以下文章

在 Keras 中将变压器输出连接到 CNN 输入的问题

问题:模型分类猫和狗(keras)

预训练变压器模型的配置更改

用于多标签问题的 keras 模型的 scikit 学习链分类器的拟合方法错误

如何解决 tensorflow.keras 中的值错误?

keras中的级联模型(自动编码器+分类器)