将张量作为输入传递到Keras api functional mod

2024-05-12 19:12:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个api函数模型,可以很好地将numpy数组作为输入。我的模型的简化版本如下。在

inputLayerU = Input(shape=(10,))
denseLayerU = Dense(10, activation='relu')(inputLayerU)

inputLayerM = Input(shape=(10,))    
denseLayerM = Dense(10, activation='relu')(inputLayerM)

concatLayerUM = concatenate([denseLayerU, denseLayerM], axis = 1)
outputLayer = Dense(1,activation='linear')(concatLayerUM)

model = Model(inputs=[inputLayerUM, inputLayerMU], outputs=outputLayer)

model.fit_generator(dataGenerator(train, matA, matB, matC, batchSize,1),
    epochs=3,
    steps_per_epoch=10)

我使用了一个非常大的数据集,它不适合我的内存,所以我使用了一个生成器,如下所示:

^{pr2}$

如您所见,我在dataGenerator函数中使用了两个2D数组的dot乘积。我在GPU上运行我的代码,为了使它更快,我想用matmaul来代替点积,它以张量格式提供相同的结果。所以会是这样的:

matU = tf.matmul(U,matB)        
matM = tf.matmul(M,matB)

但是,它提供了以下错误:

InvalidArgumentError: Requested tensor connection from unknown node: "input_4:0".

input_4:0是模型中的第一个inputLayerU节点。看来我不能把张量传递给InputLayer。那我该怎么通过呢?在

另外,在将张量matU和matM传递给输入层之前,我尝试将它们转换为numpy数组

matU = tf.Session().run(tf.matmul(U,matB))       
matM = tf.Session().run(tf.matmul(M,matB))

但它比一开始使用点积要慢10倍。在

我检查了this post,但是,它是针对顺序模型的,在开始训练模型之前,我没有张量。在


Tags: 函数模型numpyinputtf数组activationdense
1条回答
网友
1楼 · 发布于 2024-05-12 19:12:05

您可以将U和M作为输入传递,然后在模型中应用Lambda:

Lambda(lambda x: tf.matmul(x, tf.constant(constant_matrix)))

假设^{cd1>}是模型中的常数。

使用功能API:

^{pr2}$

假设模型的输入是matmul运算之前的M,U向量,并且变换是一个常数矩阵。

相关问题 更多 >