我正在嘗試在 Keras 中創建一個自定義層,每次k從張量中選擇隨機樣本inputs。
像這樣的東西:
import random
class RandomKAggregator(tf.keras.layers.Layer):
def __init__(self, **kwargs):
super(RandomKAggregator, self).__init__(**kwargs)
self.k = 3
def call(self, inputs):
return inputs[[random.randint(0, len(inputs) - 1) for _ in range(self.k)]]
目標是k在第一個維度上挑選樣本。例如,如果inputs張量的形狀是[500, 32, 32, 3],它應該回傳一個張量 shape [k, 32, 32, 3],每次呼叫層時它應該選擇不同的k元素。
上面的實作回傳TypeError: list indices must be integers or slices, not list. 我嘗試使用tf.gather但tf.gather_nd無法解決。
- 達到預期結果的正確方法是什么?
- 另外,想了解 TensorFlow 如何處理索引以及我應該如何使用帶有張量的索引串列,比如我想從中挑選
[6,3,1,0],my_tensor為什么my_tensor[[6,3,1,0]]不適合我?
uj5u.com熱心網友回復:
您需要了解切片(link_1、link_2):
>>> tns = tf.random.uniform((3,2,2,3))
>>> tns
<tf.Tensor: shape=(3, 2, 2, 2), dtype=float32, numpy=
array([[[[0.2313137 , 0.17192566],
[0.25301564, 0.20687258]],
[[0.5184531 , 0.49340045],
[0.41016984, 0.6423464 ]]],
[[[0.57849526, 0.8964175 ],
[0.86068404, 0.28210032]],
[[0.96660316, 0.66522324],
[0.74370325, 0.2124871 ]]],
[[[0.24575269, 0.7576513 ],
[0.6213573 , 0.80739546]],
[[0.79363906, 0.16595817],
[0.42819571, 0.05265415]]]], dtype=float32)>
>>> tns[1:3, ...]
# Or
>>> tns[1:3, :, :, :]
<tf.Tensor: shape=(2, 2, 2, 2), dtype=float32, numpy=
array([[[[0.57849526, 0.8964175 ],
[0.86068404, 0.28210032]],
[[0.96660316, 0.66522324],
[0.74370325, 0.2124871 ]]],
[[[0.24575269, 0.7576513 ],
[0.6213573 , 0.80739546]],
[[0.79363906, 0.16595817],
[0.42819571, 0.05265415]]]], dtype=float32)>
示例代碼:(用于生成亂數,您可以使用numpy.random.randint(start, end, num_number)
import tensorflow as tf
import numpy as np
class RandomKAggregator(tf.keras.layers.Layer):
def __init__(self, k=3):
super(RandomKAggregator, self).__init__()
self.k = k
def call(self, inputs):
rnd = np.random.randint(0, len(inputs), 1)[0]
return inputs[rnd:rnd self.k, ...]
layer = RandomKAggregator(k=10)
layer(tf.random.uniform((500,32,32,3))).shape
輸出:
TensorShape([10, 32, 32, 3])
編輯,如何選擇k random elements:(在評論中提問)
- 我們可以使用
tf.gather_nd并回傳隨機選擇的 k 個。
import tensorflow as tf
import numpy as np
class RandomKAggregator(tf.keras.layers.Layer):
def __init__(self, k=3):
super(RandomKAggregator, self).__init__()
self.k = k
def call(self, inputs):
rnd = np.random.randint(0, len(inputs), self.k)
return tf.gather_nd(inputs, rnd.reshape(-1,1))
layer = RandomKAggregator(k=10)
layer(tf.random.uniform((500,32,32,3))).shape
# TensorShape([10, 32, 32, 3])
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/491603.html
