标题利用简单的三层神经网络来训练sin函数和cos函数的模型,根据预测值画出相应的函数图像。tensorflow实现过程如下:
- 配置超参数
class Config:
def __init__(self):
self.lr = 0.001
self.epoches = 2000
self.samples = 200 #训练样本数量
self.hidden_units = 200 #隐藏层神经元个数
- 获取训练样本
class Sample:
def __init__(self, samples):
self.xs = np.random.uniform(-np.pi, np.pi, [samples]) #随机正太分布生成-pi到pi的随机数作为样本x
self.xs = sorted(self.xs)
self.ys = np.sin(self.xs), np.cos(self.xs) #样本目标值[2,-1]
- 搭建神经网络
class Tensor:
def __init__(self, config: Config):
self.x = tf.placeholder(tf.float32, [None], name='x') # [200]
self.y = tf.placeholder(tf.float32, [2,None], name='y') #[2,-1]
x = tf.reshape(self.x, [-1, 1]) # 元素转化为张量
x = tf.layers.dense(x, config.hidden_units, tf.nn.relu)
self.y_predict = tf.layers.dense(x, 2) #[-1,2]
y = tf.transpose(self.y) #使目标值的shape与预测值相同
self.loss = tf.reduce_mean(tf.square(self.y_predict - y)) #计算loss
self.lr = tf.placeholder(tf.float32, [], 'lr')
opt = tf.train.AdamOptimizer(self.lr) #训练优化器
self.train_op = opt.minimize(self.loss)
self.loss = tf.sqrt(self.loss)
- 编写应用对象
class App:
def __init__(self, config: Config):
self.ts = Tensor(config) #实例化张量网络
self.config = config
self.session = tf.Session() #创建会话
self.session.run(tf.global_variables_initializer()) #初始化变量
def train(self): #训练方法
sample = Sample(200)
for epoche in range(self.config.epoches):
_, loss = \
self.session.run([self.ts.train_op, self.ts.loss],
{self.ts.x: sample.xs, self.ts.y: sample.ys, self.ts.lr: self.config.lr})#喂入训练数据
print(f"{epoche}:{loss}")
return sample.xs, sample.ys #返回样本数据
def predict(self): #预测方法
sample = Sample(400)
ys = self.session.run(self.ts.y_predict, {self.ts.x: sample.xs}) #喂入预测数据
return sample.xs, ys #返回预测数据
def close(self):
self.session.close()
- 主方法
if __name__ == '__main__':
app = App(Config())
xs_raw, ys_raw = app.train()
predict_x, predict_y = app.predict()
plt.plot(predict_x, predict_y)
plt.legend(['predict_sin','predict_cos'])
plt.show()
- 结果