신경망을 사용하여 도메인의 로그 함수를 1에서 100까지 근사하려고합니다. 나는 소프트웨어로 tensorflow
을 사용합니다. 결과는 내가 기대했던 것만 큼 좋지 않아서 왜 그 이유를 알고 싶습니다. I는 다음 코드를 사용신경망을 이용한 근사 함수
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
## == data to be approximated == ##
x_grid = np.array([np.linspace(1, 100, 100)]).T
y_grid = np.log(x_grid)
def deepnn(x_val, prior):
"""
A neural network with input values x. Its parameters might be constraint according to a prior.
"""
## == input layer == ##
if prior:
w_in = tf.constant(1., shape=[1, 2]) #fixed to one
b_in = tf.constant([-1., -20.]) # fixed along kinks of the log function
else:
w_in = weight_variable([1, 2])
b_in = bias_variable([2])
f_in = tf.matmul(x_val, w_in) + b_in
## == first hidden layer == ##
g_1 = tf.nn.relu(f_in)
## == output layer == ##
w_out = weight_variable([2, 1])
b_out = bias_variable([1])
y_predict = tf.matmul(g_1, w_out) + b_out
return y_predict
def weight_variable(shape):
"""
generate a weight variable of a given shape
"""
initial = tf.truncated_normal(shape, stddev=0.1)
return tf.Variable(initial)
def bias_variable(shape):
"""
generates a bias variable of a given shape
"""
initial = tf.constant(0.1, shape=shape)
return tf.Variable(initial)
x_given = tf.placeholder(tf.float32, [None, 1])
y_out = deepnn(x_given, False)
y = tf.placeholder(tf.float32, [None, 1])
squared_deltas = tf.square(y_out - y)
loss = tf.reduce_sum(squared_deltas)
optimizer = tf.train.AdamOptimizer(1e-3)
train = optimizer.minimize(loss)
sess = tf.InteractiveSession()
init = tf.global_variables_initializer()
sess.run(init)
for i in range(50000):
sess.run(train, {x_given: x_grid, y: y_grid})
print(sess.run(loss, {x_given: x_grid, y: y_grid}))
sess.close()
신경망 deepnn(x_val, prior)
두 가지 형태가 될 수 prior
이 참이면, 상기 입력 층 함수 tf.matmul(x_val, w_in) + b_in
대한 파라미터 w_in = 1
및 b_in = [-1, -20]
설정된다. b_in
에 대한 이러한 값은 네트워크가 x = 20
에 꼬임을 갖도록합니다. prior
이 false이면 매개 변수 값은 w
및 b=0.1
에 대한 임의 변수로 초기화됩니다. (값과 컴퓨터 코드는 tensorflow guide에서 영감을 얻었습니다.) 입력은 정류기 활성화 기능과 출력 레이어가있는 숨겨진 레이어로 전달됩니다. 네트워크가 사전에 준수해야하는지 여부는 라인 y_out = deepnn(x_given, False)
에 정의되어 있습니다.
사전 제한이없는 신경망은 이전의 네트워크에 비해 열등한 결과를 (거의 항상) 생성합니다. 네트워크는 단순히 선형 함수와 유사합니다. 흥미롭게도, 제한되지 않은 네트워크는 한때 아주 좋은 솔루션을 만들어 냈지만, 이후의 재판에서 복제 할 수 없었습니다. 결과는 아래 그림에서 시각화됩니다.
네트워크를 잘 훈련시킬 수없는 이유를 누군가가 친절하게 설명 할 수 있습니까?
이 당신의 제안을 주셔서 감사합니다 :
은 BTW 정확히 무엇을하는 것이 말했다 않는 기능이 있습니다! 당신은 어쩌면 강한 사전 가정없이 내가 사용하는 네트워크가 잘 훈련시키지 못하는 이유를 알고 있습니까? 신경망의 추정 된 파라미터는 손실 함수를 최소화하지 않는다. – fabian