You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Google Colab构建TCN模型时触发AttributeError:tuple无as_list属性

Keras-TCN在Google Colab中触发AttributeError: 'tuple' object has no attribute 'as_list'

问题详情

我基于keras-tcn包构建时序卷积网络(TCN)模型,代码在本地Macbook M1 Pro上运行正常,但在Google Colab环境中执行时抛出AttributeError。

模型代码

!pip install keras-tcn

from tensorflow.keras import Input, Model
from tensorflow.keras.layers import Dense, Softmax, Lambda
from tcn import TCN

# 输入层
input_layer = Input(shape=(20, 225))

# 第一TCN层
tcn_layer_1 = TCN(nb_filters=64,
                  kernel_size=3,
                  nb_stacks=1,
                  dilations=(1, 2, 4, 8),
                  padding='causal',
                  use_skip_connections=True,
                  return_sequences=True, # 堆叠TCN层需返回序列
                  dropout_rate=0.05,
                  activation='relu',
                  use_batch_norm=False,
                  use_layer_norm=False)(input_layer)

# 第二TCN层
tcn_layer_2 = TCN(nb_filters=64,
                  kernel_size=3,
                  nb_stacks=1,
                  dilations=(1, 2, 4, 8),
                  padding='causal',
                  use_skip_connections=True,
                  return_sequences=False, # 最终TCN层无需返回序列
                  dropout_rate=0.05,
                  activation='relu',
                  use_batch_norm=False,
                  use_layer_norm=False)(tcn_layer_1)

# 全连接层
dense_layer = Dense(128, activation='relu')(tcn_layer_2)

# 分类输出层
output_layer = Dense(len(gloss_list), activation='softmax')(dense_layer)

# 编译模型
model = Model(inputs=input_layer, outputs=output_layer)
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

# 打印模型结构
model.summary()

报错信息

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-7-3a050a142399> in <cell line: 9>()
      7 
      8 # First TCN Layer - parameters based on the tcn.py file
----> 9 tcn_layer_1 = TCN(nb_filters=64,
     10                   kernel_size=3,
     11                   nb_stacks=1,

1 frames
/usr/local/lib/python3.10/dist-packages/tcn/tcn.py in build(self, input_shape)
    314             self.output_slice_index = -1  # causal case.
    315         self.slicer_layer = Lambda(lambda tt: tt[:, self.output_slice_index, :], name='Slice_Output')
---> 316         self.slicer_layer.build(self.build_output_shape.as_list())
    317 
    318     def compute_output_shape(self, input_shape):

AttributeError: 'tuple' object has no attribute 'as_list'

环境差异

  • 本地Macbook M1 Pro:运行正常,可正常打印模型摘要
  • Google Colab:触发上述错误

源码分析

错误源于TCN类build方法的最后一行代码:self.slicer_layer.build(self.build_output_shape.as_list())。逻辑上self.build_output_shape初始为tuple类型的input_shape,经过残差块处理后应转为TensorShape对象,但Colab环境中它始终保持tuple类型,导致调用.as_list()方法失败。相关build方法核心代码如下:

def build(self, input_shape):
        self.build_output_shape = input_shape
        self.residual_blocks = []
        total_num_blocks = self.nb_stacks * len(self.dilations)
        if not self.use_skip_connections:
            total_num_blocks += 1

        for s in range(self.nb_stacks):
            for i, d in enumerate(self.dilations):
                res_block_filters = self.nb_filters[i] if isinstance(self.nb_filters, list) else self.nb_filters
                self.residual_blocks.append(ResidualBlock(dilation_rate=d,
                                                          nb_filters=res_block_filters,
                                                          kernel_size=self.kernel_size,
                                                          padding=self.padding,
                                                          activation=self.activation_name,
                                                          dropout_rate=self.dropout_rate,
                                                          use_batch_norm=self.use_batch_norm,
                                                          use_layer_norm=self.use_layer_norm,
                                                          use_weight_norm=self.use_weight_norm,
                                                          kernel_initializer=self.kernel_initializer,
                                                          name='residual_block_{}'.format(len(self.residual_blocks))))
                self.residual_blocks[-1].build(self.build_output_shape)
                self.build_output_shape = self.residual_blocks[-1].res_output_shape

        for layer in self.residual_blocks:
            self.__setattr__(layer.name, layer)

        self.output_slice_index = None
        if self.padding == 'same':
            time = self.build_output_shape.as_list()[1]
            if time is not None:
                self.output_slice_index = int(self.build_output_shape.as_list()[1] / 2)
            else:
                self.padding_same_and_time_dim_unknown = True
        else:
            self.output_slice_index = -1
        self.slicer_layer = Lambda(lambda tt: tt[:, self.output_slice_index, :], name='Slice_Output')
        self.slicer_layer.build(self.build_output_shape.as_list())

解决方案

该问题由Colab与本地环境的TensorFlow/Keras版本兼容性差异导致,可通过以下方式解决:

1. 修改keras-tcn源码适配tuple类型

找到Colab中/usr/local/lib/python3.10/dist-packages/tcn/tcn.py文件,修改build方法中所有涉及.as_list()的代码:

  • 将time = self.build_output_shape.as_list()[1]改为time = self.build_output_shape[1]
  • 将self.output_slice_index = int(self.build_output_shape.as_list()[1] / 2)改为self.output_slice_index = int(self.build_output_shape[1] / 2)
  • 将self.slicer_layer.build(self.build_output_shape.as_list())改为self.slicer_layer.build(tuple(self.build_output_shape))

2. 对齐TensorFlow版本

在Colab中安装与本地环境一致的TensorFlow版本,例如本地使用TF 2.15.0:

!pip install tensorflow==2.15.0
!pip install keras-tcn

3. 安装keras-tcn最新开发版本

直接安装项目仓库的最新源码版本(若已包含该问题修复):

!pip install git+https://github.com/philipperemy/keras-tcn.git

内容的提问来源于stack exchange,提问作者TheMetaSetter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 21:05:53