第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何在 Tensorflow / Keras 中為具有字典形式的多個(gè)標(biāo)簽的數(shù)據(jù)集定義損失?

如何在 Tensorflow / Keras 中為具有字典形式的多個(gè)標(biāo)簽的數(shù)據(jù)集定義損失?

慕容3067478 2023-10-18 15:22:41
我有一個(gè)具有多個(gè)標(biāo)簽的數(shù)據(jù)集,我想定義取決于標(biāo)簽的損失。數(shù)據(jù)集中的標(biāo)簽存儲(chǔ)為字典,例如:y = tf.data.Dataset.from_tensor_slices({'values': [1, 2, 3], 'symbols': [4, 5, 6]})然后我想為每個(gè)標(biāo)簽定義一個(gè)損失,以便稍后對(duì)損失進(jìn)行某種組合。我嘗試這樣定義損失:def model_loss(y, y_):    return tf.losses.SparseCategoricalCrossentropy(from_logits=False, name='values_xent')(y['values'], y_)然而,當(dāng)我擬合模型時(shí),它給了我以下錯(cuò)誤:TypeError: Only integers, slices (`:`), ellipsis (`...`), tf.newaxis (`None`) and scalar tf.int32/tf.int64 tensors are valid indices, got 'values'所以看來我不能這樣做y['values']。我怎樣才能在損失中獲取這個(gè)值?提前致謝。編輯我想要實(shí)現(xiàn)的是這樣的:import tensorflow as tfimport numpy as np# samplesds_x = tf.data.Dataset.from_tensor_slices(np.random.randn(5, 5))# labelsds_y = tf.data.Dataset.from_tensor_slices({'l1': np.arange(5), 'l2':np.arange(5)})# samples + labelsds = tf.data.Dataset.zip((ds_x, ds_y))# modelinput_ = 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})# lossdef 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 trainmodel.compile(optimizer='adam', loss=model_loss)model.fit(ds.batch(5), epochs=5)
查看完整描述

1 回答

?
ABOUTYOU

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊

一旦你做了一些對(duì) Keras 來說不完全正常的事情,我建議使用自定義訓(xùn)練循環(huán)。然后您可以控制訓(xùn)練過程的每一步。

我這樣做了,我不需要改變你的損失函數(shù)。

import tensorflow as tf

import numpy as np


ds_x = tf.data.Dataset.from_tensor_slices(np.random.randn(5, 5).astype(np.float32))


ds_y = tf.data.Dataset.from_tensor_slices({'l1': np.arange(5), 'l2':np.arange(5)})


ds = tf.data.Dataset.zip((ds_x, ds_y)).batch(2)


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})


def model_loss(y, y_):

? ? res = 3 * tf.losses.SparseCategoricalCrossentropy()(y['l1'], y_['l1'])

? ? res += tf.losses.SparseCategoricalCrossentropy()(y['l2'], y_['l2'])

? ? return res


train_loss = tf.keras.metrics.Mean()

optimizer = tf.keras.optimizers.Adam()


for i in range(25):

? ? for x, y in ds:

? ? ? ? with tf.GradientTape() as tape:

? ? ? ? ? ? out = model(x)

? ? ? ? ? ? loss = model_loss(y, out)

? ? ? ? ? ??

? ? ? ? gradients = tape.gradient(loss, model.trainable_variables)

? ? ? ? optimizer.apply_gradients(zip(gradients, model.trainable_variables))

? ? ? ? train_loss(loss)

? ? print(f'Epoch {i} Loss: {train_loss.result():=4.4f}')

? ? train_loss.reset_states()

Epoch 0 Loss: 6.4170

Epoch 1 Loss: 6.3396

Epoch 2 Loss: 6.2737

Epoch 11 Loss: 5.7191

Epoch 12 Loss: 5.6608

Epoch 19 Loss: 5.2646

Epoch 24 Loss: 4.9896


查看完整回答
反對(duì) 回復(fù) 2023-10-18
  • 1 回答
  • 0 關(guān)注
  • 200 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)