Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在tensorflow中实现此自定义损失函数?_Python_Tensorflow_Keras_Loss Function - Fatal编程技术网

Python 如何在tensorflow中实现此自定义损失函数?

Python 如何在tensorflow中实现此自定义损失函数?,python,tensorflow,keras,loss-function,Python,Tensorflow,Keras,Loss Function,我的损失函数: 我想为以下模型实现上述损失函数: model_s=tf.keras.Sequential([ tf.keras.layers.Dense(100, input_shape=(50,),activation='tanh'), tf.keras.layers.Dense(100,activation='tanh'), tf.keras.layers.Dense(50,activation='sigmoid')]) model_s.compile(optimizer='adam',

我的损失函数:

我想为以下模型实现上述损失函数:

model_s=tf.keras.Sequential([
tf.keras.layers.Dense(100, input_shape=(50,),activation='tanh'),
tf.keras.layers.Dense(100,activation='tanh'),
tf.keras.layers.Dense(50,activation='sigmoid')])

model_s.compile(optimizer='adam',
             loss=loss_fn,
             metrics="accuracy",)


model_s.fit(x_train,y_train,epochs=5,batch_size=512)
我以两种方式实现了该函数,但在这两种情况下都遇到了错误。 案例1:


我知道由于输入形式的原因,第一种情况可能不适用于不同的批量大小,但我对第二种情况的详细信息做了很多更改,但有一件事始终保持不变:显示错误且不起作用:(

与其尝试索引到预测中,不如使用真实的标签(以一种热格式)作为获得第i个预测的掩码(您可以通过跨行的乘法和求和来实现)。然后使用argmax为第二部分创建序列掩码

试试这个:

将tensorflow导入为tf
def自定义丢失(y_真,y_pred,num_labels=5):
idx=tf.math.argmax(y_true,1)
msk=tf.cast(tf.sequence\u掩码(idx,num\u标签),tf.float32)
#第一部分
fst=-tf.math.log(tf.math.reduce_sum(y_true*y_pred,1))
#第二部分
snd=tf.math.reduce_sum(tf.math.log(1.0-y_pred*msk,1))
返回tf.math.reduce_平均值(fst+snd)
测试1

y_true=tf.constant([[0,0,0,0,1]],tf.float32)
y_pred=tf.常数([[0,0,0,0,0.9]]
自定义损失(是真实的,是预测的)
# 
测试2

y_true=tf.常量([[0,0,0,0,1],[0,0,0,1,0]],tf.float32)
y_pred=tf.常数([[0,0,0,0,0,0.99],[0,0,0,0,0.9,0.3])
自定义损失(是真实的,是预测的)
# 

为什么要使用
pre[:y]
如果你这样使用它,我想y应该是一个标量,但它是一个形状为50的张量。@SebastianR.y是标量。y=tf.math.argmax(y\u true[I])。pre[:y]在第二种情况下获取y\u pred向量中的pre-y值(根据损失函数),在第一种情况下获取tf.tensor'loss\u fn/argmax:0'形状=(50,)是您的错误的原因。我认为您的第二种方法失败了,因为您迭代的维度在图形计算时未知。在应用日志之前,您可以使用或计算相乘到
y_pred
的二进制掩码来构造解决方案。公式中的
y'
是什么?@gobrewers14如果输入x,则y是tru电子标签或输出
def loss_fn(y_true,y_pred):
    y=tf.math.argmax(y_true)
    loss=(-(tf.math.log(y_pred[y])+tf.reduce_sum(tf.math.log(1-y_pred[:y]))))
    return tf.reduce_mean(loss)

#example
y_true=tf.constant([0,0,0,0,1])
y_pred=tf.constant([0,0,0,0,.9])
loss_fn(y_true,y_pred)

<tf.Tensor: shape=(), dtype=float32, numpy=0.105360545>
TypeError: Only integers, slices (`:`), ellipsis (`...`), tf.newaxis (`None`) and scalar tf.int32/tf.int64 tensors are valid indices, got <tf.Tensor 'loss_fn/ArgMax:0' shape=(50,) dtype=int64>
def loss_fn(y_true,y_pred):
    i=0
    loss=[]
    for pre in y_pred:
        y=tf.math.argmax(y_true[i])
        loss.append(-(tf.math.log(pre[y])+tf.reduce_sum(tf.math.log(1-pre[:y]))))
        i += 1
    return tf.reduce_mean(loss, axis=-1)

#example
y_true=tf.constant([[0,0,0,0,1],[0,0,0,1,0]])
y_pred=tf.constant([[0,0,0,0,.99],[0,0,0,.9,.3]])
loss_fn(y_true,y_pred)
<tf.Tensor: shape=(), dtype=float32, numpy=0.057705436>
ValueError: Tried to convert 'input' to a tensor and failed. Error: The tensor 'Tensor("loss_fn/while/Neg:0", shape=(), dtype=float32)' cannot be accessed here: it is defined in another function or code block. Use return values, explicit Python locals or TensorFlow collections to access it. Defined in: FuncGraph(name=loss_fn_while_body_3814, id=2579287922312); accessed from: FuncGraph(name=train_function, id=2579286968840).