首页 > 解决方案 > 将 sample_weight 用于 keras 循环神经网络

问题描述

我正在考虑在sample_weight我的 keras.fit()方法中传递一个参数,以控制我的输入神经元对模型输出的权重。例如,我正在研究一个循环神经网络,其中我的数据管道的窗口大小为 4 和 2 个特征。所以我的原始输入是一个(4, 2)矩阵。

根据keras 文档

sample_weight:训练样本的可选 Numpy 权重数组,用于加权损失函数(仅在训练期间)。您可以传递一个与输入样本长度相同的平面 (1D) Numpy 数组(权重和样本之间的 1:1 映射),或者在时间数据的情况下,您可以传递一个具有形状的二维数组(样本、序列长度),对每个样本的每个时间步应用不同的权重。当 x 是数据集、生成器或 keras.utils.Sequence 实例时,不支持此参数,而是提供 sample_weights 作为 x 的第三个元素。

由于我正在使用tf.data,我必须sample_weight按照文档将 x 作为第三个元素传递。我对 2D/3D 数组的形状应该是什么感到困惑sample_weight

例如,当我使用batch_size我的输入时 size (batch_size, window_size, features)。根据文档,我必须输入一个 shape 的 2D 数组(samples, sequence_length)。我希望对所有样本具有相同的权重,但为我的window_size和更改它features

那么这是否意味着sample_weight应该是 size (batch_size, window_size, features)?我再次希望每个 具有相同的权重sample,因此以下对于3、5 和2batch_size的 a是否正确?(注:每批都一样,这是我想要的)window_sizefeatures

<tf.Tensor: shape=(3, 5, 2), dtype=float32, numpy=
 array([[[0.   , 0.   ],
         [0.25 , 0.025],
         [0.5  , 0.05 ],
         [0.75 , 0.075],
         [1.   , 0.1  ]],
 
        [[0.   , 0.   ],
         [0.25 , 0.025],
         [0.5  , 0.05 ],
         [0.75 , 0.075],
         [1.   , 0.1  ]],
 
        [[0.   , 0.   ],
         [0.25 , 0.025],
         [0.5  , 0.05 ],
         [0.75 , 0.075],
         [1.   , 0.1  ]]], dtype=float32)>)

编辑

该示例显示错误:

ValueError: Can not squeeze dim[2], expected a dimension of 1, got 2 for '{{node huber_loss/weighted_loss/Squeeze}} = Squeeze[T=DT_FLOAT, squeeze_dims=[-1]](IteratorGetNext:2)' with input shapes: [?,5,2].

标签: pythontensorflowkeras

解决方案


推荐阅读