keras tensorflow 中的Tensor切片

bogh5gae  于 2023-05-18  发布在  其他
关注(0)|答案(1)|浏览(278)

我想做同样的numpy操作如下,使一个自定义层

img=cv2.imread('img.jpg') # img.shape =>(600,600,3)

mask=np.random.randint(0,2,size=img.shape[:2],dtype='bool')

img2=np.expand_dims(img,axis=0) #img.shape => (1,600,600,3)

img2[:,mask,:].shape # =>  (1, 204030, 3)

这是我第一次尝试,但失败了。我不能对tensorflowTensor做同样的操作

class Sampling_layer(keras.layers.Layer):

    def __init__(self,sampling_matrix):
        super(Sampling_layer,self).__init__()
        self.sampling_matrix=sampling_matrix

    def call(self,input_img):
        return input_img[:,self.sampling_matrix,:]

更多解释:
我想定义一个keras层,这样给定一批图像,它使用一个采样矩阵,并为图像提供一批采样向量。采样矩阵是一个随机布尔矩阵,大小与图像相同。我使用的切片操作对于numpy数组来说是直接的,并且工作得很好。但是我不能用tensorflow中的Tensor来完成。我尝试使用循环来手动执行我想要的操作,但失败了。

qnyhuwrf

qnyhuwrf1#

您可以执行以下操作。

import numpy as np
import tensorflow as tf

# Batch of images
img=np.random.normal(size=[2,600,600,3]) # img.shape =>(600,600,3)

# You'll need to match the first 3 dimensions of mask with the img
# for that we'll repeat the first axis twice
mask=np.random.randint(0,2,size=img.shape[1:3],dtype='bool')
mask = np.repeat(np.expand_dims(mask, axis=0), 2, axis=0)

# Defining input layers
inp1 = tf.keras.layers.Input(shape=(600,600,3))
mask_inp = tf.keras.layers.Input(shape=(600,600))

# The layer you're looking for
out = tf.keras.layers.Lambda(lambda x: tf.boolean_mask(x[0], x[1]) )([inp1, mask])

model = tf.keras.models.Model([inp1, mask_inp], out)

# Predict on sample data
toy_out = model.predict([img, mask])

请注意,您的图像和蒙版需要具有相同的批量大小。我无法找到一个解决方案,使这一工作,而不重复批量轴上的面具,以配合批量大小的图像。这是我想到的唯一可能的解决方案,(假设你的掩码对每批数据都有变化)。

相关问题