2

신경망을 사용하여 도메인의 로그 함수를 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 = 1b_in = [-1, -20] 설정된다. b_in에 대한 이러한 값은 네트워크가 x = 20에 꼬임을 갖도록합니다. prior이 false이면 매개 변수 값은 wb=0.1에 대한 임의 변수로 초기화됩니다. (값과 컴퓨터 코드는 tensorflow guide에서 영감을 얻었습니다.) 입력은 정류기 활성화 기능과 출력 레이어가있는 숨겨진 레이어로 전달됩니다. 네트워크가 사전에 준수해야하는지 여부는 라인 y_out = deepnn(x_given, False)에 정의되어 있습니다.

사전 제한이없는 신경망은 이전의 네트워크에 비해 열등한 결과를 (거의 항상) 생성합니다. 네트워크는 단순히 선형 함수와 유사합니다. 흥미롭게도, 제한되지 않은 네트워크는 한때 아주 좋은 솔루션을 만들어 냈지만, 이후의 재판에서 복제 할 수 없었습니다. 결과는 아래 그림에서 시각화됩니다. Function Approximation with a Neural Network

네트워크를 잘 훈련시킬 수없는 이유를 누군가가 친절하게 설명 할 수 있습니까?

답변

1

코드를 철저히 검사하지는 않았지만 비선형 네트워크를 사용하지 않는 것으로 보입니다. 네트워크는 얕은 하나 (숨겨진 레이어가 1 개)이므로 깊숙이 있어야합니다 (함수에서 언급 한 것처럼) 더 많은 레이어가 필요합니다. 또한 레이어에 노드가 더 필요하다고 생각합니다. 최소한 2 개의 숨겨진 레이어를 사용해보십시오. tf.nn.xw_plus_b

+0

이 당신의 제안을 주셔서 감사합니다 :

은 BTW 정확히 무엇을하는 것이 말했다 않는 기능이 있습니다! 당신은 어쩌면 강한 사전 가정없이 내가 사용하는 네트워크가 잘 훈련시키지 못하는 이유를 알고 있습니까? 신경망의 추정 된 파라미터는 손실 함수를 최소화하지 않는다. – fabian