Input_shape在自定义图层中为None

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Input_shape在自定义图层中为None相关的知识,希望对你有一定的参考价值。

我正在Tensorflow 2.1中构建自己的图层,并在自定义模型中使用它。但是,当我尝试学习一些东西时,该层会在第一次调用时尝试自行构建,因此需要input_shape来完成。据我所知,它应该计算它,因为它得到了实际的输入,但是input_size似乎为None。

我的问题是:我做错了什么以及如何纠正?

下面我举一个例子来重现该问题。

我的代码(MinimalRNNCell是从tensorflow网站https://www.tensorflow.org/api_docs/python/tf/keras/layers/RNN复制的:]

import tensorflow as tf 
from tensorflow.keras.layers import Layer
from tensorflow.keras import Model
import numpy as np

class MinimalRNNCell(Layer):

    def __init__(self, units, **kwargs):
        self.units = units
        self.state_size = units
        super(MinimalRNNCell, self).__init__(**kwargs)

    def build(self, input_shape):
        self.kernel = self.add_weight(shape=(input_shape[-1], self.units),
                                      initializer='uniform',
                                      name='kernel')
        self.recurrent_kernel = self.add_weight(
            shape=(self.units, self.units),
            initializer='uniform',
            name='recurrent_kernel')
        self.built = True

    def call(self, inputs, states):
        prev_output = states[0]
        h = K.dot(inputs, self.kernel)
        output = h + K.dot(prev_output, self.recurrent_kernel)
        return output, [output]


class RNNXModel(Model):
    def __init__(self, size):
        super(RNNXModel, self).__init__()
        self.minimalrnn=MinimalRNNCell(size)

    def call(self, inputs):
        out=self.minimalrnn(input)
        return out


x=np.array([[[1,2,3],[4,5,6],[7,8,9]],[[10,11,12],[13,14,15],[16,17,18]]])
y=np.array([[1,2,3],[10,11,12]])

model=RNNXModel(3)
model.compile(optimizer='sgd', loss='mse')
model.fit(x,y,epochs=10, batch_size=1)

我得到的错误:

Traceback (most recent call last):
  File "/home/.../test.py", line 64, in <module>
    model.fit(x,y,epochs=10, batch_size=1)
  File "/home/.../.venv/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/training.py", line 819, in fit
    use_multiprocessing=use_multiprocessing)
  File "/home/.../.venv/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/training_v2.py", line 235, in fit
    use_multiprocessing=use_multiprocessing)
  File "/home/.../.venv/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/training_v2.py", line 593, in _process_training_inputs
    use_multiprocessing=use_multiprocessing)
  File "/home/.../.venv/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/training_v2.py", line 646, in _process_inputs
    x, y, sample_weight=sample_weights)
  File "/home/.../.venv/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/training.py", line 2346, in _standardize_user_data
    all_inputs, y_input, dict_inputs = self._build_model_with_inputs(x, y)
  File "/home/.../.venv/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/training.py", line 2572, in _build_model_with_inputs
    self._set_inputs(cast_inputs)
  File "/home/.../.venv/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/training.py", line 2659, in _set_inputs
    outputs = self(inputs, **kwargs)
  File "/home/.../.venv/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/base_layer.py", line 773, in __call__
    outputs = call_fn(cast_inputs, *args, **kwargs)
  File "/home/.../.venv/lib/python3.6/site-packages/tensorflow_core/python/autograph/impl/api.py", line 237, in wrapper
    raise e.ag_error_metadata.to_exception(e)
TypeError: in converted code:

    /home/.../test.py:36 call  *
        out=self.minimalrnn(input)
    /home/.../.venv/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/base_layer.py:818 __call__
        self._maybe_build(inputs)
    /home/.../.venv/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/base_layer.py:2116 _maybe_build
        self.build(input_shapes)
    /home/.../test.py:14 build
        self.kernel = self.add_weight(shape=(input_shape[-1], self.units),

    TypeError: 'NoneType' object is not subscriptable
答案

有一个错字(input应该为inputs)。 input是内置功能(documentation)。

class RNNXModel(Model):
    def __init__(self, size):
        super(RNNXModel, self).__init__()
        self.minimalrnn=MinimalRNNCell(size)

    def call(self, inputs):
        out=self.minimalrnn(inputs)  # changed from `input`
        return out

以上是关于Input_shape在自定义图层中为None的主要内容,如果未能解决你的问题,请参考以下文章

在 Keras 自定义层中连接多个形状为 (None, m) 的 LSTM 输出

张量流的第一个密集层中的 input_shape 错误

Cocos2D 图层中的自定义滚动

DotSpatial 自定义MapFunction_mapMain中绘制线(未添加到图层中)

如何在 Photoshop 填充图层中检索颜色

如何为开放图层中的开放街道地图使用不同的主题?