>

훈련 가능한 방식으로 여러 대안 중에서 무작위로 하나의 실행 흐름을 선택하는 방법은 무엇입니까? 예를 들면 다음과 같습니다.

import random
from tensorflow import keras
class RandomModel(keras.Model):
    def __init__(self, model_set):
        super(RandomModel, self).__init__()
        self.models = model_set

    def call(self, inputs):
        """Calls one of its models at random"""
        return random.sample(self.models, 1)[0](inputs)

def new_model():
    return keras.Sequential([
        keras.layers.Dense(10, activation='softmax')
    ])
model = RandomModel({new_model(), new_model()})
model.build(input_shape=(32, 784))
model.summary()

이 코드는 실행 하는 동안 그라디언트를 허용하지 않는 것 같습니다 역 전파. 출력입니다 :

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
Total params: 0
Trainable params: 0
Non-trainable params: 0
_________________________________________________________________

  • 답변 # 1

    이 방법을 찾았습니다. 그러나 중첩 된 tf.cond 로 인해 실행이 느립니다.  작업 :

    def random_network_applied_to_inputs(inputs, networks):
        """
        Returns a tf.cond tree that does binary search
        before applying a network to the inputs.
        """
        length = len(networks)
        index = tf.random.uniform(
            shape=[],
            minval=0,
            maxval=length,
            dtype=tf.dtypes.int32
        )
        def branch(lower_bound, upper_bound):
            if lower_bound + 1 == upper_bound:
                return networks[lower_bound](inputs)
            else:
                center = (lower_bound + upper_bound) // 2
                return tf.cond(
                    pred=index < center,
                    true_fn=lambda: branch(lower_bound, center),
                    false_fn=lambda: branch(center, upper_bound)
                )
        return branch(0, length)
    
    

  • 이전 python - 쉼표로 이상한 구문
  • 다음 javascript - 구문 강조를 즉시 수행 할 수있는 텍스트 영역?