Аз съм нов в theano и все още се боря със стила на "псевдокод" на theano от една страна и стриктната проверка на типа от друга. Аз съм повече програмист на C и програмист на python. Може ли някой да ми посочи къде греша в този примерен код, който използва средна квадратна грешка между прогнозирани y точки и обучение на y точки за стойности на x, за да получи оптималния наклон и пресечната точка на линейно прилягане?
Кодът е по-долу:
import numpy as np
import theano
import theano.tensor as T
from collections import OrderedDict
class LinearModel:
def __init__(self,num_points):
self.m = theano.shared(value=0.1,name='m')
self.b = theano.shared(value=1, name='b')
self.params = [self.m, self.b]
def step(x_t):
y_t = self.m * x_t + self.b
return y_t
self.x = T.matrix('x',dtype=theano.config.floatX)
self.y, _ = theano.scan(
fn=step,
sequences=self.x,
)
self.loss = lambda y_train: self.mse(y_train)
def mse(self, y_train):
return T.mean((self.y - y_train) ** 2)
def fit(self,x, y, learning_rate=0.01, num_iter=100):
trainset_x = theano.tensor._shared(x.astype(np.dtype(np.float32)),borrow=True)
trainset_y = theano.tensor._shared(y.astype(np.dtype(np.float32)),borrow=True)
n_train = trainset_x.get_value(borrow=True).shape[0]
cost = self.loss(trainset_y)
gparams = T.grad(cost,self.params)
l_r = T.scalar('l_r', dtype=theano.config.floatX)
updates = OrderedDict()
for param,gparam in zip(self.params,gparams):
updates[param] = param - l_r * gparam
self.train_model = theano.function( inputs=[l_r],
outputs=[cost,self.y],
updates=updates,
givens={
self.x: trainset_x,
}
)
epoch = 0
while epoch < num_iter:
cost, _ = self.train_model(learning_rate)
m = self.m.get_value()
b = self.b.get_value()
print "epoch: ",epoch," cost: ",cost," m: ",m," b: ",b
if __name__ == '__main__':
lin = LinearModel(10)
x = np.arange(10)
y = np.random.rand(10)
lin.fit(x,y,learning_rate=0.01,num_iter=100)
Грешката е:
Проследяване (последно последно извикване): Файл "~/EclipseWorkspace/MemoryNetworkQA.Theano/linear_regression.py", ред 70, в lin.fit(x,y,learning_rate=0.01,num_iter=100) Файл "~/EclipseWorkspace/MemoryNetworkQA .Theano/linear_regression.py", ред 54, във fit self.x: trainset_x, файл "/usr/local/lib/python2.7/dist-packages/theano/compile/function.py", ред 266, във функция profile=profile) Файл "/usr/local/lib/python2.7/dist-packages/theano/compile/pfunc.py", ред 489, в pfunc no_default_updates=no_default_updates) Файл "/usr/local/lib/python2. 7/dist-packages/theano/compile/pfunc.py", ред 217, в rebuild_collect_shared повдигнете TypeError(err_msg, err_sug)
TypeError: ('Една актуализация трябва да има същия тип като оригиналната споделена променлива (shared_var=b, shared_var.type=TensorType(int64, scalar), update_val=Elemwise{sub,no_inplace}.0, update_val.type=TensorType(float64 , скаларно)).', 'Ако разликата е свързана с модела на излъчване, можете да извикате функцията tensor.unbroadcast(var, axis_to_unbroadcast[, ...]), за да премахнете размерите, които могат да се излъчват.')