【发布时间】:2021-01-31 13:20:04
【问题描述】:
我想实现一个复杂的模型,但是它不起作用,卡在输入层。我已经简化了代码,下面是一个例子:
from keras.layers import *
from keras.models import Model
from keras import backend as K
def build_model():
label_num = 4
max_len = 50
# shape = (B, label_num, max_len)
label_inputs = Input((label_num, max_len))
# shape = (B*label_num, max_len)
reshape_input = Lambda(lambda x: K.reshape(x, (-1, max_len)))(label_inputs)
dense = Dense(10)(reshape_input)
model = Model(reshape_input, dense)
# do another things
return model
if __name__ == '__main__':
build_model()
错误表明:
File "####################\test.py", line 21, in build_model
model = Model(label_inputs, model1_dense)
File "####################\lib\site-packages\keras\legacy\interfaces.py", line 91, in wrapper
return func(*args, **kwargs)
File "####################\lib\site-packages\keras\engine\network.py", line 93, in __init__
self._init_graph_network(*args, **kwargs)
File "####################\lib\site-packages\keras\engine\network.py", line 231, in _init_graph_network
self.inputs, self.outputs)
File "####################\lib\site-packages\keras\engine\network.py", line 1443, in _map_graph_network
str(layers_with_complete_input))
ValueError: Graph disconnected: cannot obtain value for tensor Tensor("input_1:0", shape=(?, 4, 50), dtype=float32) at layer "input_1". The following previous layers were accessed without issue: []
复杂模型包含两个不同batch_size的输入张量,但是keras有一个batch_size函数来检查每个输入张量是否有相同的batch_size。所以我必须用相同的batch_size对数据进行预处理,在喂给模型之后,我应该像上面的代码'reshape_input'一样重塑输入张量之一。
我该如何解决?非常感谢。
【问题讨论】:
-
您的数据根本不应该有 batch_size。分批是 keras 实现随机梯度下降的一部分。它与数据无关
-
我已经解决了我的问题,因为我使用了动态输入层。实际上,这个问题的背景是,一个句子嵌入的模型(称为sentence_model),另一个是标签嵌入(称为label_model)。我使用类似连体或三元组的网络架构来计算句子和标签之间的相似度。一个句子对应一个positive_label,为了让整个模型收敛,我应该至少创建一个negative_label样本。
-
假设 sentence_model 的 batch_size 叫做 bs,label_model 会喂一个 positive_label 和 n 个negative_labels,总共 n+1。所以输入数据的形状是[(bs,seq_len),(bs, n+1, seq_len)]。
-
我应该将 (bs, n+1, seq_len) 重塑为 (bs*(n+1), seq_len),并将数据提供给 label_model。
标签: python tensorflow keras deep-learning nlp