これは長くて説明が難しいので、事前にお詫び申し上げます。
その上に標準の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
、単調性メトリックを取得することです。
ソフトマックス層の出力がこのように使用されている場合、勾配が定義されていないようです。
私は何か間違ったことをしていますか?どんな助けでも大歓迎です。