在 Keras 中编写自定义 MSE 损失函数
Write a custom MSE loss function in Keras
我正在尝试在 Keras 中创建图像去噪 ConvNet,并且我想创建自己的损失函数。我希望它以嘈杂的图像作为输入并将噪声作为输出。此损失函数非常类似于 MSE 损失,但它将使我的网络学会去除干净图像而不是输入噪声图像中的噪声。
我想用噪声图像 y、干净图像 x 和预测图像 R(y) 实现的损失函数:
我试着自己制作它,但我不知道如何让损失访问我的嘈杂图像,因为它一直在变化。
def residual_loss(noisy_img):
def loss(y_true, y_pred):
return np.mean(np.square(y_pred - (noisy_img - y_true), axis=-1)
return loss
基本上,我需要做的是这样的:
input_img = Input(shape=(None,None,3))
c1 = Convolution2D(64, (3, 3))(input_img)
a1 = Activation('relu')(c1)
c2 = Convolution2D(64, (3, 3))(a1)
a2 = Activation('relu')(c2)
c3 = Convolution2D(64, (3, 3))(a2)
a3 = Activation('relu')(c3)
c4 = Convolution2D(64, (3, 3))(a3)
a4 = Activation('relu')(c4)
c5 = Convolution2D(3, (3, 3))(a4)
out = Activation('relu')(c5)
model = Model(input_img, out)
model.compile(optimizer='adam', loss=residual_loss(input_img))
但是如果我尝试这个,我得到:
IndexError: tuple index out of range
我能做什么?
由于在损失函数中使用"input"是很不寻常的(它不是那个意思),我认为值得一提的是:
分离噪声不是损失函数的作用。
损失函数只是"how far from right you are"的度量。
你的模型会把东西分开,你期望从你的模型中得到的结果是y_true
。
你应该使用常规损失,X_training = noisy images
和 Y_training = noises
。
也就是说...
您可以在损失函数之外为 noisy_img
创建一个 tensor 并保存它。损失函数内的所有操作都必须是张量函数,因此使用 keras backend:
import keras.backend as K
noisy_img = K.variable(X_training) #you must do this for each bach
但是你必须考虑批次大小,这个在损失函数之外的变量将需要你只适合 每个时期一个批次。
def loss(y_true,y_pred):
return K.mean(K.square(y_pred-y_true) - K.square(y_true-noisy_img))
每个时期训练一批:
for batch in range(0,totalSamples,size):
noisy_img = K.variable(X_training[batch:size])
model.fit(X_training[batch:size],Y_training[batch:size], batch_size=size)
如果仅使用均方误差,请按如下方式组织数据:
originalImages = loadYourImages() #without noises
Y_training = createRandomNoises() #without images
X_training = addNoiseToImages(originalImages,Y_training)
现在您只需使用 "mse" 或任何其他内置损失。
model.fit(X_training,Y_training,....)
我正在尝试在 Keras 中创建图像去噪 ConvNet,并且我想创建自己的损失函数。我希望它以嘈杂的图像作为输入并将噪声作为输出。此损失函数非常类似于 MSE 损失,但它将使我的网络学会去除干净图像而不是输入噪声图像中的噪声。
我想用噪声图像 y、干净图像 x 和预测图像 R(y) 实现的损失函数:
我试着自己制作它,但我不知道如何让损失访问我的嘈杂图像,因为它一直在变化。
def residual_loss(noisy_img):
def loss(y_true, y_pred):
return np.mean(np.square(y_pred - (noisy_img - y_true), axis=-1)
return loss
基本上,我需要做的是这样的:
input_img = Input(shape=(None,None,3))
c1 = Convolution2D(64, (3, 3))(input_img)
a1 = Activation('relu')(c1)
c2 = Convolution2D(64, (3, 3))(a1)
a2 = Activation('relu')(c2)
c3 = Convolution2D(64, (3, 3))(a2)
a3 = Activation('relu')(c3)
c4 = Convolution2D(64, (3, 3))(a3)
a4 = Activation('relu')(c4)
c5 = Convolution2D(3, (3, 3))(a4)
out = Activation('relu')(c5)
model = Model(input_img, out)
model.compile(optimizer='adam', loss=residual_loss(input_img))
但是如果我尝试这个,我得到:
IndexError: tuple index out of range
我能做什么?
由于在损失函数中使用"input"是很不寻常的(它不是那个意思),我认为值得一提的是:
分离噪声不是损失函数的作用。 损失函数只是"how far from right you are"的度量。
你的模型会把东西分开,你期望从你的模型中得到的结果是y_true
。
你应该使用常规损失,X_training = noisy images
和 Y_training = noises
。
也就是说...
您可以在损失函数之外为 noisy_img
创建一个 tensor 并保存它。损失函数内的所有操作都必须是张量函数,因此使用 keras backend:
import keras.backend as K
noisy_img = K.variable(X_training) #you must do this for each bach
但是你必须考虑批次大小,这个在损失函数之外的变量将需要你只适合 每个时期一个批次。
def loss(y_true,y_pred):
return K.mean(K.square(y_pred-y_true) - K.square(y_true-noisy_img))
每个时期训练一批:
for batch in range(0,totalSamples,size):
noisy_img = K.variable(X_training[batch:size])
model.fit(X_training[batch:size],Y_training[batch:size], batch_size=size)
如果仅使用均方误差,请按如下方式组织数据:
originalImages = loadYourImages() #without noises
Y_training = createRandomNoises() #without images
X_training = addNoiseToImages(originalImages,Y_training)
现在您只需使用 "mse" 或任何其他内置损失。
model.fit(X_training,Y_training,....)