如何在类中访问theano符号变量的值?

时间:2015-02-09 04:04:45

标签: python machine-learning theano perceptron deep-learning

我想访问my_classifier.y_binary的值。我的目标是计算my_classifier.error。

我知道如何使用eval获取my_classifier.y_hat的值,但是当输入是自参数时,我不知道如何使用它。

由于

# imports
import theano
import theano.tensor as T
import numpy as np
import matplotlib.pyplot as plt
import os, subprocess

class Perceptron(object):
    """Perceptron for the last layer
    """
    def __init__(self, input, targets, n_features):
        """ Initialize parameters for Perceptron

        :type input:theano.tensor.TensorType
        :param input:symbolic variable that describes the 
                     input of the architecture

        :type targets:theano.tensor.TensorType
        :param targets:symbolic variable that describes the 
                       targets of the architecture

        :type n_features:int
        :param n_features:number of features 
                          (including "1" for bias term)   

        """

        # initilialize with 0 the weights W as a matrix of shape 
        # n_features x n_targets

        self.w = theano.shared( value=np.zeros((n_features), dtype=theano.config.floatX),
                                name='w',
                                borrow=True
                                )  

        self.y_hat = T.nnet.sigmoid(T.dot(input,self.w))  
        self.y_binary = self.y_hat>0.5
        self.binary_crossentropy = T.mean(T.nnet.binary_crossentropy(self.y_hat,targets))  
        self.error= T.mean(T.neq(self.y_binary, targets))      

# create training data
features = np.array([[1., 0., 0],[1., 0., 1.], [1.,1.,0.], [1., 1., 1.]])
targets = np.array([0., 1., 1., 1])
n_targets = features.shape[0]
n_features = features.shape[1]

# Symbolic variable initialization
X = T.matrix("X")
y = T.vector("y")   

my_classifier = Perceptron(input=X, targets=y,n_features=n_features)  
cost = my_classifier.binary_crossentropy 
error = my_classifier.error  
gradient = T.grad(cost=cost, wrt=my_classifier.w)
updates = [[my_classifier.w, my_classifier.w-gradient*0.05]]  
# compiling to a theano function
train = theano.function(inputs = [X,y], outputs=cost, updates=updates, allow_input_downcast=True)

# iterate through data
# Iterate through data
l = np.linspace(-1.1,1.1)
cost_list = []
for idx in range(500):
    cost = train(features, targets)
    if my_classifier.error==0:
        break

2 个答案:

答案 0 :(得分:0)

如果你想要图中节点的值,你需要编译一个函数来获取它。我觉得像

y_binary = theano.function(inputs = [X,], outputs=my_classifier.y_binary, allow_input_downcast=True)

应该为您提供函数y_binary(),并且调用y_binary(features)应该转发传播网络并产生二值化输出。

答案 1 :(得分:0)

编译功能是一个更好的选择,但是当你以快速而肮脏的方式设置内容时,就像这样:

像这样:

while (epoch < n_epochs):    
        epoch = epoch + 1    
        for minibatch_index in range(n_train_batches):
            minibatch_avg_cost = train_model(minibatch_index)
            iter = (epoch - 1) * n_train_batches + minibatch_index
            print("**********************************")
            print(classifier.hiddenLayer.W.get_value()) 

完整代码:https://github.com/timestocome/MiscDeepLearning/blob/master/MLP_iris2.py

我认为在您的示例中,您使用&#39; my_classifier.w.get_value()&#39;