如何定制具有多个输入和输出的损失函数?

时间:2019-04-17 08:38:57

标签: python-3.x tensorflow keras loss-function

我正在模拟带有两个输入集(MNIST及其噪声版本)的简单CNN模型,即x_rx_p。相应的输出由y_ry_p表示。该模型的损失函数由E_R(x_r, y_r)E_P(x_p, y_p)mse(x_r, x_p)三个部分组成。我该如何编写带有Tensorflow或Keras的损失函数代码?

CNN模型的结构如下所示。

conv1 = Conv2D(32, (3, 3), padding='same', activation='relu')
maxpool1 = MaxPooling2D(pool_size=(2, 2))
conv2 = Conv2D(64, (3, 3), padding='same', activation='relu')
maxpool2 = MaxPooling2D(pool_size=(2, 2))
flatten = Flatten()
dense1 = Dense(1024, activation='tanh')
dropout = Dropout(0.5)
dense2 = Dense(10, activation='softmax')

我用两个输入来训练模型:MNIST x_r和已处理的MNIST(添加噪声)x_p

X_r = tf.placeholder(tf.float32, shape=(None, 28, 28, 1))
Y_r = tf.placeholder(tf.float32, shape=(None, 10))
X_p = tf.placeholder(tf.float32, shape=(None, 28, 28, 1))
Y_p = tf.placeholder(tf.float32, shape=(None, 10))

conv1_in1 = conv1(X_r)
conv1_in2 = conv1(X_p)
maxpool1_in1 = maxpool1(conv1_in1)
maxpool1_in2 = maxpool1(conv1_in2)
conv2_in1 = conv2(maxpool1_in1)
conv2_in2 = conv2(maxpool1_in2)
maxpool2_in1 = maxpool2(conv2_in1)
maxpool2_in2 = maxpool2(conv2_in2)
flatten_in1 = flatten(maxpool2_in1)
flatten_in2 = flatten(maxpool2_in2)
dense1_in1 = dense1(flatten_in1)
dense1_in2 = dense1(flatten_in2)
dropout_in1 = tf.nn.dropout(dense1_in1, 0.5)
dropout_in2 = tf.nn.dropout(dense1_in2, 0.5)
output1 = dense2(dropout_in1)
output2 = dense2(dropout_in2)

我将损失函数设计为(TODO)

# custom loss
alpha = 1.
beta = 1.
gama = 0.01
loss_r = alpha * tf.reduce_mean(np.sum(Y_r * tf.nn.softmax(output1), -1))
loss_p = beta * tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=output2, labels=Y_p))
loss_d = gama * tf.reduce_mean(tf.square(X_r, X_p))
total_loss = loss_p+loss_p#+loss_d

optimizer = tf.train.MomentumOptimizer(learning_rate=0.1,momentum=0.9).minimize(total_loss)

loss_d已被注释,因为无法与loss_rlodd_p添加。

正如我所说,自定义损失是E_R(x_r, y_r)E_P(x_p, y_p)mse(x_r, x_p)的总和,所以我应该如何实现损失函数,尤其是对于第三项{{1} }?

0 个答案:

没有答案
相关问题