【问题标题】:Why Are My Sample Weights Breaking My Neural Network?为什么我的样本权重会破坏我的神经网络?
【发布时间】:2020-06-02 11:25:15
【问题描述】:

请注意,我是 tensorflow 和一般机器学习的新手。

我对一组不平衡的数据进行了神经网络训练,因此我需要不同的样本权重。

我的模型是这样构造的:

def loss(a1, a2):
    customloss = keras.backend.mean(keras.backend.square((a1 - a2)))
    return customloss

def build_model():
    model = keras.Sequential()
    model.add(keras.layers.Dense(101, activation=keras.activations.linear, input_shape=(101,)))
    model.add(keras.layers.Dense(101, activation=keras.activations.linear))
    model.add(keras.layers.Dense(101))

    optimizer = keras.optimizers.RMSprop(0.00001)

    model.compile(loss=loss, optimizer=optimizer, metrics=['mae', 'accuracy'])

    return model

我正在这样训练它:

EPOCHS=400
early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', patience=20)
model = build_model()
history = model.fit(x, y, epochs=EPOCHS, validation_split=0.2, verbose=1, sample_weight=weights, callbacks=[early_stop])

其中weights 是形状(9171,) 的数组,xy 的形状各有(9171,101)

如果我删除 sample_weight 参数,网络就会运行。但有了它,我收到以下错误消息:

Epoch 1/400
Traceback (most recent call last):
  File "nnotest.py", line 153, in <module>
    history = model.fit(x, y, epochs=EPOCHS, validation_split=0.2, verbose=1, sample_weight=weights, callbacks=[early_stop])
  File "/home/star2/hgc4/.local/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py", line 780, in fit
    steps_name='steps_per_epoch')
  File "/home/star2/hgc4/.local/lib/python3.6/site-packages/tensorflow/python/keras/engine/training_arrays.py", line 363, in model_iteration
    batch_outs = f(ins_batch)
  File "/home/star2/hgc4/.local/lib/python3.6/site-packages/tensorflow/python/keras/backend.py", line 3292, in __call__
    run_metadata=self.run_metadata)
  File "/home/star2/hgc4/.local/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 1458, in __call__
    run_metadata_ptr)
tensorflow.python.framework.errors_impl.InvalidArgumentError: Can not squeeze dim[0], expected a dimension of 1, got 32
     [[{{node loss_1/dense_8_loss/weighted_loss/Squeeze}}]]

我对为什么这可能不起作用有我的想法。我知道它可能正在尝试将我的一维数组解析为默认批量大小 32,但我不明白为什么。从阅读the documentation 看来,您可以添加一个一维数组来构成从权重到训练数据的一维映射,所以这应该很容易吗?我错过了什么?

【问题讨论】:

  • 你的标签是什么?你的网络输出一个矩阵 Nx101
  • 不确定你的意思。
  • 我的意思是你的y.shape的形状。它应该与网络的输出形状相同
  • y 的形状为 (9171, 101),x 也是如此。

标签: python tensorflow machine-learning keras neural-network


【解决方案1】:

因为您的损失没有样本。你得到一个全局平均值。

如果您想要均方误差,请使用loss='mse' 进行编译。

如果有其他问题,请不要折叠批次维度(轴 = 0):

def loss(true, pred):
    return keras.backend.mean(keras.backend.square(true-pred), axis=-1)

【讨论】:

  • :D -- 请考虑将答案标记为正确 :)
猜你喜欢
  • 1970-01-01
  • 2020-09-05
  • 2020-12-05
  • 1970-01-01
  • 2020-03-30
  • 2019-06-26
  • 2018-03-11
  • 1970-01-01
  • 2015-11-11
相关资源
最近更新 更多