2017-04-24 33 views
9

Çoğunlukla bazı eğitimlere dayanan birkaç basit model oluşturdum. Yaptığım şeyden, modellerin yeniden kullanılması oldukça zor olduğunu hissediyorum ve modelleri kapsüllemek için sınıfları olan bir yapı oluşturmam gerektiğini hissediyorum.Tensorflow modelleri için tasarım desenleri

Tensorflow modellerinin yapılandırılmasının 'standart' yöntemleri nelerdir? Bunun için kodlama kuralları/en iyi uygulamalar var mı?

+0

Soru çok geniş değil. Google'da Tensorflow ve oradan birileri yapı modellerini yapılandırmak için güzel olurdu. –

cevap

3
Tensorflow örneklerde

ve üç fonksiyonları içine modeli bölmek için olan yapılanma modeli kodu için önemli desen Derslikler:

  • inference(inputs, ...) üstünde kaybını ekler modeli
  • loss(logits, ...) kurar logits eğitim op

bir model fo oluşturarak ekler

  • train(loss, ...) Bu desen, örneğin (code, tutorial) için cifar-10 Öğreticisi kullanılır

    inputs = tf.placeholder(...) 
    logits = mymodel.inference(inputs, ...) 
    loss = mymodel.loss(logits, ...) 
    train = mymodel.train(loss, ...) 
    

    : r eğitimi, kod aşağıdaki gibi görünecektir.

    Yanıp sönen bir şey, inference ve loss işlevi arasındaki (Python) değişkenleri paylaşamayacağınız gerçektir. Tensorflow'un tam olarak bu kullanım için Graph collections sağladığından, bu daha büyük bir sorun değil, çünkü daha temiz bir tasarım için (mantıklı bir şekilde sizi gruplandırır). Bunun başlıca kullanım amaçlarından biri düzenlileştirme geçerli:

    zaten tüm düzenlileştirme cezaları varsayılan olarak koleksiyona tf.GraphKeys.REGULARIZATION_LOSSES için (source) eklenecektir beri, ne gerek var layers modülünü (örn tf.layers.conv2d) kullanıyorsanız.

    conv1 = tf.layers.conv2d(
        inputs, 
        filters=96, 
        kernel_size=11, 
        strides=4, 
        activation=tf.nn.relu, 
        kernel_initializer=tf.truncated_normal_initializer(stddev=0.01), 
        kernel_regularizer=tf.contrib.layers.l2_regularizer(), 
        name='conv1') 
    

    Sen kaybedersin bu o gibi görünebilir: Örneğin: Bunu yaparken

    def loss(logits, labels): 
        softmax_loss = tf.losses.softmax_cross_entropy(
         onehot_labels=labels, 
         logits=logits) 
    
        regularization_loss = tf.add_n(tf.get_collection(
         tf.GraphKeys.REGULARIZATION_LOSSES))) 
    
        return tf.add(softmax_loss, regularization_loss) 
    

    Eğer katmanlar modülünü kullanmıyorsanız, el (sadece olduğu gibi koleksiyon doldurmak zorunda kalacak bağlı kaynak snippet'i). Temel olarak tf.add_to_collection kullanarak koleksiyona cezalar eklemek istiyorum: Bu grubu

    tf.add_to_collection(tf.GraphKeys.REGULARIZATION_LOSSES, reg_penalty) 
    

    sadece yukarıdaki gibi düzenlileştirme cezaları dahil kaybını hesaplayabilir.

  • +0

    Güzel bir desen, ama burada bir sorun var. Kaybın bir parçası olarak düzenli bir dönemimiz varsa işe yaramaz. –

    +0

    Grafik Koleksiyonları kullanarak bunu yapmanın iyi bir yolu var, cevabı güncelledim. – thertweck