У меня проблема с потерей модели keras, которую я действительно не знаю, откуда она взялась. Подводя итог, если я добавлю следующий термин к потере:
k.sum (k.square (hist (y_true) - hist (y_pred)))
Тогда я получаю ошибку : «Входной arr должен быть неотрицательным!»
Версия keras - 2.2.4, а версия TensorFlow - 1.15.0. Я использую Python 3.6.9 Модель keras выглядит следующим образом:
Слой (тип) Форма выхода Параметр #
input_1 (InputLayer) (Нет, 256, 256, 8) 0
down_conv_1 (Conv2D) (Нет, 256, 256, 16) 4624
down_pool_1 (MaxPooling2D) (Нет, 64, 64, 16) 0
down_conv_2 (Conv2D) (Нет, 64, 64, 32) 73760
down_pool_2 (MaxPooling2D) (Нет, 16, 16, 32) 0
down_conv_3 (Conv2D) (Нет, 16, 16, 64) 73792
down_pool_3 (MaxPooling2D) (Нет, 4, 4, 64) 0
down_conv_4 (Conv2D) (Нет, 4, 4, 128) 8320
код (MaxPooling2D) (Нет, 1, 1, 128) 0
up_conv_1 (Conv2DTranspose) (Нет, 2, 2, 1024) 18875392
up_batchnorm_1 (BatchNormali (Нет, 2, 2, 1024) 4096
up_conv_2 (Conv2DTranspose) (Нет, 4, 4, 512) 75497984
up_batchnorm_2 (BatchNormali (Нет, 4, 4, 512) 2048
up_conv_3 (Conv2DTranspose) (Нет, 8, 8, 256) 4718848
up_batchnorm_3 (BatchNormali (Нет, 8, 8, 256) 1024
up_conv_4 ( Conv2DTranspose) (Нет, 16, 16, 128) 1179776
up_batchnorm_4 (BatchNormali (Нет, 16, 16, 128) 512
up_conv_5 (Conv2DTranspose) (Нет, 32, 32, 64) 73792
up_batchnorm_5 (BatchNormali (Нет, 32, 32, 64) 256
up_conv_6 (Conv2DTranspose) (Нет, 64, 64, 32 ) 18464
up_batchnorm_6 (BatchNormali (Нет, 64, 64, 32) 128
up_conv_7 (Conv2DTranspose) (Нет, 128, 128, 16) 4624
up_batchnorm_7 (BatchNormali (Нет, 128, 128, 16) 64
up_conv_8 (Conv2DTranspose) (Нет, 256, 256, 8) 1160
up_batchnorm_8 (BatchNormali (Нет, 256, 256, 8) 32
Всего параметров: 100 538 696 Обучаемых параметров: 100 534 616 Необучаемых параметров: 4 080
Я настраиваю его следующим образом ows:
custom_adam = optimizers.Adam(0.25, beta_1=0.9, beta_2=0.999, amsgrad=False)
autoencoder.compile(optimizer=custom_adam, loss=cl.my_loss, metrics = ['accuracy'])
Где cl.my_loss описывается в другом файле как:
from keras import backend as k
from keras import regularizers, optimizers
from keras.layers import Input, BatchNormalization, UpSampling2D, Dense, Flatten, Reshape
from keras.layers.convolutional import Conv2D, Conv2DTranspose
from keras.layers.pooling import MaxPooling2D
from keras.models import Model
from keras.losses import mean_squared_error as MSE
from tensorflow.spectral import rfft2d
import tensorflow as tf
import tensorflow_probability as tfp
def hist(tensor):
"""
Calculates the histogram of the image tensor
:param tensor: image tensor
:return: histogram tensor with as many channels as the image. Each channel
is a 1D vector with the same size as the edges vector
"""
edges = tf.range(0., 1000., 50.)
return tfp.stats.histogram(tensor, edges, axis=[0, 1], extend_upper_interval=True)
def MSE_hist(y_true, y_pred):
"""
mean squared error btw the histograms of the true and the predicted images
"""
return MSE(hist(y_true), hist(y_pred))
def fft_bw_image(img):
"""
Calculates the 2D Fourier Transform of a one channel image tensor
:param img: 2D tensor
"""
f = tf.spectral.rfft2d(img)
f_abs = tf.math.abs(f)
split0, split1 = tf.split(f_abs, [1, 1], axis=0)
return split0
def my_loss(y_true, y_pred):
"""
Define a custom loss function with a MSE term, a Fourier transform term a
histogram term
:param y_true: ground truth
:param y_pred: predicted tensor
"""
mse = MSE(y_true, y_pred)
fft = MSE_fft(y_true, y_pred)
hist = MSE_hist(y_true, y_pred)
#Calculate orders of magnitude
o_hist = k.max(k.max(y_true))*256*256*8
o_MSE = k.mean(y_true)
o_fft = k.max(tf.math.abs(rfft2d(y_true)))
return mse/o_MSE + 0.3*fft/o_fft + 1e-15*hist/o_hist
и полный вывод history = model.fit(np.array(data), np.array(data), epochs=5000)
, где данные представляют собой список из 4 изображений 256x256x8 :
ncount_op. cc: 111: Неверный аргумент: входной аргумент должен быть неотрицательным!
2020-01-07 19: 57: 37.436533: W tenorflow / core / framework / op_kernel. cc: 1651] Ошибка OP_REQUIRES при bincount_op. cc: 111: Неверный аргумент: входной аргумент должен быть неотрицательным!
2020-01-07 19: 57: 37.436605: W tenorflow / core / framework / op_kernel. cc: 1651] Ошибка OP_REQUIRES при bincount_op. cc: 111: Недопустимый аргумент: входной аргумент должен быть неотрицательным!
Трассировка (последний вызов был последним):
Файл "main.py", строка 30, в
history = model.fit (np.array (данные), np.array (данные), эпох = 5000)
Файл "/ opt / anaconda3 / envs / ML / lib / python3. 6 / site-packages / keras / engine / training.py ", строка 1039, в подгонке
validation_steps = validation_steps)
Файл" /opt/anaconda3/envs/ML/lib/python3.6/site -packages / keras / двигатель / training_ arrays.py ", строка 199, в fit_l oop
outs = f (ins_batch)
Файл" / opt / anaconda3 / envs / ML / lib / python3. 6 / site-packages / keras / backend / tenorflow_backend.py ", строка 2715, в вызов
возврат self._call (входные данные)
файл" / opt / anaconda3 / envs / ML / lib / python3 .6 / site-packages / keras / backend / tenorflow_backend.py ", строка 2675, в _call
fetched = self._callable_fn (* array_vals)
файл" / opt / anaconda3 / envs / ML / lib / python3 .6 / site-packages / tenorflow_core / python / client / session.py ", строка 1472, в call run_metadata_ptr)
тензор потока. python .framework.errors_impl .InvalidArgumentError: Входной arr должен быть неотрицательным! [[{{Потеря узла / up_batchnorm_8_loss / гистограмма / count_integers / map / while / bincount / Bincount}}]]
Заранее большое спасибо за любые помощь, которую вы могли бы предоставить с вашими комментариями