Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Tensorflow Keras API中使用成对的数据集样本创建联合损失?_Tensorflow_Keras_Autoencoder_Loss_Custom Training - Fatal编程技术网

如何在Tensorflow Keras API中使用成对的数据集样本创建联合损失?

如何在Tensorflow Keras API中使用成对的数据集样本创建联合损失?,tensorflow,keras,autoencoder,loss,custom-training,Tensorflow,Keras,Autoencoder,Loss,Custom Training,我正在尝试训练一个自动编码器,约束条件迫使一个或多个隐藏/编码的节点/神经元具有可解释的值。我的训练方法使用成对图像(尽管训练后模型应在单个图像上运行),并使用联合损失函数,该函数包括(1)每个图像的重建损失和(2)两个图像中每个图像的隐藏/编码向量值之间的比较 我创建了一个类似的简单玩具问题和模型,以使这一点更清楚。在玩具问题中,给自动编码器一个长度为3的向量作为输入。编码使用一个密集层来计算平均值(标量),另一个密集层来计算向量的其他表示形式(根据我的构造,它可能只学习一个单位矩阵,即复制输

我正在尝试训练一个自动编码器,约束条件迫使一个或多个隐藏/编码的节点/神经元具有可解释的值。我的训练方法使用成对图像(尽管训练后模型应在单个图像上运行),并使用联合损失函数,该函数包括(1)每个图像的重建损失和(2)两个图像中每个图像的隐藏/编码向量值之间的比较

我创建了一个类似的简单玩具问题和模型,以使这一点更清楚。在玩具问题中,给自动编码器一个长度为3的向量作为输入。编码使用一个密集层来计算平均值(标量),另一个密集层来计算向量的其他表示形式(根据我的构造,它可能只学习一个单位矩阵,即复制输入向量)。请参见下图。隐藏层的最低节点用于计算输入向量的平均值。除了必须适应与输入匹配的重建之外,其余隐藏节点不受约束

下图展示了我希望如何使用成对图像训练模型。“MSE”是均方误差,尽管实际函数的身份对于我这里要问的问题并不重要。损失函数是重建损失和平均估计损失之和

我尝试创建(1)一个tf.data.Dataset来生成成对向量,(2)一个Keras模型,以及(3)一个自定义损失函数。然而,我无法理解如何在这种特殊情况下正确地执行此操作

我无法使Model.fit()正确运行,无法按预期将模型输出与数据集目标关联。请参阅下面的代码和错误。有人能帮忙吗?我已经做了很多Google和stackoverflow搜索,但仍然不知道如何实现这一点。

将tensorflow导入为tf
导入操作系统
操作系统环境['TF\u CPP\u MIN\u LOG\u LEVEL']=“3”
DTYPE=tf.dtypes.float32
N_VEC=3
def my_发生器(n):
尽管如此:
#创建两个长度相同的向量,除非使用不同的方法。
#模型的内部层(单个神经元)应预测
#输入向量的平均值。要训练它这样做,请配对
#矢量输入,使用惩罚错误的损失函数
#两个输入向量平均值之差的预测。
输入向量1=tf.random.normal((n,),dtype=dtype)
目标平均值差异=tf.random.normal((1,),dtype=dtype)
输入向量2=输入向量1+目标均值差值
#模型是一个受约束的自动编码器。产出目标是:
#与输入向量相同。包括它们作为明确的
#此生成器中的目标,用于泛化。
target_vec1=tf.identity(输入_vec1)
目标向量2=tf.identity(输入向量2)
产量({'input_vec1':input_vec1,
“输入向量2”:输入向量2},
{'target_vec1':target_vec1,
“target_vec2”:target_vec2,
'target_mean_diff':target_mean_diff})
定义我的数据集(n,批量大小=4):
ds=tf.data.Dataset.from_生成器(my_生成器,
output_signature=({'input_vec1':tf.TensorSpec(shape=(n,),dtype=dtype),
'input_vec2':tf.TensorSpec(shape=(n,),dtype=dtype)},
{'target_vec1':tf.TensorSpec(shape=(n,),dtype=dtype),
'target_vec2':tf.TensorSpec(shape=(n,),dtype=dtype),
'target_mean_diff':tf.TensorSpec(shape=(1,),dtype=dtype)}),
args=(n,))
ds=ds.批次(批次大小)
返回ds
##使用数据集做一个简短的测试
ds=我的数据集(N\u向量,批量大小=4)
国际热核聚变实验堆=国际热核聚变实验堆(ds)
dict_输入,dict_目标=下一步(ds_iter)
打印(dict_输入)
打印(dict_目标)
##定义模型
layer_encode_vec=tf.keras.layers.density(N_vec,activation=None,name='encode_vec')
layer_decode_vec=tf.keras.layers.densite(N_vec,activation=None,name='decode_vec')
layer_encode_mean=tf.keras.layers.density(1,activation=None,name='encode_mean')
layer_decode_mean=tf.keras.layers.density(N_VEC,activation=None,name='decode_mean')
input1=tf.keras.Input(shape=(N_VEC,),name='Input_vec1')
input2=tf.keras.Input(shape=(N_VEC,),name='Input_vec2')
vec_encoded1=层_encode_vec(输入1)
vec_encoded2=层_encode_vec(输入2)
平均值编码1=层编码平均值(输入1)
平均值编码2=层编码平均值(输入2)
平均值差异=平均值编码2-平均值编码1
pred_vec1=层解码_vec(向量编码1)+层解码_平均值(平均值编码1)
pred_vec2=层解码_vec(vec_encoded2)+层解码_均值(mean_encoded2)
model=tf.keras.model(输入=[input1,input2],输出=[pred_vec1,pred_vec2,mean_diff])
打印(model.summary())
##定义联合损失函数
def损失总计(y_真实值,y_预测值):
损失重构=tf.reduce平均值(tf.keras.MSE(y_真[0],y_pred[0])/2+\
tf.reduce_-mean(tf.keras.MSE(y_-true[1],y_-pred[1])/2
损失平均值=tf.reduce平均值(tf.keras.MSE(y_真[2],y_pred[2]))
收益损失+损失平均值
##编译模型
优化器=tf.keras.optimizers.Adam(lr=0.01)
compile(优化器=优化器,损耗=损耗\总计)
##列车模型
历史=model.fit(x=ds,历元=10,每历元步长=10)
输出:数据集中的批处理示例:

{'input_vec1': <tf.Tensor: shape=(4, 3), dtype=float32, numpy=
array([[-0.53022575, -0.02389329,  0.32843253],
       [-0.61793506, -0.8276422 , -1.3469328 ],
       [-0.5401968 ,  0.3141346 , -1.3638284 ],
       [-1.2189807 ,  0.23848908,  0.75108534]], dtype=float32)>, 'input_vec2': <tf.Tensor: shape=(4, 3), dtype=float32, numpy=
array([[-0.23415083,  0.27218163,  0.6245074 ],
       [-0.57636774, -0.7860749 , -1.3053654 ],
       [ 0.65463066,  1.508962  , -0.16900098],
       [-0.49326736,  0.9642024 ,  1.4767987 ]], dtype=float32)>}
{'target_vec1': <tf.Tensor: shape=(4, 3), dtype=float32, numpy=
array([[-0.53022575, -0.02389329,  0.32843253],
       [-0.61793506, -0.8276422 , -1.3469328 ],
       [-0.5401968 ,  0.3141346 , -1.3638284 ],
       [-1.2189807 ,  0.23848908,  0.75108534]], dtype=float32)>, 'target_vec2': <tf.Tensor: shape=(4, 3), dtype=float32, numpy=
array([[-0.23415083,  0.27218163,  0.6245074 ],
       [-0.57636774, -0.7860749 , -1.3053654 ],
       [ 0.65463066,  1.508962  , -0.16900098],
       [-0.49326736,  0.9642024 ,  1.4767987 ]], dtype=float32)>, 'target_mean_diff': <tf.Tensor: shape=(4, 1), dtype=float32, numpy=
array([[0.29607493],
       [0.04156734],
       [1.1948274 ],
       [0.7257133 ]], dtype=float32)>}
输出:调用model.fit()时的错误消息:


对于
输入
输出
,您可以将
dict
传递到
模型
,如下所示:

model=tf.keras.model(
输入={“输入向量1”:输入向量1,“输入向量2”:输入向量2},
输出={
“目标向量1”:预测向量1,
“目标向量2”:预
Model: "model"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_vec1 (InputLayer)         [(None, 3)]          0                                            
__________________________________________________________________________________________________
input_vec2 (InputLayer)         [(None, 3)]          0                                            
__________________________________________________________________________________________________
encode_vec (Dense)              (None, 3)            12          input_vec1[0][0]                 
                                                                 input_vec2[0][0]                 
__________________________________________________________________________________________________
encode_mean (Dense)             (None, 1)            4           input_vec1[0][0]                 
                                                                 input_vec2[0][0]                 
__________________________________________________________________________________________________
decode_vec (Dense)              (None, 3)            12          encode_vec[0][0]                 
                                                                 encode_vec[1][0]                 
__________________________________________________________________________________________________
decode_mean (Dense)             (None, 3)            6           encode_mean[0][0]                
                                                                 encode_mean[1][0]                
__________________________________________________________________________________________________
tf.__operators__.add (TFOpLambd (None, 3)            0           decode_vec[0][0]                 
                                                                 decode_mean[0][0]                
__________________________________________________________________________________________________
tf.__operators__.add_1 (TFOpLam (None, 3)            0           decode_vec[1][0]                 
                                                                 decode_mean[1][0]                
__________________________________________________________________________________________________
tf.math.subtract (TFOpLambda)   (None, 1)            0           encode_mean[1][0]                
                                                                 encode_mean[0][0]                
==================================================================================================
Total params: 34
Trainable params: 34
Non-trainable params: 0
__________________________________________________________________________________________________
Epoch 1/10
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)

...

ValueError: Found unexpected keys that do not correspond to any
Model output: dict_keys(['target_vec1', 'target_vec2', 'target_mean_diff']).
Expected: ['tf.__operators__.add', 'tf.__operators__.add_1', 'tf.math.subtract']