【问题标题】:keras resnet load_model() fails with "ValueError: Shape must be rank 3 but is rank 4..."keras resnet load_model() 失败并显示“ValueError:Shape must be rank 3 but is rank 4 ...”
【发布时间】:2020-02-28 05:44:13
【问题描述】:

我已经使用 keras-resnet 0.2.0 (python3) 创建了一个 ResNet1D 模型,并且在许多时期都没有任何问题地拟合了我的数据,但是在保存之后,然后只需尝试重新读取模型(通过 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].

我已尽可能地缩减模型并将模型单独保存为 JSON(21kb,无权重),在此 github repository 中。

我可以使用以下 sn-p 复制错误。 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

【问题讨论】:

    标签: python-3.x keras save load resnet


    【解决方案1】:

    看这行https://github.com/wt18/keras-resnet-json-load-fail/blob/master/ck.json#L11

    这使得input_shape 成为(None, 30, 2) 而不是(30, 2)

    尝试删除此行。

    【讨论】:

    • 谢谢,不过,我实际上希望输入形状为 (None, 30, 2) 因为第一个维度是批量维度;即 input_shape 实际上是 (batch_size, 30, 2)。此外,ck.json 文件简单地用“model.to_json()”编写。顺便说一句,如果我删除“null”行,则错误变为:ValueError: Shape must be rank 3 but is rank 2 for 'padding_conv1_2/Pad' (op: 'Pad') with input shapes: [30,2], [3,2]. 我不明白为什么,如果包含批量维度,ZeroPadding1D 层的输入形状为 [1, ?, 30, 2] ,如果删除,它只是 [30, 2]。
    猜你喜欢
    • 2021-12-29
    • 1970-01-01
    • 2022-07-16
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 2019-07-15
    • 2017-12-03
    • 1970-01-01
    相关资源
    最近更新 更多