我有一个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)
我使用了一个非常大的数据集,该数据集不适合我的内存,因此我使用了如下生成器:
def dataGenerator(data, matA, matB, matC, batchSize):
sampleIndex = range(len(data))
batchNumber = int(len(data)/batchSize) #count of batches
counter=0
while 1:
U = np.zeros((batchSize,N))
M = np.zeros((batchSize,N))
outY = np.zeros((batchSize))
for i in range(0,batchSize):
ind = sampleIndex[i+counter*batchSize]
U[i,:] = matA[ind,:]
M[i,:] = matB[ind,:]
outY[i] = data.iloc[ind]['y']
matU = np.dot(U,matC)
matM = np.dot(M,matC)
yield ([matU, matM], outY)
#increase counter and restart it to yeild data in the next epoch as well
counter += 1
if counter >= batchNumber:
counter = 0
如您所见,我在dot
函数中使用了两个2D数组的dataGenerator
乘积。我在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,但这是针对顺序模型的,在开始训练模型之前我没有张量。
答案 0 :(得分:1)
您可以传递U和M作为输入,然后在模型内部应用Lambda:
Lambda(lambda x: tf.matmul(x, tf.constant(constant_matrix)))
假设constant_matrix
是模型中的常数。
使用功能性API:
import numpy as np
from tensorflow import keras
from tensorflow.keras.layers import *
from tensorflow.keras.models import Model
from tensorflow.keras import backend as K
const_matrix = np.random.rand(10, 20)
def apply_const_matrix(x):
"""
x: shape=(batch_size, input_dims)
const_matrix: shape=(input_dims, output_dims)
output: (batch_size, output_dims)
"""
return K.dot(x, K.constant(const_matrix))
def make_model():
inp_M = Input(shape=(10,))
inp_U = Input(shape=(10,))
Mp = Lambda(apply_const_matrix)(inp_M)
Up = Lambda(apply_const_matrix)(inp_U)
join = Concatenate(axis=1)([Mp, Up])
h1 = Dense(32, activation='relu')(join)
out = Dense(1, activation='sigmoid')(h1)
model = Model([inp_M, inp_U], out)
model.compile('adam', 'mse')
return model
model = make_model()
model.summary()
这里的假设是,在进行matmul操作之前,模型的输入是M,U个向量,并且变换具有恒定矩阵。