Подтвердить что ты не робот

Как итерации через тензоры в пользовательской функции потери?

Я использую кераты с бэкэндом тензорным потоком. Моя цель - запросить batchsize текущего пакета в функции пользовательской потери. Это необходимо для вычисления значений пользовательских функций потерь, которые зависят от индекса конкретных наблюдений. Я хотел бы прояснить это, учитывая приведенные ниже минимальные воспроизводимые примеры.

(Кстати: конечно, я мог бы использовать размер партии, определенный для процедуры обучения, и указать его значение при определении пользовательской функции потерь, но есть несколько причин, по которым это может изменяться, особенно если epochsize % batchsize (epochsize modulo batchsize) равен неравному нулю), тогда последняя партия эпохи имеет другой размер. Я не нашел подходящего подхода в stackoverflow, особенно, например, Индексирование тензорных функций в пользовательской функции потерь и Пользовательская функция потерь Tensorflow в Keras - цикл по тензорному элементу и Цикл по тензорному элементу, поскольку очевидно, что форма любого тензорного элемента не может выводить при построении графика, который имеет место для функции потерь - вывод формы возможен только при оценке данных, что возможно только при графике. Следовательно, мне нужно сказать пользовательской функции потерь, что нужно что-то делать с определенными элементами вдоль определенного измерения, не зная длины измерения.

(это одинаково во всех примерах)

from keras.models import Sequential
from keras.layers import Dense, Activation

# Generate dummy data
import numpy as np
data = np.random.random((1000, 100))
labels = np.random.randint(2, size=(1000, 1))

model = Sequential()
model.add(Dense(32, activation='relu', input_dim=100))
model.add(Dense(1, activation='sigmoid'))

пример 1: ничего особенного без проблем, без пользовательских потерь

model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy'])    

# Train the model, iterating on the data in batches of 32 samples
model.fit(data, labels, epochs=10, batch_size=32)

(вывод опущен, все работает отлично)

пример 2: ничего особенного, с довольно простой кастомной потерей

def custom_loss(yTrue, yPred):
    loss = np.abs(yTrue-yPred)
    return loss

model.compile(optimizer='rmsprop',
              loss=custom_loss,
              metrics=['accuracy'])

# Train the model, iterating on the data in batches of 32 samples
model.fit(data, labels, epochs=10, batch_size=32)

(вывод опущен, все работает отлично)

пример 3: проблема

def custom_loss(yTrue, yPred):
    print(yPred) # Output: Tensor("dense_2/Sigmoid:0", shape=(?, 1), dtype=float32)
    n = yPred.shape[0]
    for i in range(n): # TypeError: __index__ returned non-int (type NoneType)
        loss = np.abs(yTrue[i]-yPred[int(i/2)])
    return loss

model.compile(optimizer='rmsprop',
              loss=custom_loss,
              metrics=['accuracy'])

# Train the model, iterating on the data in batches of 32 samples
model.fit(data, labels, epochs=10, batch_size=32)

Конечно, тензор еще не имеет информации о форме, которую нельзя вывести при построении графика, только во время обучения. Следовательно, for i in range(n) вызывает ошибку. Есть ли способ сделать это?

Трассировка вывода: enter image description here

-------

Кстати, моя настоящая функция потери на случай возникновения каких-либо вопросов. Я пропустил это выше для ясности и простоты.

def neg_log_likelihood(yTrue,yPred):
    yStatus = yTrue[:,0]
    yTime = yTrue[:,1]    
    n = yTrue.shape[0]    
    for i in range(n):
        s1 = K.greater_equal(yTime, yTime[i])
        s2 = K.exp(yPred[s1])
        s3 = K.sum(s2)
        logsum = K.log(y3)
        loss = K.sum(yStatus[i] * yPred[i] - logsum)
    return loss

Здесь изображение частичного отрицательного логарифмического правдоподобия модели пропорционального Гарсона Кокса.

enter image description here

Это должно уточнить вопрос в комментариях, чтобы избежать путаницы. Я не думаю, что это необходимо понимать подробно, чтобы ответить на вопрос.

4b9b3361