Python 为什么我的样本权重会破坏我的神经网络?

Python 为什么我的样本权重会破坏我的神经网络?,python,tensorflow,machine-learning,keras,neural-network,Python,Tensorflow,Machine Learning,Keras,Neural Network,请注意,我对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.

请注意,我对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,)
,和
x
y
都具有形状
(9171101)

如果删除
sample\u 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}}]]
1/400纪元
回溯(最近一次呼叫最后一次):
文件“nnotest.py”,第153行,在
history=model.fit(x,y,epochs=epochs,validation\u split=0.2,verbose=1,sample\u weight=weights,callbacks=[early\u stop])
文件“/home/star2/hgc4/.local/lib/python3.6/site packages/tensorflow/python/keras/engine/training.py”,第780行
步骤(名称=“每个时代的步骤”)
文件“/home/star2/hgc4/.local/lib/python3.6/site packages/tensorflow/python/keras/engine/training\u arrays.py”,第363行,在模型迭代中
批量输出=f(批量输入)
文件“/home/star2/hgc4/.local/lib/python3.6/site packages/tensorflow/python/keras/backend.py”,第3292行,在__
run\u元数据=self.run\u元数据)
文件“/home/star2/hgc4/.local/lib/python3.6/site packages/tensorflow/python/client/session.py”,第1458行,在__
运行_元数据_ptr)
tensorflow.python.framework.errors\u impl.InvalidArgumentError:无法压缩dim[0],应为1,得到32
[{{node loss_1/稠密_8_loss/加权_loss/挤压}}]]

我有我的想法,为什么这可能不起作用。我知道它可能试图将我的1D数组解析为默认的批大小32,但我不明白为什么。从阅读中可以看出,您可以添加一个1D数组来构成从权重到训练数据的1D映射,所以这应该很容易?我遗漏了什么?

因为你丢失的东西没有样品。你得到了一个全球平均值

如果您想要的是均方误差,请使用
loss='mse'
编译

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


你们的标签是什么?你的网络输出一个矩阵NX101,我不确定你的意思。我指的是你的
y.shape
的形状。它应该与网络的输出Sabey的形状相同(9171, 101),如x.d:请考虑将答案标记为“正确”:
def loss(true, pred):
    return keras.backend.mean(keras.backend.square(true-pred), axis=-1)