0

これは長くて説明が難しいので、事前にお詫び申し上げます。

その上に標準のMLPレイヤーを備えた通常のCNNのようなネットワークがあります。MLP の上にもソフトマックス層がありますが、従来のネットワークとは異なり、これは下の MLP に完全に接続されておらず、サブグループで構成されています。

ソフトマックスをさらに説明すると、次のようになります。

Neur1A Neur2A ... NeurNA      Neur1B Neur2B ... NeurNB   Neur1C Neur2C ...NeurNC
        Group A                           Group B                Group C

もっとたくさんのグループがあります。各グループには、他のグループから独立したソフトマックスがあります。つまり、ある意味では、いくつかの独立した分類です (実際にはそうではありませんが)。

私が必要とするのは、活性化されたニューロンのインデックスがグループ間で単調に増加することです。たとえば、グループ A の Neuron5 をアクティブにした場合、グループ B のアクティブなニューロンを >=5 にする必要があります。グループB、グループCなども同様です。

すべてのグループのすべてのニューロンを含むこのソフトマックス層は、実際には最後の層ではなく、興味深いことに中間層です。

この単調性を達成するために、非単調活性化ニューロン インデックスにペナルティを課す別の項を損失関数に追加します。コードの一部を次に示します。

ソフトマックス層のコードとその出力:

def compute_image_estimate(layer2_input):
    estimated_yps= tf.zeros([FLAGS.batch_size,0],dtype=tf.int64)
    for pix in xrange(NUM_CLASSES):
        pixrow= int( pix/width)
        rowdata= image_pixels[:,  pixrow*width:(pixrow+1)*width]

        with tf.variable_scope('layer2_'+'_'+str(pix)) as scope:
            weights = _variable_with_weight_decay('weights', shape=[layer2_input.get_shape()[1], width],   stddev=0.04, wd=0.0000000)
            biases = _variable_on_cpu('biases', [width], tf.constant_initializer(0.1))
            y = tf.nn.softmax(tf.matmul(layer2_input,weights) + biases)
            argyp=width-1-tf.argmax(y,1)
            argyp= tf.reshape(argyp,[FLAGS.batch_size,1])
        estimated_yps=tf.concat(1,[estimated_yps,argyp])

        return estimated_yps

Estimated_yps は、単調性を定量化する関数に渡されます。

def compute_monotonicity(yp):
    sm= tf.zeros([FLAGS.batch_size])

    for curr_row in xrange(height):
        for curr_col in xrange(width-1):
            pix= curr_row *width + curr_col
            sm=sm+alpha * tf.to_float(tf.square(tf.minimum(0,tf.to_int32(yp[:,pix]-yp[:,pix+1]))))

    return sm

損失関数は次のとおりです。

def loss(estimated_yp, SOME_OTHER_THINGS):
    tf.add_to_collection('losses', SOME_OTHER_THINGS)

    monotonicity_metric= tf.reduce_mean( compute_monotonocity(estimated_yp) )
    tf.add_to_collection('losses', monotonicity_metric)
    return tf.add_n(tf.get_collection('losses'), name='total_loss')

今私の問題は、従来のメトリックである SOME_OTHER_THINGS を使用しない場合ValueError: No gradients provided for any variable、単調性メトリックを取得することです。

ソフトマックス層の出力がこのように使用されている場合、勾配が定義されていないようです。

私は何か間違ったことをしていますか?どんな助けでも大歓迎です。

4

1 に答える 1