Как настроить функцию потерь с несколькими входами и выходами? - PullRequest
1 голос
/ 17 апреля 2019

Я моделирую простую модель CNN с двумя входными наборами (MNIST и его шумовой версией), а именно x_r и x_p. Соответствующие выходы представлены y_r и y_p. Функция потерь этой модели состоит из трех частей E_R(x_r, y_r), E_P(x_p, y_p) и mse(x_r, x_p). Как я могу написать коды функции потерь с tenorflow или 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_r и lodd_p.

Как я уже сказал, пользовательские потери - это сумма E_R(x_r, y_r), E_P(x_p, y_p) и mse(x_r, x_p), поэтому как мне реализовать функцию потерь, особенно для третьего слагаемого mse(x_r, x_p)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...