Как определить вес / отклонения обученной модели и назначить их конкретным слоям? - PullRequest
0 голосов
/ 25 июня 2018

В настоящее время я вхожу в схватку с TensorFlow и реализовал базовую многослойную модель персептрона с 3 скрытыми слоями, следуя инструкциям sentdex на YouTube.

Мне было интересно, как я могу получить эти обученные веса / смещения каждого слоя и, если возможно, также назначить эти восстановленные матрицы определенному слою и т. Д. Хотя для меня, вероятно, нет особого смысла делать это, моя цель просто для того, чтобы поэкспериментировать и увидеть результат воздействия, а также познакомиться с TensorFlow.

Я рассмотрел некоторые предложения, чтобы использовать tf.trainable_variables(), но все еще не могу прийти в себя. Я могу думать о том, чтобы инициализировать, а затем назначить ему предопределенные переменные в конце, что может быть немного беспорядочно, даже если оно работает.

class expFFNN():

def __init__(self):


    self.nNodesHidL1 = 500
    self.nNodesHidL2 = 500
    self.nNodesHidL3 = 500

    self.nClass = 10
    self.batch_size = 100

    self.x = tf.placeholder('float', [None, 784])
    self.y = tf.placeholder('float')

    self.h1Weights = tf.Variable(tf.random_normal([784, self.nNodesHidL1]))
    self.h2Weights = tf.Variable(tf.random_normal([self.nNodesHidL1, self.nNodesHidL2]))
    self.h3Weights = tf.Variable(tf.random_normal([self.nNodesHidL2, self.nNodesHidL3]))
    self.outWeights = tf.Variable(tf.random_normal([self.nNodesHidL3, self.nClass]))

    self.h1Biases = tf.Variable(tf.random_normal([self.nNodesHidL1]))
    self.h2Biases = tf.Variable(tf.random_normal([self.nNodesHidL2]))
    self.h3Biases = tf.Variable(tf.random_normal([self.nNodesHidL3]))
    self.outBiases = tf.Variable(tf.random_normal([self.nClass]))

    self.finH1W = []
    self.finH2W = []
    self.finH3W = []

    self.finH1B = []
    self.finH2B = []
    self.finH2B = []


def neural_network_model(self, data):
    h1Layer = {'weights':self.h1Weights,
               'biases':self.h1Biases}

    h2Layer = {'weights':self.h2Weights,
               'biases':self.h2Biases}

    h3Layer = {'weights':self.h3Weights,
               'biases':self.h3Biases}

    outputLayer = {'weights':self.outWeights,
               'biases':self.outBiases}

    layer1 = tf.add(tf.matmul(data, h1Layer['weights']), h1Layer['biases']) 
    layer1 = tf.nn.relu(layer1)

    layer2 = tf.add(tf.matmul(layer1, h2Layer['weights']), h2Layer['biases']) 
    layer2 = tf.nn.relu(layer2) 

    layer3 = tf.add(tf.matmul(layer2, h3Layer['weights']), h3Layer['biases']) 
    layer3 = tf.nn.relu(layer3)

    output = tf.add(tf.matmul(layer3, outputLayer['weights']), outputLayer['biases']) 

    return output    


def trainNeuralNetwork(self, x):
    y = self.y
    prediction = neural_network_model(self, x)
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=prediction, labels=self.y))
    optimizer = tf.train.AdamOptimizer().minimize(cost)

    hmEpochs = 3

    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())

        for epoch in range(hmEpochs):
            epochLoss = 0

            for _ in range(int(mnist.train.num_examples/self.batch_size)):
                epoch_x, epoch_y = mnist.train.next_batch(self.batch_size)
                _, c = sess.run([optimizer, cost], feed_dict = {self.x:epoch_x, self.y:epoch_y})
                epochLoss += c
            print ('Epoch', epoch, 'completed out of', hmEpochs, 'loss:', epochLoss)

        correct = tf.equal(tf.argmax(prediction, 1), tf.argmax(y, 1))
        accuracy = tf.reduce_mean(tf.cast(correct, 'float'))

        self.finH1W = self.h1Weights
        self.finH2W = self.h2Weights
        self.finH3W = self.h3Weights

        self.finH1B = self.h1Biases
        self.finH2B = self.h2Biases
        self.finH3B = self.h3Biases

        print('Accuracy', accuracy.eval({x:mnist.test.images, self.y:mnist.test.labels}))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...