赞
踩
tf.keras 是 tensorflow2 引入的高封装度的框架,可以用于快速搭建神经网络模型,keras 为支持快速实验而生,能够把想法迅速转换为结果,是深度学习 框架之中最终易上手的一个,它提供了一致而简洁的API,能够极大地减少一般 应用下的工作量,提高代码地封装程度和复用性。
第一步:import 相关模块
,如 import tensorflow as tf。
第二步:指定输入网络的训练集和测试集
,如指定训练集的输入 x_train 和标签 y_train,测试集的输入 x_test 和标签 y_test。
第三步:逐层搭建网络结构
,model = tf.keras.models.Sequential()。
第四步:在 model.compile()中配置训练方法
,选择训练时使用的优化器、损失 函数和最终评价指标。
第五步:在 model.fit()中执行训练过程
,告知训练集和测试集的输入值和标签、 每个 batch 的大小(batchsize)和数据集的迭代次数(epoch)。
第六步:使用 model.summary()打印网络结构
,统计参数数目。
下面对“六步法”中出现的函数做一些介绍
Sequential 函数是一个容器,描述了神经网络的网络结构,在Sequential函数的输入参数中描述从输入层到输出层的网络结构
。
例如
model=tf.keras.Sequential(layers=[tf.keras.layers.Dense(3,activation="relu"), tf.keras.layers.Dense(3,activation="softmax")])
常用的层有:
其中activation(字符串给出)可选 relu、softmax、sigmoid、tanh等
kernel_regularizer 可选 tf.keras.regularizers.l1()、 tf.keras.regularizers.l2()
Compile用于配置神经网络的训练方法,告知训练时使用的优化器、损失函数和准确率评测标准。
Model.compile(optimizer = 优化器,loss = 损失函数,metrics = [“准确率”])
其中:
优化器名字 | 函数形式 |
---|---|
‘sgd’ | tf.optimizers.SGD(lr=学习率,decay=学习率衰减率, momentum=动量参数) |
‘adagrad’ | tf.keras.optimizers.Adagrad(lr=学习率, decay=学习率衰减率) |
‘adadelta’ | tf.keras.optimizers.Adadelta(lr=学习率, decay=学习率衰减率) |
‘adam’ | tf.keras.optimizers.Adam (lr=学习率, decay=学习率衰减率) |
损失函数名字 | 函数形式 | 备注 |
---|---|---|
‘mse’ | tf.keras.losses.MeanSquaredError() | |
‘sparse_categorical_crossentropy‘ | tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False) | 如果输出经过了softmax转化为概率,那么这选择False,如果没有选择为True |
网络评测指标名字 | 备注 |
---|---|
‘accuracy’ | y_和 y 都是数值(标签类型),如 y_=[1] y=[1]。 |
‘categorical_accuracy’ | y_和 y 是以独热码和概率分布表示。如 y_=[0, 1, 0], y=[0.256, 0.695, 0.048]。 |
‘sparse_ categorical_accuracy’ | y_是以数值形式给出,y是以概率分布表示。如 y_=[1],y=[0.256, 0.695, 0.048]。 |
eg.
model.compile(
optimizer=tf.keras.optimizers.Adam(),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
metrics=['sparse_categorical_accuracy']
)
model.fit的参数有:
validation_data和validataion_split 两者选择一个使用即可。使用validation_data需要传递测试数据,而使用validataion_split不需要传递测试数据,测试数据从训练数据中划分出一部分。
eg.
# 将训练数据的20%划分出来用于测试
model.fit(x_train,y_train,batch_size=32,epochs=500,validation_split=0.2,validation_freq=20)
# 或
# 指定测试数据
model.fit(x_train,y_train,batch_size=32,epochs=500,validation_data=(x_test,y_test),validation_freq=20)
summary 函数用于打印网络结构和参数统计。
# 1.import 相关模块 import tensorflow as tf from tensorflow.keras.layers import Dense, Flatten # 2.指定输入网络的训练集和测试集 mnist=tf.keras.datasets.mnist (x_train,y_train),(x_test,y_test)=mnist.load_data() x_train,x_test=x_train/255.0,x_test/255.0 # 3.逐层搭建网络结构 # 两个全连接层 model=tf.keras.Sequential([ tf.keras.layers.Flatten(), tf.keras.layers.Dense(100,activation="relu"), tf.keras.layers.Dense(10,activation="softmax") ]) # 4.在 model.compile()中配置训练方法 model.compile(optimizer="adam", loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False), metrics=['sparse_categorical_accuracy']) # 5.在 model.fit()中执行训练过程 model.fit(x_train,y_train,batch_size=100,epochs=5,validation_data=(x_test,y_test),validation_freq=1) # 6.使用 model.summary()打印网络结构 model.summary()
在“六步法”的第三步 搭建网络结构 中,使用Sequential可以快速搭建网络结构,但是如果网络包含跳连等其他复杂网络结构,Sequential 就无法表示了。
这就需要使用class来声明网络结构
。
简单来说就是我们需要声明一个类,这个类继承自tensorflow.keras.Model,把我们要搭建的网络结构和正向传播过程写在这个类里。看下面代码会很好理解:
class MyModel(Model):
def __init__(self):
super(MyModel, self).__init__()
self.flatten=Flatten()
self.d1=Dense(100,activation="relu")
self.d2=Dense(10,activation="softmax")
def call(self,x):
y=self.flatten(x)
y=self.d1(y)
y=self.d2(y)
return y
model=MyModel()
"__init__”方法中设置网络的结构。
“call”方法接受输入的特征数据,然后数据逐层正向计算,返回输出。
使用class来声明网络结构只是改变了“六步法”中的第三步的具体操作,其他的步骤完全不会受到干扰。
eg.
# 1.import 相关模块 import tensorflow as tf from tensorflow.keras.layers import Dense, Flatten from tensorflow.keras import Model # 2.指定输入网络的训练集和测试集 mnist=tf.keras.datasets.mnist (x_train,y_train),(x_test,y_test)=mnist.load_data() x_train,x_test=x_train/255.0,x_test/255.0 # model=tf.keras.Sequential([ # tf.keras.layers.Flatten(), # tf.keras.layers.Dense(100,activation="relu"), # tf.keras.layers.Dense(10,activation="softmax") # ]) # 3.逐层搭建网络结构 # 两个全连接层 class MyModel(Model): def __init__(self): super(MyModel, self).__init__() self.flatten=Flatten() self.d1=Dense(100,activation="relu") self.d2=Dense(10,activation="softmax") def call(self,x): y=self.flatten(x) y=self.d1(y) y=self.d2(y) return y model=MyModel() # 4.在 model.compile()中配置训练方法 model.compile(optimizer="adam", loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False), metrics=['sparse_categorical_accuracy']) # 5.在 model.fit()中执行训练过程 model.fit(x_train,y_train,batch_size=100,epochs=5,validation_data=(x_test,y_test),validation_freq=1) # 6.使用 model.summary()打印网络结构 model.summary()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。