저는 pymc3을 사용하여 keras (theano 백엔드) 모델에 사인 곡선을 맞추려고했습니다. 나는 이것 [http://twiecki.github.io/blog/2016/07/05/bayesian-deep-learning/]을 참조 점으로 사용하고 있습니다.Keras와 PYMC3를 사용하여 사인파를 피팅하면 예상치 못한 결과가 발생합니다.
최적화를 사용한 Keras 구현만으로는 적합하지만, pymc3의 Hamiltonian Monte Carlo 및 Variational 샘플링은 데이터에 적합하지 않습니다. 선행이 시작되는 지점에서 추적이 중단됩니다. 이전을 움직이면 후방 이동이 같은 지점으로 이동합니다. 셀 59에서 베이지안 모델의 후방 예측은 거의 사인파를 얻지 만 비 베이지안 적합 모델은 셀 63에서 완벽한 결과를 얻습니다. 여기에 노트와 코드를 표시합니다 : https://gist.github.com/tomc4yt/d2fb694247984b1f8e89cfd80aff8706. 여기
는class GaussWeights(object):
def __init__(self):
self.count = 0
def __call__(self, shape, name='w'):
return pm.Normal(
name, mu=0, sd=.1,
testval=np.random.normal(size=shape).astype(np.float32),
shape=shape)
def build_ann(x, y, init):
with pm.Model() as m:
i = Input(tensor=x, shape=x.get_value().shape[1:])
m = i
m = Dense(4, init=init, activation='tanh')(m)
m = Dense(1, init=init, activation='tanh')(m)
sigma = pm.Normal('sigma', 0, 1, transform=None)
out = pm.Normal('out',
m, 1,
observed=y, transform=None)
return out
with pm.Model() as neural_network:
likelihood = build_ann(input_var, target_var, GaussWeights())
# v_params = pm.variational.advi(
# n=300, learning_rate=.4
# )
# trace = pm.variational.sample_vp(v_params, draws=2000)
start = pm.find_MAP(fmin=scipy.optimize.fmin_powell)
step = pm.HamiltonianMC(scaling=start)
trace = pm.sample(1000, step, progressbar=True)
당신이 생각하는 것보다 더 구체적으로 생각할 수 있습니까? 언뜻보기에는 두 가지 모드에서 약간의 문제가있는 것처럼 보였지만 그렇지 않은 경우에는 괜찮습니다. (또한, 당신은'시그마 '를 정의하지만 어디에서도 사용하지 않습니다 ...) – aseyboldt
@aseyboldt 질문을 업데이트했습니다. 주요 문제는 이전에 시작된 위치에서 추적이 중단되어 추적 표시를 살펴 보는 것입니다. 이전을 움직이면 후방 이동이 같은 지점으로 이동합니다. 셀 59에서 베이지안 모델의 후방 예측은 사인파를 간신히 얻는 반면 비 베이지안 적합 모델은 셀 63에서 완벽하게 가깝습니다. 시그마는 사용되지 않지만 문제가되어서는 안됩니다. – tomc4yt
귀하의 모델은 귀하의 측정 값이 표준 출력 (std = 1)을 가진 네트워크 출력을 기준으로 정상적인 분포를 따른다 고 말하고 있습니다. 그런 다음 예측 값에서 x 값당 100 개의 값을 샘플링하고 중간 값을 취합니다. 이러한 샘플은 각 x 값에 대해 1 + posterior_variance의 분산을가집니다. 그들의 중앙값은 자연적으로 여전히 네트워크 출력에 따라 다릅니다. 모델이 당신이하는 일을 정확히하고있는 것 같습니다. – aseyboldt