Я пытаюсь выполнить некоторые периодические вычисления в лямбда-функции keras. Например, учитывая партию нормализованного экземпляра изображения, среднюю партию и стандартную серию 3-цветного канала, я ожидаю, что функция lamda вернет партию исходного изображения (y = x * стандартное значение + среднее).
Код реализован на keras2 и tenorflow1.12. Для простоты включена только соответствующая лямбда-функция.
import tensorflow as tf
import numpy as np
import keras
from keras import backend as K
epsilon = 0.0001
def reverse_from_normal(x): #img, mean, std
return x[0]*(x[2]+epsilon)+x[1]
inputs_img = keras.layers.Input(shape=(64, 64, 3), name='image')
input_std = keras.layers.Input(shape=(3,), name='img_std') #std of 3 color channel
input_mean = keras.layers.Input(shape=(3,), name='img_mean') #mean of 3 color channel
tgt_img = keras.layers.Lambda(function=reverse_from_normal, name='center_img')([inputs_img, input_mean, input_std])
model = keras.models.Model(inputs=[inputs_img, input_std, input_mean], outputs=[tgt_img])
model.summary()
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
image (InputLayer) (None, 64, 64, 3) 0
__________________________________________________________________________________________________
img_mean (InputLayer) (None, 3) 0
__________________________________________________________________________________________________
img_std (InputLayer) (None, 3) 0
__________________________________________________________________________________________________
center_img (Lambda) (None, 64, 64, 3) 0 image[0][0]
img_mean[0][0]
img_std[0][0]
==================================================================================================
Total params: 0
Trainable params: 0
Non-trainable params: 0
__________________________________________________________________________________________________
Код компилируется нормально, но жалуется на несовместимую форму во время выполнения «Несовместимые формы: [2,64,64,3] против [2,3]», где 2 - размер пакета.
Как решить эту проблему? Вот сообщение об ошибке:
2019-06-21 17:50:37.888063: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
2019-06-21 17:50:38.224353: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1432] Found device 0 with properties:
name: Quadro P5000 major: 6 minor: 1 memoryClockRate(GHz): 1.7335
pciBusID: 0000:17:00.0
totalMemory: 16.00GiB freeMemory: 13.38GiB
2019-06-21 17:50:38.341722: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1432] Found device 1 with properties:
name: Quadro P5000 major: 6 minor: 1 memoryClockRate(GHz): 1.7335
pciBusID: 0000:73:00.0
totalMemory: 16.00GiB freeMemory: 13.38GiB
2019-06-21 17:50:38.459872: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1432] Found device 2 with properties:
name: Quadro P5000 major: 6 minor: 1 memoryClockRate(GHz): 1.7335
pciBusID: 0000:a6:00.0
totalMemory: 16.00GiB freeMemory: 13.38GiB
2019-06-21 17:50:38.460542: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1511] Adding visible gpu devices: 0, 1, 2
2019-06-21 17:50:41.130410: I tensorflow/core/common_runtime/gpu/gpu_device.cc:982] Device interconnect StreamExecutor with strength 1 edge matrix:
2019-06-21 17:50:41.130631: I tensorflow/core/common_runtime/gpu/gpu_device.cc:988] 0 1 2
2019-06-21 17:50:41.130755: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1001] 0: N N N
2019-06-21 17:50:41.130879: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1001] 1: N N N
2019-06-21 17:50:41.131002: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1001] 2: N N N
2019-06-21 17:50:41.131446: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 12955 MB memory) -> physical GPU (device: 0, name: Quadro P5000, pci bus id: 0000:17:00.0, compute capability: 6.1)
2019-06-21 17:50:41.133269: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:1 with 12955 MB memory) -> physical GPU (device: 1, name: Quadro P5000, pci bus id: 0000:73:00.0, compute capability: 6.1)
2019-06-21 17:50:41.134416: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:2 with 12955 MB memory) -> physical GPU (device: 2, name: Quadro P5000, pci bus id: 0000:a6:00.0, compute capability: 6.1)
Epoch 1/256
Traceback (most recent call last):
File "D:\app_software\eclipse-cpp-2018-12-R-win32-x86_64\eclipse\plugins\org.python.pydev.core_7.2.1.201904261721\pysrc\pydevd.py", line 2316, in <module>
main()
File "D:\app_software\eclipse-cpp-2018-12-R-win32-x86_64\eclipse\plugins\org.python.pydev.core_7.2.1.201904261721\pysrc\pydevd.py", line 2309, in main
globals = debugger.run(setup['file'], None, None, is_module)
File "D:\app_software\eclipse-cpp-2018-12-R-win32-x86_64\eclipse\plugins\org.python.pydev.core_7.2.1.201904261721\pysrc\pydevd.py", line 1642, in run
return self._exec(is_module, entry_point_fn, module_name, file, globals, locals)
File "D:\app_software\eclipse-cpp-2018-12-R-win32-x86_64\eclipse\plugins\org.python.pydev.core_7.2.1.201904261721\pysrc\pydevd.py", line 1649, in _exec
pydev_imports.execfile(file, globals, locals) # execute the script
File "D:\app_software\eclipse-cpp-2018-12-R-win32-x86_64\eclipse\plugins\org.python.pydev.core_7.2.1.201904261721\pysrc\_pydev_imps\_pydev_execfile.py", line 25, in execfile
exec(compile(contents+"\n", file, 'exec'), glob, loc)
File "D:\eclipse-workspace\datagenerator\keras_script_pymd_a2.py", line 282, in <module>
callbacks=callbacks_list)
File "D:\app_software\Anaconda3\envs\tensorflow1.12\lib\site-packages\keras\legacy\interfaces.py", line 91, in wrapper
return func(*args, **kwargs)
File "D:\app_software\Anaconda3\envs\tensorflow1.12\lib\site-packages\keras\engine\training.py", line 1418, in fit_generator
initial_epoch=initial_epoch)
File "D:\app_software\Anaconda3\envs\tensorflow1.12\lib\site-packages\keras\engine\training_generator.py", line 217, in fit_generator
class_weight=class_weight)
File "D:\app_software\Anaconda3\envs\tensorflow1.12\lib\site-packages\keras\engine\training.py", line 1217, in train_on_batch
outputs = self.train_function(ins)
File "D:\app_software\Anaconda3\envs\tensorflow1.12\lib\site-packages\keras\backend\tensorflow_backend.py", line 2715, in __call__
return self._call(inputs)
File "D:\app_software\Anaconda3\envs\tensorflow1.12\lib\site-packages\keras\backend\tensorflow_backend.py", line 2675, in _call
fetched = self._callable_fn(*array_vals)
File "D:\app_software\Anaconda3\envs\tensorflow1.12\lib\site-packages\tensorflow\python\client\session.py", line 1439, in __call__
run_metadata_ptr)
File "D:\app_software\Anaconda3\envs\tensorflow1.12\lib\site-packages\tensorflow\python\framework\errors_impl.py", line 528, in __exit__
c_api.TF_GetCode(self.status.status))
tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [2,64,64,3] vs. [2,3]
[[{{node replica_0/model_1/center_img/mul}} = Mul[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:GPU:0"](replica_0/lambda_1/Slice, replica_0/model_1/center_img/add)]]
Поскольку у меня пока нет решения, я временно сочиняю стандартное и стандартное значения в одной и той же форме изображения, чтобы обойти проблему.