卷积网络中的自定义过滤器与keras

时间:2017-08-08 13:38:28

标签: python machine-learning neural-network keras

我正在尝试用keras创建一个卷积网络,其中

from keras.layers import Input, LSTM, concatenate
from keras.models import Model
from keras.utils.vis_utils import model_to_dot
from IPython.display import display, SVG


inputs = Input(shape=(None, 4))
filter_unit = LSTM(1)
conv = concatenate([filter_unit(inputs[..., 0:2]),
                    filter_unit(inputs[..., 2:4])])
model = Model(inputs=inputs, outputs=conv)
SVG(model_to_dot(model, show_shapes=True).create(prog='dot', format='svg'))

我试图沿着要素尺寸切割输入张量,以分割(人为小)输入,以便与两个滤波器单元一起使用。在该示例中,过滤器是单个LSTM单元。我希望能够使用任意模型代替LSTM。

但是,这在model = ...行上失败了:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-6-a9f7f2ffbe17> in <module>()
      9 conv = concatenate([filter_unit(inputs[..., 0:2]),
     10                     filter_unit(inputs[..., 2:4])])
---> 11 model = Model(inputs=inputs, outputs=conv)
     12 SVG(model_to_dot(model, show_shapes=True).create(prog='dot', format='svg'))

~/.local/opt/anaconda3/envs/trafficprediction/lib/python3.6/site-packages/keras/legacy/interfaces.py in wrapper(*args, **kwargs)
     86                 warnings.warn('Update your `' + object_name +
     87                               '` call to the Keras 2 API: ' + signature, stacklevel=2)
---> 88             return func(*args, **kwargs)
     89         wrapper._legacy_support_signature = inspect.getargspec(func)
     90         return wrapper

~/.local/opt/anaconda3/envs/trafficprediction/lib/python3.6/site-packages/keras/engine/topology.py in __init__(self, inputs, outputs, name)
   1703         nodes_in_progress = set()
   1704         for x in self.outputs:
-> 1705             build_map_of_graph(x, finished_nodes, nodes_in_progress)
   1706 
   1707         for node in reversed(nodes_in_decreasing_depth):

~/.local/opt/anaconda3/envs/trafficprediction/lib/python3.6/site-packages/keras/engine/topology.py in build_map_of_graph(tensor, finished_nodes, nodes_in_progress, layer, node_index, tensor_index)
   1693                 tensor_index = node.tensor_indices[i]
   1694                 build_map_of_graph(x, finished_nodes, nodes_in_progress,
-> 1695                                    layer, node_index, tensor_index)
   1696 
   1697             finished_nodes.add(node)

~/.local/opt/anaconda3/envs/trafficprediction/lib/python3.6/site-packages/keras/engine/topology.py in build_map_of_graph(tensor, finished_nodes, nodes_in_progress, layer, node_index, tensor_index)
   1693                 tensor_index = node.tensor_indices[i]
   1694                 build_map_of_graph(x, finished_nodes, nodes_in_progress,
-> 1695                                    layer, node_index, tensor_index)
   1696 
   1697             finished_nodes.add(node)

~/.local/opt/anaconda3/envs/trafficprediction/lib/python3.6/site-packages/keras/engine/topology.py in build_map_of_graph(tensor, finished_nodes, nodes_in_progress, layer, node_index, tensor_index)
   1663             """
   1664             if not layer or node_index is None or tensor_index is None:
-> 1665                 layer, node_index, tensor_index = tensor._keras_history
   1666             node = layer.inbound_nodes[node_index]
   1667 

AttributeError: 'Tensor' object has no attribute '_keras_history'

如果LSTM替换为Dense,则会出现同样的问题。对我来说,这个错误信息意味着什么并不清楚。我做错了什么?

关于同一错误(下面的链接)有一个问题,但我不清楚应该如何使用Lambda层,或者这是否是正确的解决方案。

AttributeError: 'Tensor' object has no attribute '_keras_history'

1 个答案:

答案 0 :(得分:1)

问题在于输入切片的方式。 LSTM图层期望Layer对象作为输入,并且您正在提供Tensor对象。您可以尝试添加一个lambda图层(或示例中为两个),用于对输入进行切片以提供LSTM图层。类似的东西:

y = Lambda(lambda x: x[:,0,:,:], output_shape=(1,) + input_shape[2:])(x)

y图层将是以下图层的(切片)输入。