Я новичок в 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, в соответствии с 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) File "/usr/local/lib/python2. 7/dist-packages/theano/compile/pfunc.py", строка 217, в reboot_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[, ...]) для удаления широковещательных измерений.')