Keras:具有类权重的LSTM

ten*_*con 2 lstm keras

我的问题与这个问题密切相关,但也超越了它.

我正在尝试在Keras中实现以下LSTM

  • 时间步数 nb_tsteps=10
  • 输入要素的数量是 nb_feat=40
  • 每个时间步长的LSTM细胞数是 120
  • LSTM层后面是TimeDistributedDense层

从上面提到的问题我明白我必须将输入数据表示为

nb_samples, 10, 40

通过在原始的时间序列中nb_samples滚动一个长度的窗口得到的地方.因此代码nb_tsteps=10(5932720, 40)

model = Sequential()
model.add(LSTM(120, input_shape=(X_train.shape[1], X_train.shape[2]), 
  return_sequences=True, consume_less='gpu'))
model.add(TimeDistributed(Dense(50, activation='relu')))
model.add(Dropout(0.2))
model.add(TimeDistributed(Dense(20, activation='relu')))
model.add(Dropout(0.2))
model.add(TimeDistributed(Dense(10, activation='relu')))
model.add(Dropout(0.2))
model.add(TimeDistributed(Dense(3, activation='relu')))
model.add(TimeDistributed(Dense(1, activation='sigmoid')))
Run Code Online (Sandbox Code Playgroud)

现在我的问题(上述假设是迄今为止正确):二进制响应(0/1)都严重不平衡,我需要通过一个class_weight字典一样cw = {0: 1, 1: 25}model.fit().但是我得到了一个例外class_weight not supported for 3+ dimensional targets.这是因为我将响应数据表示为(nb_samples, 1, 1).如果我将其重塑为2D数组,(nb_samples, 1)我会得到异常Error when checking model target: expected timedistributed_5 to have 3 dimensions, but got array with shape (5932720, 1).

非常感谢您的帮助!

小智 5

我认为你应该使用sample_weightsample_weight_mode='temporal'.

来自Keras文档:

sample_weight:训练样本的Numpy权重数组,用于缩放丢失函数(仅限训练期间).您可以传递平坦(1D)Numpy数组,其长度与输入样本相同(权重和样本之间的1:1映射),或者在时间数据的情况下,您可以传递具有形状的2D数组(samples,sequence_length) ),对每个样本的每个时间步应用不同的权重.在这种情况下,您应该确保在compile()中指定sample_weight_mode ="temporal".

在您的情况下,您需要提供与标签形状相同的2D阵列.

  • 我不明白为什么 sample_weight (with sample_weight_mode="temporal") 是相关的。我们在这里谈论的是类权重,而不是样本权重,对吗?sample_weight_mode="temporal" 只是在每个时间步为每个样本分配一个权重,但它与类标签完全无关? (2认同)