keras channels_last、preprocess_input、全连接层Dense、SGD优化器、模型及编译

channels_last 和 channels_first

keras中 channels_last 和 channels_first 用来设定数据的维度顺序(image_data_format)。

对2D数据来说,"channels_last"假定维度顺序为 (rows,cols,channels), 而"channels_first"假定维度顺序为(channels, rows, cols)。

对3D数据而言,"channels_last"假定(conv_dim1, conv_dim2, conv_dim3, channels),"channels_first"则是(channels, conv_dim1, conv_dim2, conv_dim3)。

可通过 keras.backend.image_data_format() 来获取当前的维度顺序,一般默认顺序是 channels_last。


preprocess_input(img)

keras中 preprocess_input() 函数完成数据预处理的工作,数据预处理能够提高算法的运行效果。常用的预处理包括数据归一化和白化(whitening)。

深度学习中数据归一化的常用方法:

1. 简单缩放Simple Rescaling)

简单缩放方法是通过对数据各个维度上的值进行重新调节,使得数据整体上分布在[0,1]或[-1,1]区间。

2. 逐样本均值消减(Per-example mean subtraction)

逐样本均值消减,也称为移除直流分量(remove DC),具体操作是把每个样本都减去所有样本的统计平均值,这种归一化方法在图像领域常见。

3. 特征标准化(Feature Standardization)

特征标准化指的是(独立地)使得数据的每一个维度具有零均值和单位方差,具体操作是首先计算每一个维度上数据的均值(使用全体数据计算),之后在每一个维度上都减去该均值。下一步便是在数据的每一维度上除以该维度上数据的标准差。 

白化,又称漂白或者球化;是对原始数据执行变换,使得转换后的数据的协方差矩阵为单位阵。

图像中相邻像素之间具有很强的相关性,因此输入是冗余的。白化的目的就是降低输入的冗余性。

经白化处理后的数据集满足两个条件:一是特征相关性较低;二是特征具有相同的方差。

白化算法的实现过程:第一步操作是PCA,求出新特征空间中的新坐标,第二步是对新的坐标进行方差归一化操作。

keras中preprocess_input()函数的作用是对样本执行 逐样本均值消减 的归一化,即在每个维度上减去样本的均值,对于维度顺序是channels_last的数据,keras中每个维度上的操作如下:

x[..., 0] -= 103.939
x[..., 1] -= 116.779
x[..., 2] -= 123.68

全连接层Dense类

keras在core模块中定义了一系列常用的网络层,包括全连接,激活层等。Dense层是全连接层。

keras.layers.core.Dense(units, activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)
参数:
  1.     units:大于0的整数,代表该层的输出维度。例如units=4,表示该层的输出是4个类别
  2.     activation:激活函数,为预定义的激活函数名(参考激活函数),或逐元素(element-wise)的Theano函数,例如activation='softmax'。如果不指定该参数,将不会使用任何激活函数(即使用线性激活函数:a(x)=x),默认不使用
  3.     use_bias: 布尔值,是否使用偏置项,默认为True
  4.     kernel_initializer:权值初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。默认使用均匀分布初始化方法初始化,参数从[-limit, limit]的均匀分布产生。
  5.     bias_initializer:偏置向量初始化方法,为预定义初始化方法名的字符串,或用于初始化偏置向量的初始化器。默认初始化为0
  6.     kernel_regularizer:施加在权重上的正则项,为Regularizer对象,默认不使用
  7.     bias_regularizer:施加在偏置向量上的正则项,为Regularizer对象,默认不使用
  8.     activity_regularizer:施加在输出上的正则项,为Regularizer对象,默认不使用
  9.     kernel_constraints:施加在权重上的约束项,为Constraints对象,默认不使用
  10.     bias_constraints:施加在偏置上的约束项,为Constraints对象,默认不使用

SGD优化器

优化器按照一定规则不断调整优化参数,是模型必须设定的参数之一。

常用的SGD优化器:

keras.optimizers.SGD(lr=0.01, momentum=0.0, decay=0.0, nesterov=False)

随机梯度下降法,支持动量参数,支持学习衰减率,支持Nesterov动量。

参数

  1.     lr:大或等于0的浮点数,学习率
  2.     momentum:大或等于0的浮点数,动量参数
  3.     decay:大或等于0的浮点数,每次更新后的学习率衰减值
  4.     nesterov:布尔值,确定是否使用Nesterov动量

Model模型

Model是keras定义的一个类,用来生成模型,又被称为函数式(Funcitional)模型,Keras函数式模型接口是用户定义多输出模型、非循环有向模型或具有共享层的模型等复杂模型的途径,是最广泛的一类模型。

Model典型使用:

# This returns a tensor
inputs = Input(shape=(784,))

# a layer instance is callable on a tensor, and returns a tensor
x = Dense(64, activation='relu')(inputs)
x = Dense(64, activation='relu')(x)
predictions = Dense(10, activation='softmax')(x)

# This creates a model that includes
# the Input layer and three Dense layers
model = Model(inputs=inputs, outputs=predictions)


模型编译

定义完模型之后需要进一步编译模型,使用model.compile()函数。

compile(self, optimizer, loss, metrics=None, loss_weights=None,
                sample_weight_mode=None, weighted_metrics=None,
                target_tensors=None, **kwargs)
  1. optimizer:优化器,为预定义优化器名或优化器对象,如SGD
  2. loss:损失函数,为预定义损失函数名或一个目标函数,如loss='categorical_crossentropy'
  3. metrics:列表,包含评估模型在训练和测试时的性能的指标,典型用法是metrics=['accuracy']如果要在多输出模型中为不同的输出指定不同的指标,可向该参数传递一个字典,例如metrics={'ouput_a': 'accuracy'}
  4. sample_weight_mode:如果你需要按时间步为样本赋权(2D权矩阵),将该值设为“temporal”。默认为“None”,代表按样本赋权(1D权)。如果模型有多个输出,可以向该参数传入指定sample_weight_mode的字典或列表。在下面fit函数的解释中有相关的参考内容。
  5. weighted_metrics: metrics列表,在训练和测试过程中,这些metrics将由sample_weight或clss_weight计算并赋权
  6. target_tensors: 默认情况下,Keras将为模型的目标创建一个占位符,该占位符在训练过程中将被目标数据代替。如果你想使用自己的目标张量(相应的,Keras将不会在训练时期望为这些目标张量载入外部的numpy数据),你可以通过该参数手动指定。目标张量可以是一个单独的张量(对应于单输出模型),也可以是一个张量列表,或者一个name->tensor的张量字典。
  7. kwargs:使用TensorFlow作为后端请忽略该参数,若使用Theano/CNTK作为后端,kwargs的值将会传递给 K.function。如果使用TensorFlow为后端,这里的值会被传给tf.Session.run,当为参数传入非法值时会抛出异常
【Tips】 如果只是载入模型并利用其predict,可以不用进行compile。在Keras中,compile主要完成损失函数和优化器的一些配置,是为训练服务的。predict会在内部进行符号函数的编译工作(通过调用_make_predict_function生成函数)。


VGG16模型因其结构的简洁和在图像分类任务中的高效表现而被广泛应用于深度学习领域。Keras框架提供了一个高级API,使得实现VGG16模型及其训练和测试变得更加容易。为了帮助你实现这一过程,我推荐你参考《VGG16模型代码解析:入门级简易实现》这份资料。它将为你提供一个清晰的步骤,帮助你从零开始构建和理解VGG16模型的每个部分。 参考资源链接:[VGG16模型代码解析:入门级简易实现](https://wenku.csdn.net/doc/1hc0n7f4dn?spm=1055.2569.3001.10343) 首先,你需要安装Keras和TensorFlow库,因为Keras是在TensorFlow之上构建的。接下来,你可以通过以下步骤来实现VGG16模型: 1. 导入必要的库和预训练权重(可选),如果没有预训练权重,VGG16模型将使用随机初始化的权重开始训练。 2. 构建VGG16模型的结构,包括定义输入层、卷积层、池化层和全连接层Keras提供了内置的VGG16模型类,你可以直接使用它,也可以自定义模型结构。 3. 编译模型,选择适当的损失函数和优化器。 4. 对数据进行预处理,使其符合VGG16模型的输入要求。 5. 使用训练数据训练模型,并使用验证数据监控模型在未见数据上的表现。 6. 在测试集上评估模型的性能。 以下是一个简单的示例代码,展示如何使用Keras实现VGG16模型进行图像分类任务: ```python from keras.applications.vgg16 import VGG16, preprocess_input from keras.preprocessing.image import ImageDataGenerator from keras.models import Model from keras.layers import Dense, GlobalAveragePooling2D from keras.optimizers import SGD # 加载VGG16模型结构,使用ImageNet上的权重 base_model = VGG16(weights='imagenet', include_top=False) # 添加自定义层以进行微调 x = base_model.output x = GlobalAveragePooling2D()(x) x = Dense(1024, activation='relu')(x) predictions = Dense(10, activation='softmax')(x) # 假设有10个类别 # 构建最终模型 model = Model(inputs=base_model.input, outputs=predictions) # 编译模型 ***pile(optimizer=SGD(lr=0.0001, momentum=0.9), loss='categorical_crossentropy', metrics=['accuracy']) # 数据预处理 train_datagen = ImageDataGenerator( preprocessing_function=preprocess_input, # 其他数据增强选项... ) # 训练模型 model.fit_generator( train_datagen.flow(train_data, train_labels, batch_size=32), steps_per_epoch=len(train_data) / 32, epochs=epochs ) # 评估模型 scores = model.evaluate(test_data, test_labels, verbose=1) print('Test loss:', scores[0]) print('Test accuracy:', scores[1]) ``` 在实际应用中,你可能需要根据自己的数据集进行适当的数据预处理和增强。同时,对于模型训练,你还需要调整超参数,如学习率、批次大小和训练周期等。 一旦你对VGG16模型有了初步的理解和实践,我鼓励你进一步阅读《VGG16模型代码解析:入门级简易实现》这份资源,它提供了详细的代码解析和实际应用的案例,可以帮助你更深入地理解和掌握VGG16模型的实现细节,以及如何优化模型以适应具体问题。 参考资源链接:[VGG16模型代码解析:入门级简易实现](https://wenku.csdn.net/doc/1hc0n7f4dn?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值