DTC 模型时间序列聚类

DeepTemporalClustering

项目地址:DeepTemporalClustering

默认运行

报错 1

1
'kullback leibler divergence' from 'keras.losses' 

求 KL 散度,解决办法:

1
2
3
from keras.losses import kullback_leibler_divergence
# 改为
from keras.losses import kl_divergence

报错 2

1
No module named 'keras.engine'

解决办法:

1
2
3
4
from keras.engine.topology import Layer, InputSpec
# 改为
from keras.layers import Layer
from keras.layers import InputSpec

报错 3

1
cannot import name 'CuDNNLSTM' from 'keras.layers'

解决办法:

1
2
3
4
from keras.layers import CuDNNLSTM
# 改为
from keras.layers import LSTM
# 上面是需要 CUDA 环境

而且参考:CuDNNLSTM not found

报错 4

1
The filename must end in `.weights.h5`.

解决办法:

1
2
# self.model.save_weights(save_dir + '/DTC_model_' + str(epoch) + '.h5')
self.model.save_weights(save_dir + '/DTC_model_' + str(epoch) + '.weights.h5')

报错 5

1
module 'keras.backend' has no attribute 'sum'

解决办法:

1
2
3
4
import keras.backend as K 
# or from keras import backend as K
# 改为
import keras.src.legacy.backend as K

后端函数的路径修改了

报错 6

1
TypeError: 'float' object is not subscriptable

如果你在一个不可索引的浮动变量上使用方括号符号进行索引或切片,Python 会引发 TypeError: 'float' object is not subscriptable

问题的原因在于 :

1
2
3
4
if self.heatmap:
loss = self.model.evaluate(X_train, [X_train, p, p], batch_size=batch_size, verbose=False)
else:
loss = self.model.evaluate(X_train, [X_train, p], batch_size=batch_size, verbose=False)

evaluate 返回的应该是一个数组。只有这样在才能取到值:

1
2
3
logdict['L'] = loss[0]
logdict['Lr'] = loss[1]
logdict['Lc'] = loss[2]

通过 metrics_names 查看也能知道只返回了一个值,参考

  1. Keras中的model.evaluate()返回了什么值
  2. 当尝试从Keras神经网络的mode.evaluate中返回多个指标的值时出现错误。
  3. Python Keras中model.evaluate()返回了哪些值
  4. Sequential 模型 API
1
2
3
print(self.model.metrics_names)

# >> ['loss']

目前已知:

  1. print(self.model.metrics_names) 可以打印 loss 的标签;
  2. model.evaluate 具体返回多少个值是不确定的,如果在 complie 的时候没有指定 metrics 的话,默认只有 loss 一个返回值。

现在看 model 的 complie 代码:

1
2
3
self.model.compile(loss=['mse', 'kld'],		# kld:KL散度, mse:MSE 均方误差
loss_weights=[1.0, gamma],
optimizer=optimizer)

这里没有指定 metrics 但是指定了两个 loss。

keras常用的损失函数Losses与评价函数Metrics 中可以知道:

1
2
mse 为 MSE 均方误差
kld 为 KL 散度

另外 loss 也是支持 [loss1, loss2, loss3] 的这种格式,参考:

  1. keras多个loss同时优化
  2. tf.keras多输出和自定义loss
  3. keras自定义loss

但还是不知道为何只返回了一个值……

临时解决方案:

1
2
3
4
self.model.compile(loss=['mse', 'kld'],		# kld:KL散度, mse:MSE 均方误差
metrics=['mse'],
loss_weights=[1.0, gamma],
optimizer=optimizer)

这样的话,就不会报错了……

报错 7

更换数据集后报错:

1
assert(timesteps % pool_size == 0)

解决办法:

调整 pool_size 保证时间戳可以整除池化

报错 8

开启 heatmap 报错:

1
ValueError: The name "reshape" is used 2 times in the model. All operation names should be unique.

使用 heatmap 运行

报错 9

1
ValueError: The name "reshape" is used 2 times in the model. All layer names should be unique.

找到这块代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if self.heatmap:
n_heatmap_filters = self.n_clusters # one heatmap (class activation map) per cluster
encoded = self.encoder.output

# heatmap_layer = Reshape((-1, 1, self.n_units[1]))(encoded)
# 取个名字即可
heatmap_layer = Reshape((-1, 1, self.n_units[1]), name='1')(encoded)
heatmap_layer = UpSampling2D((self.pool_size, 1))(heatmap_layer)
heatmap_layer = Conv2DTranspose(n_heatmap_filters, (self.kernel_size, 1), padding='same')(heatmap_layer)
# The next one is the heatmap layer we will visualize

heatmap_layer = Reshape((-1, n_heatmap_filters), name='Heatmap')(heatmap_layer)
heatmap_output_layer = GlobalAveragePooling1D()(heatmap_layer)
# A dense layer must be added only if `n_heatmap_filters` is different from `n_clusters`
# heatmap_output_layer = Dense(self.n_clusters, activation='relu')(heatmap_output_layer)
heatmap_output_layer = Softmax()(heatmap_output_layer) # normalize activations with softmax

报错 10

1
AttributeError: module 'keras.backend' has no attribute 'variable'

解决办法:

1
2
3
self.heatmap_loss_weight = K.variable(self.initial_heatmap_loss_weight)
# 改为
self.heatmap_loss_weight = keras.src.legacy.backend.variable(self.initial_heatmap_loss_weight)

参考报错 5

报错 11

1
AttributeError: module 'keras.backend' has no attribute 'set_value'

同理

1
2
3
K.set_value(self.heatmap_loss_weight, self.final_heatmap_loss_weight)
# 改为
keras.src.legacy.backend.set_value(self.heatmap_loss_weight, self.final_heatmap_loss_weight)

Deep-temporal-clustering

项目地址:Deep-temporal-clustering

默认运行

1
python3 train.py --similarity 'CID' --pool 7

可以获得结果

使用 CBF 数据集

1
python3 train.py --dataset_name 'CBF' --similarity 'CID' --pool 8

报错 1

1
ValueError: multi_class must be in ('ovo', 'ovr')

解决办法:

1
2
3
roc_auc = roc_auc_score(y_test, preds)
# 改为
roc_auc = roc_auc_score(y_test, preds, multi_class='ovr')

DTC 模型时间序列聚类
https://wonderhoi.com/2024/03/21/DTC-模型时间序列聚类/
作者
wonderhoi
发布于
2024年3月21日
许可协议