我正在使用Keras和Tensorflow后端函数在Keras中编写一个自定义损失函数。我想最小化f(y_真)和f(y_pred)之间的均方误差,其中f(y)是一个非线性函数
f(y)=[f1(y)f2(y)…f12(y)],和fk(y)=Xi_k*Theta_k(y),k=1,2,…,12。Xi_k和Theta_k(y)是秩1的张量
由于y_true和y_pred的大小是(batchSize x 15),我需要为训练批中的所有样本计算循环上的f(y)值(我认为避免循环是不可能的)。循环操作的输出将是大小为(batchSize x 12)的张量
[[f(y_true[1,:])],[f(y_true[2,:])],...,[f(y_true[batchSize,:])]]
及
[[f(y_pred[1,:])],[f(y_pred[2,:])],...,[f(y_pred[batchSize,:])]]
通常,在处理数组或矩阵时,我们初始化所需大小的矩阵并在循环中为其赋值,或者创建一个空矩阵并在循环中向其追加值。但我们如何用张量做同样的事情呢
下面是自定义损失函数的简化形式(仅计算f1(y_true)和f1(y_pred))。初始化和附加函数不起作用,因为它们不是tf/Keras操作,我应该用什么来代替它们,使其与张量一起工作
matd = spio.loadmat('LPVmodel_iVarDeg.mat', squeeze_me=True)
mate = spio.loadmat('PNLSS_model_modified.mat', squeeze_me=True)
def custom_loss_fn(y_true, y_pred):
iVarDeg1 = tf.convert_to_tensor(matd['iVarDeg1'], dtype=tf.float32) # (XiSize(1) x 15)
Xi1 = tf.convert_to_tensor(mate['Xim1'], dtype=tf.float32) # (XiSize(1) x 1)
batchSize = m
fy_true = [] # initialization
fy_pred = [] # initialization
for i in range(batchSize):
yin = y_true[i,:] # (1 x 15) network output
tin = y_pred[i,:] # (1 x 15) target
ypowerD = tf.math.pow(yin,iVarDeg1) # element wise power (XiSize(1)x15)
monomial = tf.math.reduce_prod(ypowerD) # column wise product of elements (XiSize(1)x1)
Theta1 = monomial # nonlinear basis for state eq 1 (XiSize(1)x1)
ypowerD = tf.math.pow(tin,iVarDeg1)
monomial = tf.math.reduce_prod(ypowerD)
Gamma1 = monomial
temp = tf.math.reduce_sum(tf.math.multiply(Xi1,Theta1)) # sum(element wise prod)
fy_true.append(temp)
temp = tf.math.reduce_sum(tf.math.multiply(Xi1,Gamma1))
fy_pred.append(temp)
return Kb.mean(Kb.sum(Kb.square(fy_pred - fy_true))
在图形模式下,如果要在循环(如列表)中填充张量,可以使用TensorArray:
“初始化”,例如:
“附加”到:
要将TensorArray转换为tensor,请执行以下操作:
相关问题 更多 >
编程相关推荐