Keras Tensorflow中的加权样本损失

问题描述 投票:1回答:1

我想造成损失,使每个样本都承受单独的权重,并且不仅在训练期间起作用。它也应该适用于验证和测试集。

到目前为止我尝试过的:

    def MMSE2(targets, preds,sample_weight): 
        #some calculations...       
        return loss


    input_dim = Input(shape = (dim, ),name='rating_in')
    weights_tensor = Input(shape=(dim,),name='weights')

    encoder,decoder = AddLayers(neurons,setup['AFunction'],
                                 setup['BatchNorm'],setup['Dropout'],setup['Layers'],dim,setup['Noise'])

    encoded = encoder(input_dim)    
    decoded = decoder(encoded)

    autoencoder = Model([input_dim,weights_tensor], decoded)
    autoencoder.add_loss(MMSE2(input_dim,decoded,weights_tensor))
    autoencoder.compile(optimizer='adam')


    history = autoencoder.fit(x=[helper.trainx,helper.trainy,helper.trainm],
                              validation_data= [helper.valx,helper.valy,helper.valm],
                              epochs = setup['Epochs'], batch_size = setup['BatchSize'])

它不包含验证数据。

验证数据出错:


  File "<ipython-input-11-fe466c688bcd>", line 3, in <module>
    epochs = setup['Epochs'], batch_size = setup['BatchSize'])

  File "C:\Users\Admin\Anaconda3\envs\tf21\lib\site-packages\tensorflow_core\python\keras\engine\training.py", line 819, in fit
    use_multiprocessing=use_multiprocessing)

  File "C:\Users\Admin\Anaconda3\envs\tf21\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py", line 235, in fit
    use_multiprocessing=use_multiprocessing)

  File "C:\Users\Admin\Anaconda3\envs\tf21\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py", line 614, in _process_training_inputs
    distribution_strategy=distribution_strategy)

  File "C:\Users\Admin\Anaconda3\envs\tf21\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py", line 646, in _process_inputs
    x, y, sample_weight=sample_weights)

  File "C:\Users\Admin\Anaconda3\envs\tf21\lib\site-packages\tensorflow_core\python\keras\engine\training.py", line 2383, in _standardize_user_data
    batch_size=batch_size)

  File "C:\Users\Admin\Anaconda3\envs\tf21\lib\site-packages\tensorflow_core\python\keras\engine\training.py", line 2410, in _standardize_tensors
    exception_prefix='input')

  File "C:\Users\Admin\Anaconda3\envs\tf21\lib\site-packages\tensorflow_core\python\keras\engine\training_utils.py", line 539, in standardize_input_data
    str(data)[:200] + '...')

ValueError: Error when checking model input: 
the list of Numpy arrays that you are passing to your model is not the size the model expected. 
Expected to see 2 array(s), for inputs ['rating_in', 'weights'] 
but instead got the following list of 1 arrays: [array([[0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.],
       ...,
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 5....
python tensorflow keras loss
1个回答
0
投票

我已经从.fit()方法切换到了低级API方法,您可以在其中以循环方式写下训练内容。 Example

然后更改损失函数。

def MMSE(targets,mask,preds):  
    num_rating = math.reduce_sum(mask) #count ratings
    loss = targets-preds
    loss = mask * loss
    loss = math.square(loss)
    loss = math.reduce_sum(loss)
    loss = loss / num_rating

    #in a single line
    #loss = math.reduce_sum(math.square(mask*(preds - targets))) / num_rating 

    return loss
© www.soinside.com 2019 - 2024. All rights reserved.