2017-07-25 55 views
0

我有我的声明模型的问题。我的输入是x_input和y_input,我的输出是预测。如下:Keras后端造型发出

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' 

Volia。我哪里做错了? 感谢您提前提供帮助!

- 安东尼

回答

1

你有没有试过包装后端功能集成到一个Lambda层? 我觉得有一个Keras层的__call__()方法中的一些必要的操作的Keras Model要正确建立,如果直接调用后端功能,这将不会被执行。

+0

感谢您的答复!不。我没有。我将如何添加一个Lambda图层? –

+0

我没有测试,但是'dot_merged =拉姆达(拉姆达X:K.batch_dot(X [0],X [1],轴线= [2,2]))([XE,YE])'然后'扁平化= Flatten()(dot_merged)'应该可以工作。 –

+0

哦,我的天啊。有效!!!谢谢你,谢谢你,谢谢你。 Upvote :) –