在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
相关产品推荐
相关产品推荐

