初学者在调用keras时,不需要纠结于选择tf.keras还是直接import keras,现如今两者没有区别。从具体实现上来讲,Keras是TensorFlow的一个依赖(dependency)。但,从设计上希望用户只透过TensorFlow来使用,即tf.keras。
所以在此主要记录一下tf.keras.models的使用。
函数型模型
即利用函数API,从inputs开始,然后指定前向过程,根据输入和输出建立模型。
由于Layer提供了集中函数式的调用方式,通过这种调用构建层与层之间的网络模型。
所以其编程特点:
1. 我们构建层,通过layer对象的可调用特性,或者使用apply与call实现链式函数调用。
2. Model只需通过inputs和outputs。
示例1:
1. 导入
import tensorflow as tf import tensorflow.keras as keras import tensorflow.keras.layers as layers import sklearn.datasets as datasets
2. 定义layer层
input_layer = keras.Input(shape=(4,)) # 隐藏层:8-4 hide1_layer = layers.Dense(units=8, activation='relu') hide2_layer = layers.Dense(units=4, activation='relu') # 输出层:1 output_layer = layers.Dense(units=1, activation='sigmoid')
3. 构建layer之间的函数链式关系
hide1_layer_tensor = hide1_layer(input_layer) hide2_layer_tensor = hide2_layer(hide1_layer_tensor) output_layer_tensor = output_layer(hide2_layer_tensor)
这里同样可以使用layer的apply函数,相当于`self.__call__`的别名,将输入(参数)应用在layer上。
hide1_layer_tensor = hide1_layer(input_layer) hide2_layer_tensor = hide2_layer(hide1_layer_tensor) output_layer_tensor = output_layer(hide2_layer_tensor)
4. 使用inputs与outputs建立函数链式模型
model = keras.Model(inputs=input_layer, outputs=output_layer_tensor)
5. 训练
# .1 训练参数 model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['mse']) # .2 训练 data, target = datasets.load_iris(return_X_y=True) data = data[:100, :] target = target[:100] model.fit(x=data, y=target, batch_size=10, epochs=100, verbose=0)
6. 预测
# .3 预测评估 pre_result = model.predict(data) category = [0 if item<=0.5 else 1 for item in pre_result] accuracy = (target == category).mean() print(F'分类准确度:{accuracy*100.0:5.2f}%', )
输出结果:分类准确度:99.00%
顺序式模型
顺序式模型的编程特点:
1. Layer提供input与output属性;
2. Sequential类通过Layer的input与output属性来维护层之间的关系,构建网络模型;
其中第一层必须是InputLayer或者Input函数构建的张量;
实例
导入和定义layer就不再赘述,仅在步骤3、4的有所改变,可直接使用Sequential构建顺序模型,即使用add方法直接添加layer。
seq_model = keras.Sequential() seq_model.add(input_layer) seq_model.add(hide1_layer) seq_model.add(hide2_layer) seq_model.add(output_layer)
使用layer参数构建模型
seq_model = keras.Sequential(layers=[input_layer, hide1_layer, hide2_layer, output_layer])
之后的训练中不要忘记改变model变量。