一、什么是Keras
Keras 是一个用 Python 编写的高级神经网络 API,它能够以 , , 或者 作为后端运行。
具体可以参考:
通过之前的例子 我们发现tensorflow的入门门槛还是比较高的
而且个人感觉其对于神经网络中各个层的定义不是很明确,是通过定义层到层之间的参数来确定的
而Keras就很明确的定义了层的概念,反过来层与层之间的参数反倒是用户不需要关心的对象
所以构建神经网络的方法对于普通开发者来说,相对tensorflow,Keras更易上手
而Keras也是tensorflow官方在tensorflow2.0开始墙裂推荐使用的
二、将之前的例子改成Keras实现
删除tf.placeholder占位、tf.Variable变量、模型、损失函数、优化器的定义(其实就是将所以的都删除了^_^)
使用tf.keras构建模型
这里直接使用tf.keras.Sequential来构建一个最简单的线性模型
model = tf.keras.Sequential()
向模型中添加层两个全连接层作为隐藏层
model.add(tf.keras.layers.Dense(10))model.add(tf.keras.layers.Dense(10))
再添加一个全连接层作为输出层
model.add(tf.keras.layers.Dense(1))
配置模型的损失函数和优化器,依然使用AdamOptimizer优化器'adam',损失函数依然是方差'mse'
(注意:在tensorflow1.13中可以写成optimizer=tf.train.AdamOptimizer(0.001),但是tensorflow2.0中必须写成optimizer='adam')
model.compile(optimizer='adam', loss='mse')
通过model.fit开始训练,依然训练5000次
这里需要将x和y转化为二维的numpy矩阵(model.fit的输入支持的参数可以查看官网API:)
for _ in range(5000): x_train, y_train = create_data(True) x_train = np.array(x_train, ndmin=2) y_train = np.array(y_train, ndmin=2) model.fit(x_train, y_train)
使用训练好的模型进行预测(依然需要将x转化为二维的numpy矩阵)
for _ in range(10): x_data, y_data = create_data(False) x_data = np.array(x_data, ndmin=2) prediction_value = model.predict(x_data) print("x=", x_data, "y预测=", prediction_value, "y实际=", y_data)
预测结果为:
x= [[16.8307033]] y预测= [[65.21274]] y实际= 66.44764860292732x= [[12.11375358]] y预测= [[40.489502]] y实际= 41.30630660712863x= [[26.50665706]] y预测= [[115.927895]] y实际= 118.02048213508458x= [[23.92639848]] y预测= [[102.40385]] y实际= 104.26770387755393x= [[28.40950307]] y预测= [[125.90141]] y实际= 128.16265135441537x= [[4.02130059]] y预测= [[-1.9259634]] y实际= -1.8264678301731045x= [[24.24050166]] y预测= [[104.05016]] y实际= 105.94187387358106x= [[29.71602577]] y预测= [[132.74937]] y实际= 135.126417345193x= [[22.21779693]] y预测= [[93.44843]] y实际= 95.16085765597148x= [[25.86439061]] y预测= [[112.56156]] y实际= 114.59720195233699
====================================================
完整代码如下,在python3.6.8、tensorflow1.13/tensorflow2.0.0-alpha0 环境下成功运行
import randomimport numpy as npimport tensorflow as tfdef create_data(for_train=False): w = 5.33 b = -23.26 x = random.random() * 30 y = w * x + b if for_train: noise = (random.random() - 0.5) * 10 y += noise return x, ydef run(): model = tf.keras.Sequential() model.add(tf.keras.layers.Dense(10)) model.add(tf.keras.layers.Dense(10)) model.add(tf.keras.layers.Dense(1)) model.compile(optimizer='adam', loss='mse') for _ in range(5000): x_train, y_train = create_data(True) x_train = np.array(x_train, ndmin=2) y_train = np.array(y_train, ndmin=2) model.fit(x_train, y_train) for _ in range(10): x_data, y_data = create_data(False) x_data = np.array(x_data, ndmin=2) prediction_value = model.predict(x_data) print("x=", x_data, "y预测=", prediction_value, "y实际=", y_data)if __name__ == "__main__": run()