神经网络初试之一sin(x)

今天试着用神经网络实验sinx的拟合效果

(1)拟合数据

x_data = np.linspace(-1.0, 1.0, 300, dtype = np.float32)[:, np.newaxis]
noise = np.random.normal(0, 0.05, x_data.shape).astype(np.float32)
y_data = np.sin(x_data * np.pi * 360 / 180 ) - 0.5 + noise
#y_data = np.square(x_data) + 0.3 * x_data + 0.5

(2)拟合网络

def add_layer(input, in_size, out_size, activation_funtion = None):
    W = tf.Variable(tf.random_normal([in_size, out_size]))
    b = tf.Variable(tf.zeros([1, out_size]) +0.1)
    Wx_plus_b = tf.matmul(input, W) + b
    if activation_funtion == None:
        output = Wx_plus_b
    else:
        output = activation_funtion(Wx_plus_b)
    return output

xs = tf.placeholder(tf.float32, [None, 1])
ys = tf.placeholder(tf.float32, [None, 1])

l1 = add_layer(xs, 1, 10, activation_funtion=tf.nn.relu)
prediction = add_layer(l1, 10, 1, activation_funtion= None)

loss = tf.reduce_mean(tf.square(prediction - ys))

train = tf.train.AdamOptimizer(0.1).minimize(loss)

with tf.Session() as sess:
    sess.run(init)
    for i in range(1000):
        sess.run(train, feed_dict={xs:x_data, ys:y_data})
        if i % 50 == 0:
#             try:
#                 print("run remove")
#                 #lines.remove([lines[0]])
#             except Exception:
#                 pass
            predict_value = sess.run(prediction, feed_dict={xs:x_data, ys:y_data})
            lines = plt.plot(x_data, predict_value)
            plt.pause(0.1)
            #print(i, sess.run(prediction, feed_dict={xs:[[0.3]]})) ##test
            print(i,sess.run(loss, feed_dict={xs:x_data, ys:y_data})) ##train

下图是运行1000步的效果:还不错吧,在进行收敛,并且趋势开始对了。

。。。

在试试100000步的效果;目前貌似开始光滑了,待会上图。

目前24050步

目前看着感觉还是不错的。

现在总结一下哈:

x的范围很关键:刚开始为【0, 360】,结果没法收敛,后来缩放到【-1, 1】,很快进行收敛,所以在图像处理中个对输入值进行初始化确实是有一定的好处的。

猜你喜欢

转载自blog.csdn.net/gaotihong/article/details/81093666