本文在前一章节的基础上做了如下改进:
1、步长与训练次数由定值改为取值范围,即在步长(0.01,1)之间训练次数在(1,100000)之间选取最优结果;
2、增加计时器,关注耗时;
import tensorflow as tf import numpy as np import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' import matplotlib.pyplot as plt import time as t begin = t.time() #定义在(-0.5,0.5)之间随机生成50个数,并转换为50*1矩阵 x_data = np.linspace(-0.5,0.5,50)[:,np.newaxis] #随机生成50个噪音值 noise = np.random.normal(0,0.02,x_data.shape) #y=x^2+noise y_data = np.square(x_data) + noise # x=tf.placeholder(tf.float32,[None,1]) x=tf.compat.v1.placeholder(tf.float32,[None,1]) # y=tf.placeholder(tf.float32,[None,1]) y=tf.compat.v1.placeholder(tf.float32,[None,1]) w_L1=tf.Variable(tf.random.normal([1,10])) b_L1=tf.Variable(tf.zeros([1,10])) wx_plut_b_L1=tf.matmul(x,w_L1)+b_L1 L1 = tf.nn.sigmoid(wx_plut_b_L1) w_L2=tf.Variable(tf.random.normal([10,1])) b_L2=tf.Variable(tf.zeros([1,1])) wx_plut_b_L2=tf.matmul(L1,w_L2)+b_L2 prediction= tf.nn.sigmoid(wx_plut_b_L2) loss = tf.reduce_mean(tf.square(y-prediction)) # train_step=tf.compat.v1.train.ProximalGradientDescentOptimizer(0.8).minimize(loss) with tf.compat.v1.Session() as sess: sess.run(tf.compat.v1.global_variables_initializer()) list = [] pre=[] j=0.01 num=100000 while j< 1: train_step = tf.compat.v1.train.ProximalGradientDescentOptimizer(j).minimize(loss) for i in range(num): sess.run(train_step, feed_dict={x:x_data,y:y_data}) if i % 100 == 0: print(i,sess.run(loss,feed_dict={x:x_data,y:y_data})) prediction_value = sess.run(prediction, feed_dict={x: x_data}) ss = str(j) + "," + str(i) + "," + str(sess.run(loss, feed_dict={x: x_data, y: y_data})) list.append(ss) pre.append(prediction_value) j+=0.1 i=1 error=[] for v in list: ss=v.strip().split(',')[2] error.append(ss) value=min(error)#选取最小误差 index=error.index(value) best=list[index]#得到最优解 predict=pre[index]#得到最优预测值,用于绘制图形 print(best) plt.figure() plt.scatter(x_data,y_data) end = t.time() time_spent = end-begin print('time cost :',time_spent,'s') plt.plot(x_data,predict,'r-',lw=5) plt.show()