【发布时间】:2019-11-17 18:04:14
【问题描述】:
我有一个 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
如您所见,我在dataGenerator 函数中使用了两个二维数组的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,但是,它是针对顺序模型的,在开始训练模型之前我没有张量。
【问题讨论】:
标签: python tensorflow keras