keras resnet load_model () завершается с ошибкой «ValueError: Shape должен иметь ранг 3, но имеет ранг 4 ...» - PullRequest
0 голосов
/ 02 ноября 2019

Я создал модель ResNet1D с keras-resnet 0.2.0 (python3) и поместил свои данные на многие эпохи без каких-либо проблем, но после сохранения затем просто попытался прочитать модель обратно (через load_model), Я получаю ошибку несоответствия формы тензора:

Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/tensorflow_core/python/framework/ops.py", line 1607, in _create_c_op
    c_op = c_api.TF_FinishOperation(op_desc)
tensorflow.python.framework.errors_impl.InvalidArgumentError: Shape must be rank 3 but is rank 4 for 'padding_conv1_2/Pad' (op: 'Pad') with input shapes: [1,?,30,2], [3,2].

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "/usr/local/lib/python3.6/site-packages/keras/engine/saving.py", line 661, in model_from_json
    return deserialize(config, custom_objects=custom_objects)
  File "/usr/local/lib/python3.6/site-packages/keras/layers/__init__.py", line 168, in deserialize
    printable_module_name='layer')
  File "/usr/local/lib/python3.6/site-packages/keras/utils/generic_utils.py", line 147, in deserialize_keras_object
    list(custom_objects.items())))
  File "/usr/local/lib/python3.6/site-packages/keras/engine/network.py", line 1107, in from_config
    return cls(inputs=input_tensors, outputs=output_tensors, name=name)
  File "/usr/local/lib/python3.6/site-packages/keras_resnet/models/_1d.py", line 184, in __init__
    **kwargs
  File "/usr/local/lib/python3.6/site-packages/keras_resnet/models/_1d.py", line 82, in __init__
    x = keras.layers.ZeroPadding1D(padding=3, name="padding_conv1")(inputs)
  File "/usr/local/lib/python3.6/site-packages/keras/engine/base_layer.py", line 489, in __call__
    output = self.call(inputs, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/keras/layers/convolutional.py", line 2151, in call
    return K.temporal_padding(inputs, padding=self.padding[0])
  File "/usr/local/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py", line 2759, in temporal_padding
    return tf.pad(x, pattern)
  File "/usr/local/lib/python3.6/site-packages/tensorflow_core/python/ops/array_ops.py", line 2840, in pad
    result = gen_array_ops.pad(tensor, paddings, name=name)
  File "/usr/local/lib/python3.6/site-packages/tensorflow_core/python/ops/gen_array_ops.py", line 6399, in pad
    "Pad", input=input, paddings=paddings, name=name)
  File "/usr/local/lib/python3.6/site-packages/tensorflow_core/python/framework/op_def_library.py", line 794, in _apply_op_helper
    op_def=op_def)
  File "/usr/local/lib/python3.6/site-packages/tensorflow_core/python/util/deprecation.py", line 507, in new_func
    return func(*args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/tensorflow_core/python/framework/ops.py", line 3357, in create_op
    attrs, op_def, compute_device)
  File "/usr/local/lib/python3.6/site-packages/tensorflow_core/python/framework/ops.py", line 3426, in _create_op_internal
    op_def=op_def)
  File "/usr/local/lib/python3.6/site-packages/tensorflow_core/python/framework/ops.py", line 1770, in __init__
    control_input_ops)
  File "/usr/local/lib/python3.6/site-packages/tensorflow_core/python/framework/ops.py", line 1610, in _create_c_op
    raise ValueError(str(e))
ValueError: Shape must be rank 3 but is rank 4 for 'padding_conv1_2/Pad' (op: 'Pad') with input shapes: [1,?,30,2], [3,2].

Я сократил модель столько, сколько мог, и сохранил одну модель (21 КБ, без весов) как JSON, в этом githubрепозиторий .

Я могу продублировать ошибку с помощью следующего фрагмента. Keras-resnet должен быть установлен в python3, и вам понадобится файл ck.json из репозитория. Ниже словарь пользовательских объектов поставляется для model_from_json (), потому что модель содержит пользовательский слой.

from keras.models import model_from_json
import keras_resnet
from keras_resnet.models import ResNet1D18

with open('ck.json', 'r') as f:
    model = model_from_json(f.read(), {'ResNet1D18': keras_resnet.models.ResNet1D18})

Я очень новичок в этом, поэтому я надеюсь, что просто сделал что-то глупое, но проблема неПохоже, что несоответствие форм в самой модели, потому что я могу создать модель, подогнать данные и сохранить модель без проблем. Чтение сохраненной модели обратно вызывает ошибку. Из приведенной ниже сводки модели форма ввода первого слоя ZeroPadding1D имеет вид (?, 30, 2), но как сохраненная модель преобразует ее в (1,?, 30, 2), как в приведенной выше ошибке?

Заранее благодарим за любую помощь!

Краткое описание модели:

Model: "resnet1d18_1"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_1 (InputLayer)            (None, 30, 2)        0                                            
__________________________________________________________________________________________________
padding_conv1 (ZeroPadding1D)   (None, 36, 2)        0           input_1[0][0]                    
__________________________________________________________________________________________________
conv1 (Conv1D)                  (None, 15, 64)       896         padding_conv1[0][0]              
__________________________________________________________________________________________________
bn_conv1 (BatchNormalization)   (None, 15, 64)       256         conv1[0][0]                      
__________________________________________________________________________________________________
conv1_relu (Activation)         (None, 15, 64)       0           bn_conv1[0][0]                   
__________________________________________________________________________________________________
pool1 (MaxPooling1D)            (None, 8, 64)        0           conv1_relu[0][0]                 
__________________________________________________________________________________________________
padding2a_branch2a (ZeroPadding (None, 10, 64)       0           pool1[0][0]                      
__________________________________________________________________________________________________
res2a_branch2a (Conv1D)         (None, 8, 64)        12288       padding2a_branch2a[0][0]         
__________________________________________________________________________________________________
bn2a_branch2a (BatchNormalizati (None, 8, 64)        256         res2a_branch2a[0][0]             
__________________________________________________________________________________________________
res2a_branch2a_relu (Activation (None, 8, 64)        0           bn2a_branch2a[0][0]              
__________________________________________________________________________________________________
padding2a_branch2b (ZeroPadding (None, 10, 64)       0           res2a_branch2a_relu[0][0]        
__________________________________________________________________________________________________
res2a_branch2b (Conv1D)         (None, 8, 64)        12288       padding2a_branch2b[0][0]         
__________________________________________________________________________________________________
res2a_branch1 (Conv1D)          (None, 8, 64)        4096        pool1[0][0]                      
__________________________________________________________________________________________________
bn2a_branch2b (BatchNormalizati (None, 8, 64)        256         res2a_branch2b[0][0]             
__________________________________________________________________________________________________
bn2a_branch1 (BatchNormalizatio (None, 8, 64)        256         res2a_branch1[0][0]              
__________________________________________________________________________________________________
res2a (Add)                     (None, 8, 64)        0           bn2a_branch2b[0][0]              
                                                                 bn2a_branch1[0][0]               
__________________________________________________________________________________________________
res2a_relu (Activation)         (None, 8, 64)        0           res2a[0][0]                      
__________________________________________________________________________________________________
pool5 (GlobalAveragePooling1D)  (None, 64)           0           res2a_relu[0][0]                 
__________________________________________________________________________________________________
fc1000 (Dense)                  (None, 1)            65          pool5[0][0]                      
==================================================================================================
Total params: 30,657
Trainable params: 30,145
Non-trainable params: 512

1 Ответ

0 голосов
/ 02 ноября 2019

Посмотрите на эту строку https://github.com/wt18/keras-resnet-json-load-fail/blob/master/ck.json#L11

Таким образом, input_shape будет (None, 30, 2) вместо (30, 2).

Попробуйте удалить эту строку.

...