我有一个具有多个标签的数据集,我想定义取决于标签的损失。数据集中的标签存储为字典,例如:
y = tf.data.Dataset.from_tensor_slices({'values': [1, 2, 3], 'symbols': [4, 5, 6]})
然后我想为每个标签定义一个损失,以便稍后对损失进行某种组合。我尝试这样定义损失:
def model_loss(y, y_):
return tf.losses.SparseCategoricalCrossentropy(from_logits=False, name='values_xent')(y['values'], y_)
然而,当我拟合模型时,它给了我以下错误:
TypeError: Only integers, slices (`:`), ellipsis (`...`), tf.newaxis (`None`) and scalar tf.int32/tf.int64 tensors are valid indices, got 'values'
所以看来我不能这样做y['values']。我怎样才能在损失中获取这个值?提前致谢。
编辑
我想要实现的是这样的:
import tensorflow as tf
import numpy as np
# samples
ds_x = tf.data.Dataset.from_tensor_slices(np.random.randn(5, 5))
# labels
ds_y = tf.data.Dataset.from_tensor_slices({'l1': np.arange(5), 'l2':np.arange(5)})
# samples + labels
ds = tf.data.Dataset.zip((ds_x, ds_y))
# model
input_ = tf.keras.Input(shape=(5,))
x = tf.keras.layers.Dense(30, activation='relu')(input_)
x1 = tf.keras.layers.Dense(5, activation='softmax')(x)
x2 = tf.keras.layers.Dense(5, activation='softmax')(x)
model = tf.keras.Model(inputs=input_, outputs={'l1':x1, 'l2':x2})
# loss
def model_loss(y, y_):
res = 3 * tf.losses.SparseCategoricalCrossentropy()(y['l1'], y_['l1'])
res += tf.losses.SparseCategoricalCrossentropy()(y['l2'], y_['l2'])
return res
# compile and train
model.compile(optimizer='adam', loss=model_loss)
model.fit(ds.batch(5), epochs=5)
ABOUTYOU
相关分类