*简介:实践是学习的最佳手段,为了学习tensorflow.keras相关库,这里使用全连接神经网络拟合一段一元二次函数
问题描述:
借助tensorflow.keras相关库,使用全连接神经网络,拟合一段一元二次函数
函数表达式为:y = 3 * (x^2), x的范围为[0,10]。
构建数据集:
构建数据集的函数如下:
def generate_data(phase):
"""
返回数据集
:param phase: string
:return: {'input':[], 'label':[]}
"""
if phase == 'train':
x1 = np.linspace(0,10, 400)
np.random.shuffle(x1)
X = np.array([[i] for i in x1])
labels = np.array([[target_fun(x[0])] for x in X])
train_data = {
'input': X,
'label': labels
}
return train_data
elif phase == 'test':
x1 = np.random.random(10)*10
x1.sort()
X = np.array([[i] for i in x1])
labels = np.array([[target_fun(x[0])] for x in X])
test_data = {
'input': X,
'label': labels
}
return test_data
else:
print('请输入train或者test')
def target_fun(x):
"""
y = 3 * (x**2)
:param x: int
:return:
"""
return 3 * (x**2)
搭建神经网络:
使用tensorflow.keras搭建神经网络的代码如下:
class DemoNet(object):
def __init__(self):
self.model = None
self.build_net()
def build_net(self):
self.model = tf.keras.Sequential()
# self.model.add(layers.Dense(10, activation='relu'))
self.model.add(layers.Dense(30, activation='relu'))
self.model.add(layers.Dense(1, activation=None))
self.model.compile(optimizer='rmsprop',
loss = tf.keras.losses.mse,
metrics=['mae'])
def train(self, data):
"""
训练神经网络
:param data:
:return:
"""
input = data['input']
label = data['label']
print('开始训练...')
self.model.fit(input, label, epochs = 3000, batch_size=30)
print('结束训练.')
print('开始保存数据...')
self.model.save('trained_model.h5')
print('保存数据完成.')
def test_data(self, data):
"""
测试神经网络
:return:
"""
self.load_weights()
input = data['input']
label = data['label']
predicts = self.model.predict(input)
# 绘图
X_input = [i[0] for i in input]
Y_label = [i[0] for i in label]
Y_predict = [i[0] for i in predicts]
plt.plot(X_input, Y_label, label='true value')
plt.plot(X_input, Y_predict, label='predict value', ls='--')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()
def load_weights(self):
self.model = tf.keras.models.load_model('trained_model.h5')