当前位置: 首页 > 知识库问答 >
问题:

Keras自定义损失函数数据类型错误

樊宏邈
2023-03-14

我有一个NN,它有两个相同的CNN(类似于暹罗网络),然后合并输出,并打算在合并的输出上应用自定义损失函数,如下所示:

     -----------------        -----------------
     |    input_a    |        |    input_b    |
     -----------------        -----------------
     | base_network  |        | base_network  |
     ------------------------------------------
     |           processed_a_b                |
     ------------------------------------------

在我的自定义损失函数中,我需要将y垂直分解为两块,然后对每一块应用分类交叉熵损失。但是,我不断从我的损失函数得到dtype错误,例如:

()中的ValueError回溯(最近一次调用)----

/usr/local/lib/python3。5/地区包/KERA/发动机/培训。编译中的py(自我、优化器、损耗、度量、损耗权重、样本权重模式,**kwargs)909损耗权重=损耗权重列表[i]910输出损耗=加权损耗(y真,y pred--

/usr/local/lib/python3。5/地区包/KERA/发动机/培训。加权中的py(y_真、y_pred、权重、掩码)451#如果权重不是无,则应用样本权重452:--

/usr/local/lib/python3。5/dist包/tensorflow/python/ops/math_ops。二进制运算包装中的py(x,y)827如果不存在(y,稀疏张量.稀疏传感器):828尝试:--

/usr/local/lib/python3。5/dist包/tensorflow/python/framework/ops。py in convert_to_tensor(value,dtype,name,preferred_dtype)674 name=name,675 preferred_dtype=preferred_dtype--

/usr/local/lib/python3。5/dist包/tensorflow/python/framework/ops。如果ret为None,则将内部类型中的py转换为张量(值、数据类型、名称、as ref、首选类型)739 740:--

/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/ops.py_TensorTensorConversionFunction(t,dtype,名称,as_ref)612提升值错误(613"张量转换请求dtype%s为张量与dtype%s:%r"-

张量转换请求dtype Float64为张量与dtype Float32:'张量(processed_a_b_sample_weights_1: 0,形状=(?,), dtype=Float32)'

下面是一个MWE来重现错误:

import tensorflow as tf
from keras import backend as K
from keras.layers import Input, Dense, merge, Dropout
from keras.models import Model, Sequential
from keras.optimizers import RMSprop
import numpy as np

# define the inputs
input_dim = 10
input_a = Input(shape=(input_dim,), name='input_a')
input_b = Input(shape=(input_dim,), name='input_b')
# define base_network
n_class = 4
base_network = Sequential(name='base_network')
base_network.add(Dense(8, input_shape=(input_dim,), activation='relu'))
base_network.add(Dropout(0.1))
base_network.add(Dense(n_class, activation='relu'))
processed_a = base_network(input_a)
processed_b = base_network(input_b)
# merge left and right sections
processed_a_b = merge([processed_a, processed_b], mode='concat', concat_axis=1, name='processed_a_b')
# create the model
model = Model(inputs=[input_a, input_b], outputs=processed_a_b)

# custom loss function
def categorical_crossentropy_loss(y_true, y_pred):
    # break (un-merge) y_true and y_pred into two pieces
    y_true_a, y_true_b = tf.split(value=y_true, num_or_size_splits=2, axis=1)
    y_pred_a, y_pred_b = tf.split(value=y_pred, num_or_size_splits=2, axis=1)
    loss = K.categorical_crossentropy(output=y_pred_a, target=y_true_a) + K.categorical_crossentropy(output=y_pred_b, target=y_true_b) 
    return K.mean(loss)

# compile the model
model.compile(loss=categorical_crossentropy_loss, optimizer=RMSprop())

共有1个答案

储思聪
2023-03-14

如错误所示,您正在使用float32数据,它需要float64。有必要将错误追踪到它的特定直线,以确定要纠正的张量,并能够更好地帮助您。

然而,它似乎与K.mean()方法有关,但是ValueErrors也可以由K.category\u crossentropy()方法生成。因此,问题可能在于你的张量丢失,两者都是y_preds或两者都是y_trues。在这些情况下,我看到两件事你可以尝试解决问题:

>

  • 您可以将张量(s)(让我们假设它是los)转换为所需的(Float64)类型,如下所示:

    from keras import backend as K
    new_tensor = K.cast(loss, dtype='float64')
    

    通过将参数dtype传递给Input()调用(如这些示例中所建议的),可以在开始时将输入声明为float64类型,如下所示:

    input_a = Input(shape=(input_dim,), name='input_a', dtype='float64')
    

  •  类似资料:
    • 我正在尝试使用Keras创建自定义损失函数。我想根据输入计算损失函数并预测神经网络的输出。 我尝试在Keras中使用自定义loss函数。我认为y_true是我们为训练提供的输出,y_pred是神经网络的预测输出。下面的损失函数与 Keras 中的“mean_squared_error”损失相同。 我想使用神经网络的输入也计算自定义损失函数除了mean_squared_error损失。有没有办法将输

    • 嗨,我一直试图使一个自定义损失函数在kerasdice_error_coefficient。它有它的实现在张量板和我尝试使用相同的函数在keras与张量流但它不断返回一个NoneType当我使用model.train_on_batch或model.fit在那里,因为它给适当的值时,使用在模型中的指标...能不能请人帮帮我我该怎么办?我尝试过跟随像Keras-FCN这样的库,在那里他使用了自定义损失

    • 我手头有一个问题,它优化了一个损失函数,而不是y_pred和y_true的函数。通过Keras留档后,我发现所有自定义损失函数必须是y_pred和y_true的函数。 在Keras中是否有其他方法实现我的损失函数?

    • 我试图在Keras中构造一个自定义损失函数-这是用于生存分析中的删失数据。 这种损失函数本质上是二元交叉熵,即多标签分类,但是损失函数中的求和项需要根据Y_true标签的可用性而变化。见下面的例子: 示例1:Y_可用的所有标签均为True Y_true=[0,0,0,1,1] Y_pred=[0.1,0.2,0.2,0.8,0.7] 损失=-1/5(log(0.9)log(0.8)log(0.8)

    • 问题内容: 在Keras中,如果您需要自定义损失以及其他参数,我们可以像https://datascience.stackexchange.com/questions/25029/custom- loss-function-with-additional-parameter-in- 凯拉斯 当我训练模型时,上述方法有效。但是,一旦训练了模型,我将很难加载模型。当我尝试在load_model中使用c

    • 我需要一些帮助与keras损失函数。我一直在Tensorflow后端的keras上实现自定义损失功能。 我已经在numpy中实现了自定义损失函数,但如果能将其转换为keras损失函数,那就太好了。丢失函数采用数据帧和用户id序列。如果用户id不同,则相同用户id的欧氏距离为正和负。函数返回数据帧的合计标量距离。 我试图实现到keras损失函数。我提取Numpy数组从y_true和y_pred张量对