【问题标题】:How to efficiently restrict tensorflow model output?如何有效限制tensorflow模型输出?
【发布时间】:2019-12-05 18:39:46
【问题描述】:

我有一个模型,例如

model = keras.Sequential([
    keras.layers.Reshape(target_shape=(10,10,1),input_shape=(100,)),
    keras.layers.Convolution2DTranspose(1, 3, activation='relu')
])

训练完成后,我只想计算输出的一个子集,例如

out = model(x)[:,3,5]

有没有办法有效地做到这一点,这样我就不会计算所有的输出?理想情况下,我想定义一个采用 x 并且输出索引只计算它们的新模型,例如

out = new_model(x,out_indices) 

【问题讨论】:

  • 使用这个模型,你得到一个 [None,12,12,1] 张量。您要对哪些维度进行索引?
  • 输出将是 [batch_size, h,w,depth]。我将创建一个列表 out_indices [(3,5,4), (2,4,8),...]。我希望模型只运行这些输出索引所需的计算。有什么方法可以跟踪这些输出并使模型进行稀疏计算?

标签: tensorflow keras sparse-matrix


【解决方案1】:

您可以执行以下操作,

这是您的第一个模型。注意,我去掉了Reshape层,直接为Convolution2DTranspose层指定了input_shape

model = models.Sequential([    
    layers.Convolution2DTranspose(1, 3, activation='relu', input_shape=(10,10,1))
])
model.compile(loss='mean_squared_error', optimizer='adam')
model.summary()

这可能是您感兴趣的部分。您会从以前的模型中获得(None, 12, 12, 1) 输出。在这里,您传递的是批处理或 4 维索引(前一个模型输出的每个维度一个元素)。

inp = layers.Input(shape=(4,), dtype='int32')
out = layers.Lambda(lambda x: tf.gather_nd(model.output, x))(inp)
model2 = models.Model(inputs=[inp, model.input], outputs=out)
model2.compile(loss='mean_squared_error', optimizer='adam')
model2.summary()

现在您可以获取传递给模型的任何索引的值。

x = np.random.normal(size=(1,10, 10, 1))
ind = np.array([[0,0,0,0],[0,1,1,0]], dtype='int32')
y = model2.predict([ind, x])

【讨论】:

  • 感谢您的回复。运行代码时出现此错误。 ValueError: Data cardinality is ambiguous: x sizes: 2, 1 请提供具有相同第一个维度的数据。
  • 你能告诉我你在哪一行得到错误以及你使用的是哪个 TF 版本(我使用的是 TF 1.15)
  • 感谢您的帮助。该代码适用于 1.15。但是,我认为代码不能有效地计算输出。运行时间与我计算所有内容然后索引到数组时几乎相同。我将输入形状撞到 (1000,1000) 来看到这个。您的代码应该比计算所有内容和对输出的索引要快。
  • @lab_rat 那么when I compute everything and then index into the array是什么意思。
  • 我的意思是 = model.predict(x)[inds]
猜你喜欢
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2021-08-20
  • 2022-10-02
  • 1970-01-01
  • 2019-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多