我正在尝试在keras中构建自定义丢失函数。不幸的是,我对张量流很少了解。有没有办法我可以将传入的张量转换成一个numpy数组,这样我就可以计算我的损失函数了?
这是我的功能:
def getBalance(x_true, x_pred):
x_true = np.round(x_true)
x_pred = np.round(x_pred)
NumberOfBars = len(x_true)
NumberOfHours = NumberOfBars/60
TradeIndex = np.where( x_pred[:,1] == 0 )[0]
##remove predictions that are not tradable
x_true = np.delete(x_true[:,0], TradeIndex)
x_pred = np.delete(x_pred[:,0], TradeIndex)
CM = confusion_matrix(x_true, x_pred)
correctPredictions = CM[0,0]+CM[1,1]
wrongPredictions = CM[1,0]+CM[0,1]
TotalTrades = correctPredictions+wrongPredictions
Accuracy = (correctPredictions/TotalTrades)*100
return Accuracy
如果不能使用numpy数组,使用tensorflow计算该函数的最佳方法是什么?任何方向都将不胜感激,谢谢!
编辑1: 以下是我的模型的一些细节。我正在使用LSTM网络,辍学率很高。输入是多变量多时间步骤。 输出是二进制数字的二维数组(20000,2)
model = Sequential()
model.add(Dropout(0.4, input_shape=(train_input_data_NN.shape[1], train_input_data_NN.shape[2])))
model.add(LSTM(30, dropout=0.4, recurrent_dropout=0.4))
model.add(Dense(2))
model.compile(loss='getBalance', optimizer='adam')
history = model.fit(train_input_data_NN, outputs_NN, epochs=50, batch_size=64, verbose=1, validation_data=(test_input_data_NN, outputs_NN_test))
答案 0 :(得分:1)
(冒充了变量名称的规范化)
def get_balance(x_true, x_pred):
x_true = K.tf.round(x_true)
x_pred = K.tf.round(x_pred)
# didnt see the need for these
# NumberOfBars = (x_true)
# NumberOfHours = NumberOfBars/60
trade_index = K.tf.not_equal(x_pred[:,1], 0 )
##remove predictions that are not tradable
x_true_tradeable = K.tf.boolean_mask(x_true[:,0], trade_index)
x_pred_tradeable = K.tf.boolean_mask(x_pred[:,0], trade_index)
cm = K.tf.confusion_matrix(x_true_tradeable, x_pred_tradeable)
correct_predictions = cm[0,0]+cm[1,1]
wrong_predictions = cm[1,0]+cm[0,1]
total_trades = correction_predictions + wrong_predictions
accuracy = (correct_predictions/total_trades)*100
return accuracy
欢迎来到SO。您可能知道我们需要计算损失函数的梯度。我们无法在numpy数组上正确计算梯度(它们只是常量)。
做了什么(在keras / theano中使用keras的后端)是Tensors上的自动区分(例如tf.placeholder()
)。这不是整个故事,但你现在应该知道的是tf / theano默认为tf.max
,tf.sum
等运算符提供渐变。
这对您来说意味着张量上的所有操作(y_true
和y_pred
)都应该被重写以使用tf / theano运算符。
我会评论我认为会被重写的内容,您可以相应地替换并进行测试。
请参阅用作K.tf.round
的tf.round,其中K是导入的keras后端的引用
import keras.backend as K
x_true = np.round(x_true)
x_pred = np.round(x_pred)
抓取张量x_true的形状。 K.shape。计算一个常数的比率可以保持为 它在这里
NumberOfBars = len(x_true)
NumberOfHours = NumberOfBars/60
请参阅tf.where
用作K.tf.where
TradeIndex = np.where( x_pred[:,1] == 0 )[0]
您可以使用条件屏蔽张量而不是删除 - 请参阅masking
##remove predictions that are not tradable
x_true = np.delete(x_true[:,0], TradeIndex)
x_pred = np.delete(x_pred[:,0], TradeIndex)
请参阅tf.confusion_matrix
CM = confusion_matrix(x_true, x_pred)
接下来的计算是计算过度常数,因此保持基本相同(以。为条件 在给定新API的情况下必须进行的任何更改
希望我可以使用有效的替换来更新此答案。但我希望这是正确的道路。
关于编码风格的建议:我看到你在代码中使用三个版本的变量命名选择一个并坚持下去。