VGG-16获取并设置参数

实现获取VGG-16网络参数,并广播参数构建一个新的网络传入参数。

from keras import layers

from keras.layers import  Conv2D, MaxPooling2D,ZeroPadding2D,GlobalAvgPool2D
from keras.models import Sequential

import numpy
def vgg(img_w,img_h,n_channels,weights_path=None):
    model = Sequential()
    model.add(ZeroPadding2D((1,1),input_shape=(img_w,img_h,n_channels)))
    model.add(Conv2D(64, (3, 3), activation='relu',name="conv1"))
    model.add(ZeroPadding2D((1,1)))
    model.add(Conv2D(64, (3, 3), activation='relu',name="conv2"))
    model.add(MaxPooling2D((2,2), strides=(2,2)))

    model.add(ZeroPadding2D((1,1)))
    model.add(Conv2D(128,(3, 3), activation='relu',name="conv3"))
    model.add(ZeroPadding2D((1,1)))
    model.add(Conv2D(128, (3, 3), activation='relu',name="conv4"))
    model.add(MaxPooling2D((2,2), strides=(2,2)))

    model.add(ZeroPadding2D((1,1)))
    model.add(Conv2D(256,(3, 3), activation='relu',name="conv5"))
    model.add(ZeroPadding2D((1,1)))
    model.add(Conv2D(256, (3, 3), activation='relu',name="conv6"))
    model.add(ZeroPadding2D((1,1)))
    model.add(Conv2D(256, (3, 3), activation='relu',name="conv7"))
    model.add(MaxPooling2D((2,2), strides=(2,2)))

    model.add(ZeroPadding2D((1,1)))
    model.add(Conv2D(512, (3, 3), activation='relu',name="conv8"))
    model.add(ZeroPadding2D((1,1)))
    model.add(Conv2D(512, (3, 3), activation='relu',name="conv9"))
    model.add(ZeroPadding2D((1,1)))
    model.add(Conv2D(512, (3, 3), activation='relu',name="conv10"))
    model.add(MaxPooling2D((2,2), strides=(2,2)))

    model.add(ZeroPadding2D((1,1)))
    model.add(Conv2D(512,(3, 3), activation='relu',name="conv11"))
    model.add(ZeroPadding2D((1,1)))
    model.add(Conv2D(512,(3, 3), activation='relu',name="conv12"))
    model.add(ZeroPadding2D((1,1)))
    model.add(Conv2D(512, (3, 3), activation='relu',name="conv13"))
    model.add(MaxPooling2D((2,2), strides=(2,2)))
    #model.add(GlobalAvgPool2D(data_format="channels_last"))
    #model.load_weights('./vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5')
    if weights_path:
        model.load_weights(weights_path)


    return model
def load_save_weight(img_w,img_h,n_channels):
    model = vgg(32,32,3,'./vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5')
    new_model = vgg(img_w,img_h,n_channels)
    my_weights = model.get_layer('conv1').get_weights()
    final_weights = numpy.zeros((3, 3, 1500, 64))
    for i in range(64):
        a = my_weights[0][:, :, :, i]
        b = numpy.tile(a, (1, 1, 500))
        final_weights[:, :, :, i] = b
    my_weights[0] = final_weights
    new_model.get_layer('conv1').set_weights(my_weights)

    a2 = model.get_layer('conv2').get_weights()
    a3 = model.get_layer('conv3').get_weights()
    a4 = model.get_layer('conv4').get_weights()
    a5 = model.get_layer('conv5').get_weights()
    a6 = model.get_layer('conv6').get_weights()
    a7 = model.get_layer('conv7').get_weights()
    a8 = model.get_layer('conv8').get_weights()
    a9 = model.get_layer('conv9').get_weights()
    a10 = model.get_layer('conv10').get_weights()
    a11 = model.get_layer('conv11').get_weights()
    a12 = model.get_layer('conv12').get_weights()
    a13 = model.get_layer('conv13').get_weights()

    new_model.get_layer('conv2').set_weights(a2)
    new_model.get_layer('conv3').set_weights(a3)
    new_model.get_layer('conv4').set_weights(a4)
    new_model.get_layer('conv5').set_weights(a5)
    new_model.get_layer('conv6').set_weights(a6)
    new_model.get_layer('conv7').set_weights(a7)
    new_model.get_layer('conv8').set_weights(a8)
    new_model.get_layer('conv9').set_weights(a9)
    new_model.get_layer('conv10').set_weights(a10)
    new_model.get_layer('conv11').set_weights(a11)
    new_model.get_layer('conv12').set_weights(a12)
    new_model.get_layer('conv13').set_weights(a13)
    return new_model
if __name__ == "__main__":
    my_model = load_save_weight(32,32,1500)
    my_model.save_weights("./my_vgg_weights.h5")
VGG16是一种流行的卷积神经网络(CNN)架构,最初由牛津大学的视觉几何组(Visual Geometry Group)在2014年的论文提出,用于图像识别任务。VGG16模型在2014年ImageNet大规模视觉识别挑战赛(ILSVRC)取得了优异的成绩,并且由于其结构简单,易于理解和复现,成为了深度学习领域的一个经典模型。 VGG16模型的主要特点包括: 1. 使用了连续的小尺寸卷积核(3x3),这些小尺寸的卷积核能够有效捕捉图像的细节特征。 2. 网络结构很深,共有16个卷积层和全连接层(实际上层叠起来是19层,但是参数共享机制使得参数数量减少)。 3. 使用了最大池化(Max Pooling)来逐渐降低特征的空间尺寸。 4. 通过重复使用简单的卷积核结构,构建了具有不同深度的网络配置,例如VGG11, VGG13, VGG16, VGG19等。 在Python实现VGG16,通常会用到深度学习框架,如TensorFlow或PyTorch。以下是一些使用PyTorch实现VGG16的基本步骤: 1. 导入PyTorch相关模块。 2. 定义VGG16网络结构。 3. 加载预训练权重(如果使用预训练模型)。 4. 对输入数据进行预处理(如归一化)。 5. 将数据传入模型进行前向传播,得到输出结果。 6. 根据需要进行后处理(如求解损失,反向传播,优化等)。 例如,使用PyTorch的预训练VGG16模型可以这样实现: ```python import torch import torchvision.models as models # 获取训练VGG16模型 vgg16 = models.vgg16(pretrained=True) # 打印网络结构 print(vgg16) # 这里假设你已经有了输入数据input_tensor # input_tensor = ... # 将输入数据传入模型 # output = vgg16(input_tensor) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值