【问题标题】:Keras Backend Modeling IssueKeras 后端建模问题
【发布时间】:2017-07-25 16:45:10
【问题描述】:

我在声明我的模型时遇到问题。我的输入是 x_input 和 y_input,我的输出是预测。如下:

model = Model(inputs = [x_input, y_input], outputs = predictions )

我的输入 (x,y) 都是嵌入的,然后是 MatMult。如下:

# Build X Branch
x_input = Input(shape = (maxlen_x,), dtype = 'int32' )                               
x_embed = Embedding( maxvocab_x + 1, 16, input_length = maxlen_x )
XE = x_embed(x_input) 
# Result: Tensor("embedding_1/Gather:0", shape=(?, 31, 16), dtype=float32)
# Where 31 happens to be my maxlen_x

同样适用于 y 分支...

# Build Y Branch
y_input = Input(shape = (maxlen_y,), dtype = 'int32' )                               
y_embed = Embedding( maxvocab_y + 1, 16, input_length = maxlen_y )
YE = y_embed(y_input) 
# Result: Tensor("embedding_1/Gather:0", shape=(?, 13, 16), dtype=float32)
# Where 13 happens to be my maxlen_y

然后我在两者之间做一个批处理点。 (简单地把每个实例的数据打点)

from keras import backend as K
dot_merged = K.batch_dot(XE, YE, axes=[2,2] ) # Choose the 2nd component of both inputs to Dot, using batch_dot 
# Result: Tensor("MatMul:0", shape=(?, 31, 13), dtype=float32)`

然后我将张量的最后两个维度展平。

dim = np.prod(list(dot_merged.shape)[1:]) 
flattened= K.reshape(dot_merged, (-1,int(dim)) )

最终,我将这些扁平化的数据输入到一个简单的逻辑回归器中。

predictions = Dense(1,activation='sigmoid')(flattened)

而且,我的预测当然是模型的输出。

我会按照张量的输出形状列出每一层的输出。

Tensor("embedding_1/Gather:0", shape=(?, 31, 16), dtype=float32)
Tensor("embedding_2/Gather:0", shape=(?, 13, 16), dtype=float32)
Tensor("MatMul:0", shape=(?, 31, 13), dtype=float32)
Tensor("Reshape:0", shape=(?, 403), dtype=float32)
Tensor("dense_1/Sigmoid:0", shape=(?, 1), dtype=float32)

我收到以下错误,具体来说。

    Traceback (most recent call last):
  File "Model.py", line 53, in <module>
    model = Model(inputs = [dx_input, rx_input], outputs = [predictions] )
  File "/Users/jiangq/tensorflow/lib/python3.6/site-packages/keras/legacy/interfaces.py", line 88, in wrapper
    return func(*args, **kwargs)
  File "/Users/jiangq/tensorflow/lib/python3.6/site-packages/keras/engine/topology.py", line 1705, in __init__
    build_map_of_graph(x, finished_nodes, nodes_in_progress)
  File "/Users/jiangq/tensorflow/lib/python3.6/site-packages/keras/engine/topology.py", line 1695, in build_map_of_graph
    layer, node_index, tensor_index)
  File "/Users/jiangq/tensorflow/lib/python3.6/site-packages/keras/engine/topology.py", line 1665, in build_map_of_graph
    layer, node_index, tensor_index = tensor._keras_history
AttributeError: 'Tensor' object has no attribute '_keras_history'

沃利亚。我哪里做错了? 感谢您提前提供任何帮助!

-安东尼

【问题讨论】:

    标签: python deep-learning keras embedding


    【解决方案1】:

    您是否尝试将后端函数包装到Lambda 层中? 我认为 Keras 层的 __call__() 方法中有一些必要的操作,才能正确构建 Keras Model,如果直接调用后端函数,则不会执行。

    【讨论】:

    • 感谢您的回复!没有。我没有。如何添加 Lambda 层?
    • 我没有测试过,但是dot_merged = Lambda(lambda x: K.batch_dot(x[0], x[1], axes=[2,2]))([XE,YE]) 后跟flattened = Flatten()(dot_merged) 应该可以工作。
    • 很高兴听到这个消息。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多