将tensorflow数据格式从nhwc(最后一个通道)切换到nchw(第一个通道)时出现问题

将tensorflow数据格式从nhwc(最后一个通道)切换到nchw(第一个通道)时出现问题,tensorflow,deep-learning,ocr,tensorflow2.0,recurrent-neural-network,Tensorflow,Deep Learning,Ocr,Tensorflow2.0,Recurrent Neural Network,我目前正在为OCR任务训练CRNN(卷积递归神经网络)。我通常将数据格式保留为默认格式,即NHWC(最后一个通道)。但由于一些部署限制,我希望使用NCHW(通道优先)数据格式 为此,我使用了tensorflow.keras.backend.set\u image\u data\u format('channels\u first') 我正在使用以下方法相应地更改我的数据管道: if my_configs.data_format == 'channels_first': img = tf.

我目前正在为OCR任务训练CRNN(卷积递归神经网络)。我通常将数据格式保留为默认格式,即NHWC(最后一个通道)。但由于一些部署限制,我希望使用NCHW(通道优先)数据格式

为此,我使用了
tensorflow.keras.backend.set\u image\u data\u format('channels\u first')

我正在使用以下方法相应地更改我的数据管道:

if my_configs.data_format == 'channels_first':
    img = tf.transpose(img, [2, 0, 1])
我的模型有卷积层和双向lstm层。这是我的模型的一部分:

    conv_7 = Conv2D(64, (2,2), activation = "relu")(pool_6)
    
    if data_format == 'channels_first':
        squeezed = Lambda(lambda x: tf.squeeze(x, 2))(conv_7)
        # squeezed = Reshape((1,64,31))(squeezed)
    else:
        squeezed = Lambda(lambda x: tf.squeeze(x, 1))(conv_7)

    if data_format == "channels_first":
        use_bias = False
    else:
        use_bias = True
    # bidirectional LSTM layers with units=128
    blstm_1 = Bidirectional(LSTM(128, return_sequences=True, use_bias=use_bias))(squeezed)
    blstm_2 = Bidirectional(LSTM(128, return_sequences=True, use_bias=use_bias))(blstm_1)
现在,我的问题来了。如果我将偏差保留在我的LSTM层中,因此
使用_bias=True
,那么我会得到一个关于尺寸的错误。这就是错误:

Traceback (most recent call last):
  File "C:\Users\*\miniconda3\envs\tf2-gpu-env\lib\site-packages\tensorflow\python\framework\ops.py", line 1812, in _create_c_op
    c_op = pywrap_tf_session.TF_FinishOperation(op_desc)
tensorflow.python.framework.errors_impl.InvalidArgumentError: Shape must be at least rank 3 but is rank 2 for '{{node BiasAdd}} = BiasAdd[T=DT_FLOAT, data_format="NCHW"](add, bias)' with input shapes: [?,512], [512].      

During handling of the above exception, another exception occurred:       

Traceback (most recent call last):   
  File "run_training.py", line 292, in <module>
    model = model_architecture_1_bis(len(char_list), data_format)
  File "D:\GdPicture\dev\MachineLearning\OCR\ModelsArchitectures.py", line 178, in model_architecture_1_bis    
    blstm_1 = Bidirectional(LSTM(128, return_sequences=True, use_bias=use_bias))(squeezed)
  File "C:\Users\*\miniconda3\envs\tf2-gpu-env\lib\site-packages\tensorflow\python\keras\layers\wrappers.py", line 530, in __call__
    return super(Bidirectional, self).__call__(inputs, **kwargs)
  File "C:\Users\*\miniconda3\envs\tf2-gpu-env\lib\site-packages\tensorflow\python\keras\engine\base_layer.py", line 925, in __call__       
    return self._functional_construction_call(inputs, args, kwargs,       
  File "C:\Users\*\miniconda3\envs\tf2-gpu-env\lib\site-packages\tensorflow\python\keras\engine\base_layer.py", line 1117, in _functional_construction_call
    outputs = call_fn(cast_inputs, *args, **kwargs)
  File "C:\Users\*\miniconda3\envs\tf2-gpu-env\lib\site-packages\tensorflow\python\keras\layers\wrappers.py", line 643, in call
    y = self.forward_layer(forward_inputs,
  File "C:\Users\*\miniconda3\envs\tf2-gpu-env\lib\site-packages\tensorflow\python\keras\layers\recurrent.py", line 663, in __call__        
    return super(RNN, self).__call__(inputs, **kwargs)
  File "C:\Users\*\miniconda3\envs\tf2-gpu-env\lib\site-packages\tensorflow\python\keras\engine\base_layer.py", line 925, in __call__       
    return self._functional_construction_call(inputs, args, kwargs,       
  File "C:\Users\*\miniconda3\envs\tf2-gpu-env\lib\site-packages\tensorflow\python\keras\engine\base_layer.py", line 1117, in _functional_construction_call
    outputs = call_fn(cast_inputs, *args, **kwargs)
  File "C:\Users\*\miniconda3\envs\tf2-gpu-env\lib\site-packages\tensorflow\python\keras\layers\recurrent_v2.py", line 1183, in call        
    runtime) = lstm_with_backend_selection(**normal_lstm_kwargs)
  File "C:\Users\*\miniconda3\envs\tf2-gpu-env\lib\site-packages\tensorflow\python\keras\layers\recurrent_v2.py", line 1557, in lstm_with_backend_selection
    last_output, outputs, new_h, new_c, runtime = defun_standard_lstm(    
  File "C:\Users\*\miniconda3\envs\tf2-gpu-env\lib\site-packages\tensorflow\python\eager\function.py", 
line 2828, in __call__
    graph_function, args, kwargs = self._maybe_define_function(args, kwargs)
  File "C:\Users\*\miniconda3\envs\tf2-gpu-env\lib\site-packages\tensorflow\python\eager\function.py", 
line 3213, in _maybe_define_function 
    graph_function = self._create_graph_function(args, kwargs)
  File "C:\Users\*\miniconda3\envs\tf2-gpu-env\lib\site-packages\tensorflow\python\eager\function.py", 
line 3065, in _create_graph_function 
    func_graph_module.func_graph_from_py_func(
  File "C:\Users\*\miniconda3\envs\tf2-gpu-env\lib\site-packages\tensorflow\python\framework\func_graph.py", line 986, in func_graph_from_py_func
    func_outputs = python_func(*func_args, **func_kwargs)
  File "C:\Users\*\miniconda3\envs\tf2-gpu-env\lib\site-packages\tensorflow\python\keras\layers\recurrent_v2.py", line 1305, in standard_lstm
    last_output, outputs, new_states 
= K.rnn(
  File "C:\Users\*\miniconda3\envs\tf2-gpu-env\lib\site-packages\tensorflow\python\util\dispatch.py", line 201, in wrapper
    return target(*args, **kwargs)   
  File "C:\Users\*\miniconda3\envs\tf2-gpu-env\lib\site-packages\tensorflow\python\keras\backend.py", line 4213, in rnn
    output_time_zero, _ = step_function(
  File "C:\Users\*\miniconda3\envs\tf2-gpu-env\lib\site-packages\tensorflow\python\keras\layers\recurrent_v2.py", line 1293, in step        
    z = K.bias_add(z, bias)
  File "C:\Users\*\miniconda3\envs\tf2-gpu-env\lib\site-packages\tensorflow\python\util\dispatch.py", line 201, in wrapper
    return target(*args, **kwargs)   
  File "C:\Users\*\miniconda3\envs\tf2-gpu-env\lib\site-packages\tensorflow\python\keras\backend.py", line 5772, in bias_add
    return nn.bias_add(x, bias, data_format='NCHW')
  File "C:\Users\*\miniconda3\envs\tf2-gpu-env\lib\site-packages\tensorflow\python\util\dispatch.py", line 201, in wrapper
    return target(*args, **kwargs)   
  File "C:\Users\*\miniconda3\envs\tf2-gpu-env\lib\site-packages\tensorflow\python\ops\nn_ops.py", line 3366, in bias_add
    return gen_nn_ops.bias_add(
  File "C:\Users\*\miniconda3\envs\tf2-gpu-env\lib\site-packages\tensorflow\python\ops\gen_nn_ops.py", 
line 693, in bias_add
    _, _, _op, _outputs = _op_def_library._apply_op_helper(
  File "C:\Users\*\miniconda3\envs\tf2-gpu-env\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 742, in _apply_op_helper
    op = g._create_op_internal(op_type_name, inputs, dtypes=None,
  File "C:\Users\*\miniconda3\envs\tf2-gpu-env\lib\site-packages\tensorflow\python\framework\func_graph.py", line 591, in _create_op_internal
    return super(FuncGraph, self)._create_op_internal(  # pylint: disable=protected-access
  File "C:\Users\*\miniconda3\envs\tf2-gpu-env\lib\site-packages\tensorflow\python\framework\ops.py", line 3477, in _create_op_internal     
    ret = Operation(
  File "C:\Users\*\miniconda3\envs\tf2-gpu-env\lib\site-packages\tensorflow\python\framework\ops.py", line 1974, in __init__
    self._c_op = _create_c_op(self._graph, node_def, inputs,
  File "C:\Users\*\miniconda3\envs\tf2-gpu-env\lib\site-packages\tensorflow\python\framework\ops.py", line 1815, in _create_c_op
    raise ValueError(str(e))
ValueError: Shape must be at least rank 3 but is rank 2 for '{{node BiasAdd}} = BiasAdd[T=DT_FLOAT, data_format="NCHW"](add, bias)' with input shapes: [?,512], [512].
回溯(最近一次呼叫最后一次):
文件“C:\Users\*\miniconda3\envs\tf2 gpu env\lib\site packages\tensorflow\python\framework\ops.py”,第1812行,位于“创建”C\u op
c_op=pywrap_tf_session.tf_FinishOperation(op_desc)
tensorflow.python.framework.errors\u impl.InvalidArgumentError:Shape必须至少为秩3,但对于输入形状为“{node BiasAdd}}}=BiasAdd[T=DT\u FLOAT,data\u format=“NCHW”](add,bias)”的“{node BiasAdd}”必须为秩2:[?,512],[512]。
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“run_training.py”,第292行,在
模型=模型体系结构(len(字符列表),数据格式)
文件“D:\GdPicture\dev\MachineLearning\OCR\ModelsArchitectures.py”,第178行,在model_architecture_1_bis中
blstm_1=双向(LSTM(128,返回_序列=真,使用_偏置=使用_偏置))(压缩)
文件“C:\Users\*\miniconda3\envs\tf2 gpu env\lib\site packages\tensorflow\python\keras\layers\wrappers.py”,第530行,在u调用中__
返回超级(双向,自).\u调用\u(输入,**kwargs)
文件“C:\Users\*\miniconda3\envs\tf2 gpu env\lib\site packages\tensorflow\python\keras\engine\base\u layer.py”,第925行,在调用中
返回self.\u函数\u构造\u调用(输入、参数、kwargs、,
文件“C:\Users\*\miniconda3\envs\tf2 gpu env\lib\site packages\tensorflow\python\keras\engine\base\u layer.py”,第1117行,在函数构造调用中
输出=调用fn(转换输入,*args,**kwargs)
文件“C:\Users\*\miniconda3\envs\tf2 gpu env\lib\site packages\tensorflow\python\keras\layers\wrappers.py”,第643行,在调用中
y=自前向\u层(前向\u输入,
文件“C:\Users\*\miniconda3\envs\tf2 gpu env\lib\site packages\tensorflow\python\keras\layers\recurrent.py”,第663行,在调用中
返回super(RNN,self).\u调用\u(输入,**kwargs)
文件“C:\Users\*\miniconda3\envs\tf2 gpu env\lib\site packages\tensorflow\python\keras\engine\base\u layer.py”,第925行,在调用中
返回self.\u函数\u构造\u调用(输入、参数、kwargs、,
文件“C:\Users\*\miniconda3\envs\tf2 gpu env\lib\site packages\tensorflow\python\keras\engine\base\u layer.py”,第1117行,在函数构造调用中
输出=调用fn(转换输入,*args,**kwargs)
文件“C:\Users\*\miniconda3\envs\tf2 gpu env\lib\site packages\tensorflow\python\keras\layers\recurrential\u v2.py”,第1183行,在调用中
运行时)=lstm\U,带有后端选择(**正常lstm\U kwargs)
文件“C:\Users\*\miniconda3\envs\tf2 gpu env\lib\site packages\tensorflow\python\keras\layers\recurrent\u v2.py”,第1557行,在lstm\U中选择了\u backend\u
最后的输出,输出,新的h,新的c,运行时=defun\u标准的lstm(
文件“C:\Users\*\miniconda3\envs\tf2 gpu env\lib\site packages\tensorflow\python\eager\function.py”,
第2828行,正在通话__
图形函数,args,kwargs=self.\u可能定义函数(args,kwargs)
文件“C:\Users\*\miniconda3\envs\tf2 gpu env\lib\site packages\tensorflow\python\eager\function.py”,
第3213行,在“定义”函数中
graph\u function=self.\u create\u graph\u function(args,kwargs)
文件“C:\Users\*\miniconda3\envs\tf2 gpu env\lib\site packages\tensorflow\python\eager\function.py”,
第3065行,在_创建_图形_函数中
func_graph_module.func_graph_from_py_func(
文件“C:\Users\*\miniconda3\envs\tf2 gpu env\lib\site packages\tensorflow\python\framework\func_graph.py”,第986行,位于_py_func的func_图中
func_outputs=python_func(*func_args,**func_kwargs)
文件“C:\Users\*\miniconda3\envs\tf2 gpu env\lib\site packages\tensorflow\python\keras\layers\recurrent\u v2.py”,第1305行,标准\u lstm
上次输出、输出、新状态
=K.rnn(
包装器中的文件“C:\Users\*\miniconda3\envs\tf2 gpu env\lib\site packages\tensorflow\python\util\dispatch.py”,第201行
返回目标(*args,**kwargs)
rnn中第4213行的文件“C:\Users\*\miniconda3\envs\tf2 gpu env\lib\site packages\tensorflow\python\keras\backend.py”
输出\u时间\u零,\u=步进\u函数(
文件“C:\Users\*\miniconda3\envs\tf2 gpu env\lib\site packages\tensorflow\python\keras\layers\recurtive_v2.py”,第1293行,在步骤中
z=K.bias_add(z,bias)
包装器中的文件“C:\Users\*\miniconda3\envs\tf2 gpu env\lib\site packages\tensorflow\python\util\dispatch.py”,第201行
返回目标(*args,**kwargs)
文件“C:\Users\*\miniconda3\envs\tf2 gpu env\lib\site packages\tensorflow\python\keras\backend.py”,第5772行,在bias\U add中
返回nn.bias\u add(x,bias,data\u format='NCHW')
包装器中的文件“C:\Users\*\miniconda3\envs\tf2 gpu env\lib\site packages\tensorflow\python\util\dispatch.py”,第201行
返回目标(*args,**kwargs)
文件“C:\Users\*\miniconda3\envs\tf2 gpu env\lib\site packages\tensorflow\python\ops\nn\u ops.py”,第3366行,在bias\u add中
返回gen\u nn\u ops.bias\u add(
文件“C:\Users\*\miniconda3\envs\tf2 gpu env\lib\site packages\tensorflow\python\ops\gen\u nn\u ops.py”,
第693行,在bias_add中
_,u,_op,_outputs=_op_def_库。_apply_op_helper(
文件“C:\Users\*\miniconda3\envs\tf2 gpu env\lib\site packages\tensorflow\python\framework\op_def_library.py”,第742行,位于_apply_op_helpe中