一次函数
对于拟合一元一次函数,我们只需要一个神经元:
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
import numpy as np
import matplotlib.pyplot as plt
import os
#tf.enable_eager_execution()
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
x_test = np.linspace(-200,200,1000)
y_test = x_test * 3.14 + 2.12
x_data = np.random.uniform(-100,100,10000)
y_data = x_data * 3.14 + 2.12 + np.random.normal(0,20,10000)
plt.plot(x_data,y_data,'.')
plt.plot(x_test,y_test)
model = tf.keras.Sequential()
model.add(layers.Dense(1, activation=None))
model.compile(optimizer=tf.keras.optimizers.Adam(0.1),
loss='mse', # mean squared error
metrics=['mae']) # mean absolute error
model.fit(x_data.reshape(-1,1), y_data.reshape(-1,1), epochs=10, batch_size=20)
y_pred = model.predict(x_test,batch_size=20)
plt.plot(x_test,y_pred,'--')
注意此时我们不需要激发函数,所以将神经元中的激发函数设置为None。(也可以设置为linear)
神经网络模型中需要注意的是输出层的神经元数量需要与y_data的维度相同。
如果y_data的维度为1,输出层有n个神经元,则之后的预测值y_pred也会相应的维度变为n,并且每一个维度数值相同。
如果输出层有1一个神经元,y_data的维度为n,则之后的预测值y_pred维度变为1,训练结果更接近y_data取均值后的结果。这可能是矩阵运算中的降维处理造成的。
其他维度不匹配的情况会报错。
线性拟合
我们尝试拟合一个多元线性模型:
k1 = 3.14
k2 = 5.67
k3 = 2
k4 = 2
b = 10
beta = 2
x1_data = np.random.uniform(-100,100,10000)
x2_data = np.random.uniform(-100,100,10000)
x3_data = np.random.uniform(-100,100,10000)
x4_data = np.random.uniform(-100,100,10000)
be_data = np.zeros(10000)
be_data