张量流输入形状问题中的保真度自定义损失函数

2024-10-02 14:30:45 发布

您现在位置:Python中文网/ 问答频道 /正文

作为多目标基本神经网络(GRU)的一部分,我对自定义损失函数的输入有困难。你知道吗

我有一个多目标函数,它将一个扁平的(,16)形状(4x4)矩阵(“输入矩阵”)作为输入,并使用“mse”损失生成一个由10个4x4矩阵(通过扁平的输出形状(,160)表示)组成的序列,作为第一个目标。模型的这一部分以data.lab作为训练数据,以inputreshape作为标签数据,可以很好地工作。但是,作为第二个目标,我需要将这个(,160)张量转换为(10,4,4)张量(重塑为10个4x4矩阵),然后将它们组合在一起,得到一个(4,4)矩阵“输出矩阵”(通过productlayer自定义层完成)。然后需要将这个输出矩阵输入到一个函数中,通过与data.lab的原始输入进行比较,通过自定义损失函数“fidelity2”来计算“保真度”。我通过第二次输入data.lab实现了这一点,但现在作为一个标签。然而(1)型号.概要()似乎显示productlayer的输出是(4,4),而我认为它应该是(None,4,4)和(2)我收到错误:

InvalidArgumentError: In[0] is not a matrix. Instead it has shape [10,4,4] [[{{node loss_7/fidout_loss/ArithmeticOptimizer/FoldTransposeIntoMatMul_matmul}}]]

custom loss函数中的y\u true似乎从型号.fit(请参阅下面的代码),而不是批处理,因此这意味着它将转储中设置的(10,4,4)标签,但试图与(4,4)y\u pred进行比较。不确定如何解决这个问题。代码如下。最终我需要能够计算保真度-实际上最终不忠-以这种方式为任意批量大小(我在型号.fit为了让它工作)。感谢您的建议。你知道吗

def fidelity2(y_true, y_pred):
    y_truetp = tf.transpose(y_true)
    t1 = (y_truetp @ y_pred)
    tr = tf.trace(t1)
    mxdim = tf.cast(tf.shape(y_pred)[0], tf.float32)
    fidelity = (tf.abs((tr)** 2) / mxdim ** 2)
    return fidelity    



x = layers.Input(shape=(data.realdim,data.realdim), name='input1', batch_size=None)
x1 = layers.GRU(data.Uj_dim, return_sequences=True)(x)
x1 = layers.Dropout(rate=0.2)(x1)
x1 = layers.GRU(data.Uj_dim, return_sequences=True)(x1)
x1 = layers.Dropout(rate=0.2)(x1)
x1 = layers.GRU(data.Uj_dim, return_sequences=True)(x1)
x1 = layers.Flatten()(x1)
y = layers.Dense(160, activation='relu', name='output_data')(x1)
xreshape = layers.Reshape((4,4))(x)
y2 = productlayer(trainable = True, name="fidout")(x1)
model = tf.keras.models.Model(inputs=x, outputs=[y,y2])



batchsz = 1
#===============
model.compile(optimizer='adam', loss=['mse',fidelity2], metrics=['mse',fidelity2])
model.summary()

model.fit(data.lab, [inputreshape,data.lab], epochs=2, batch_size=batchsz, validation_split = 0, shuffle=False, steps_per_epoch=1)

#==============```

Model: "model_13"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input1 (InputLayer)             [(None, 4, 4)]       0                                            
__________________________________________________________________________________________________
gru_39 (GRU)                    (None, 4, 40)        5400        input1[0][0]                     
__________________________________________________________________________________________________
dropout_26 (Dropout)            (None, 4, 40)        0           gru_39[0][0]                     
__________________________________________________________________________________________________
gru_40 (GRU)                    (None, 4, 40)        9720        dropout_26[0][0]                 
__________________________________________________________________________________________________
dropout_27 (Dropout)            (None, 4, 40)        0           gru_40[0][0]                     
__________________________________________________________________________________________________
gru_41 (GRU)                    (None, 4, 40)        9720        dropout_27[0][0]                 
__________________________________________________________________________________________________
flatten_13 (Flatten)            (None, 160)          0           gru_41[0][0]                     
__________________________________________________________________________________________________
output_data (Dense)             (None, 160)          25760       flatten_13[0][0]                 
__________________________________________________________________________________________________
fidout (productlayer)           (4, 4)               0           flatten_13[0][0]                 
==================================================================================================
Total params: 50,600
Trainable params: 50,600
Non-trainable params: 0
__________________________________________________________________________________________________
Epoch 1/2
---------------------------------------------------------------------------
InvalidArgumentError...InvalidArgumentError: In[0] is not a matrix. Instead it has shape [10,4,4]
     [[{{node loss_7/fidout_loss/ArithmeticOptimizer/FoldTransposeIntoMatMul_matmul}}]]

Tags: 函数none目标datamodellayerstflab