概述
这是对Keras高级特性的简短介绍。它使用:
tfdatasets
管理输入数据。- 一个定制的模式。
tfautograph
建立一个定制的训练循环。
在运行快速启动之前,您需要安装Keras。详情请参阅安装安装说明。
让我们从装载和准备MNIST数据集.像素的值是0到255之间的整数,我们将把它们转换为0到1之间的浮点数。
mnist < -dataset_mnist()mnist$火车$x < -mnist$火车$x/255mnist$测验$x < -mnist$测验$x/255昏暗的(mnist$火车$x) < -c(昏暗的(mnist$火车$x)1)昏暗的(mnist$测验$x) < -c(昏暗的(mnist$测验$x)1)
现在,让我们使用tfdatasets
批处理和打乱数据集。
train_ds < -mnist$火车% > %tensor_slices_dataset()% > %dataset_take(20000)% > %dataset_map(~modify_at(以下方式,“x”,特遣部队$演员阵容,dtype =特遣部队$float32))% > %dataset_map(~modify_at(以下方式,“y”,特遣部队$演员阵容,dtype =特遣部队$int64))% > %dataset_shuffle(10000)% > %dataset_batch(32)test_ds < -mnist$测验% > %tensor_slices_dataset()% > %dataset_take(2000)% > %dataset_map(~modify_at(以下方式,“x”,特遣部队$演员阵容,dtype =特遣部队$float32))% > %dataset_map(~modify_at(以下方式,“y”,特遣部队$演员阵容,dtype =特遣部队$int64))% > %dataset_batch(32)
现在我们将定义一个Keras定制模型。
simple_conv_nn < -函数(过滤器,kernel_size) {keras_model_custom(name =“MyModel”,函数(自我){自我$conv1 < -layer_conv_2d(过滤器=过滤器,kernel_size =代表(kernel_size2),激活=“relu”)自我$平< -layer_flatten()自我$d1 < -layer_dense(单位=128,激活=“relu”)自我$d2 < -layer_dense(单位=10,激活=“softmax”)函数(输入,掩码=零){输入% > %自我$conv1()% > %自我$平()% > %自我$d1()% > %自我$d2()}})}模型< -simple_conv_nn(过滤器=32,kernel_size =3.)
然后我们可以选择一个优化器和损失函数进行训练:
选择度量来度量模型的损失和精度。这些指标在各个时期累积值,然后打印总体结果。
train_loss < -特遣部队$keras$指标$的意思是(name =“train_loss”)train_accuracy < -特遣部队$keras$指标$SparseCategoricalAccuracy(name =“train_accuracy”)test_loss < -特遣部队$keras$指标$的意思是(name =“test_loss”)test_accuracy < -特遣部队$keras$指标$SparseCategoricalAccuracy(name =“test_accuracy”)
然后我们定义一个函数,它能够执行一个训练步骤:
train_step < -函数(图片、标签){与(特遣部队$GradientTape()%, %胶带,{预测< -模型(图片)l < -损失(标签、预测)})梯度< -磁带$梯度(l,模型$trainable_variables)优化器$apply_gradients(purrr::转置(列表(渐变模型$trainable_variables)))train_loss(左)train_accuracy(标签、预测)}
然后我们提供一个能够测试模型的函数:
然后我们可以编写训练循环函数:
training_loop < -tf_function(亲笔签名(函数(train_ds test_ds) {为(b1在train_ds) {train_step(b1$x, b1$y)}为(b2在test_ds) {test_step(b2$x, b2$y)}特遣部队$打印(“Acc”, train_accuracy$结果(),“测试Acc”, test_accuracy$结果())train_loss$reset_states()train_accuracy$reset_states()test_loss$reset_states()test_accuracy$reset_states()}))
最后让我们运行5个周期的训练循环:
为(时代在1:5){猫(”时代:“时代," -----------\ n")training_loop(train_ds test_ds)}
# #时代:1 ----------- Acc 0.93095测试Acc 0.954 # #时代:2 ----------- Acc 0.956525测试Acc 0.95825 # #时代:3 ----------- Acc 0.968066692测试Acc 0.9575 # #时代:4 ----------- Acc 0.9752测试Acc 0.960125 # #时代:5 ----------- Acc 0.9796测试Acc 0.9617