【卷积神经网络CNN】学习笔记(一)用keras搭建CNN网络模型

  • 卷积神经网络是一种自动化特征提取的机器学习模型,主要用于解决图像识别问题。从直观上讲,是一个从细节到抽象的过程。这里的关键的如何抽象,抽象就是把图像中的各种零散的特征通过某种方式汇总起来,形成新的特征。深度学习网络最上层的特征是最抽象的。
  • 卷积神经网络还依靠于反向传播的反馈机制,来自动调节过滤器来更加准确提取特征。
  • 一般一个卷积层包括3个部分:卷积、非线性变化(激活函数)、池化(Pooling),有的还包括dropout。流行的CNN网络结构,比如LeNet、VGG16等,都是通过构造多层卷积层,使得原来“矮胖”型的图像立体,变成“瘦长”型立体,最后做一个单层的网络,把“瘦长”型立体和输出层(类别)联系在一起。

实战

1、端到端(End-to-End)的MNIST训练数字识别

import numpy as np 
from keras.datasets import mnist

from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers.convolutional import Conv2D, MaxPooling2D
# 获得MNIST数据集
(X_train, y_train), (X_test, y_test) = mnist.load_data()

print(X_train[0].shape)
print(y_train[0])

X_train = X_train.reshape(X_train.shape[0], 28, 28, 1).astype('float32')
X_test = X_test.reshape(X_test.shape[0], 28, 28, 1).astype('float32')

# 归一化
X_train /= 255
X_test /= 255

# 独热编码
def tran_y(y):
    y_ohe = np.zeros(10)
    y_ohe[y] = 1
    return y_ohe

# 把标签进行独热编码
y_train_ohe = np.array([tran_y(y_train[i]) for i in range(len(y_train))])
y_test_ohe = np.array([tran_y(y_test[i]) for i in range(len(y_test))])
# 创建序列模型
model = Sequential()
# 添加卷积层,64个滤波器,卷积核大小3x3,平移步长1,填充方式:补零,设定输入层维度,激活函数relu
model.add(Conv2D(filters=64, kernel_size=(3, 3), strides=(1, 1), padding='same', input_shape=(28, 28, 1), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))   # 池化层,取2x2格子中的最大值
model.add(Dropout(0.5))                     # dropout层,概率0.5,防止过拟合,提高泛化能力

model.add(Conv2D(128, kernel_size=(3, 3), strides=(1, 1), padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))

model.add(Conv2D(256, kernel_size=(3, 3), strides=(1, 1), padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))
# 把当前层节点展平
model.add(Flatten())
# 添加全连接层
model.add(Dense(128, activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(10, activation='softmax')) # 10个神经元,对应输出层
# 编译模型,指定损失函数(一般分类问题的损失函数都采用交叉熵),优化器,度量
model.compile(loss='categorical_crossentropy', optimizer= 'adagrad', metrics=['accuracy'])
# 放入批量样本进行,训练模型
model.fit(X_train, y_train_ohe, validation_data=(X_test, y_test_ohe), epochs=20, batch_size=128)
# 在测试集上评估模型的准确度
scores = model.evaluate(X_test, y_test_ohe, verbose=0)

2、利用VGG16网络(迁移学习)进行字体识别

迁移学习的思想:利用别人的模型框架作为自己模型的输入,或者作为自己问题中的已知部分。这种学习是站在别人的肩膀上,从而大大缩短自己调整模型和建立模型的时间。同时也可以选择利用已建好模型的参考值,再适当地加上少量的参数,最后只需要计算自己添加的那部分参数的值就可以了。

网络结构和权重同时迁移,layers.trainable = False 把原有的训练好的权重**“冷冻”**起来,只训练自己搭建的那部分权重,减少训练时间,但是不一定适用新数据。

from keras.applications.vgg16 import VGG16 
from keras.layers import Input, Flatten, Dense, Dropout
from keras.models import Model
from keras.optimizers import SGD

from keras.datasets import mnist

import cv2
import h5py as h5py
import numpy as np 
# 只迁移结构,权重重新训练
model_vgg = VGG16(include_top=False, weights='imagenet', input_shape=(224, 224, 3))
model = Flatten(name='flatten')(model_vgg.output)
model = Dense(10, activation='softmax')(model)
model_vgg_mnist = Model(model_vgg.input, model, name='vgg16')
model_vgg_mnist.summary()

# 结构和权重都迁移
ishape = 224
model_vgg = VGG16(include_top=False, weights='imagenet', input_shape=(ishape, ishape, 3))
# “冷冻”训练好的权重
for layer in model_vgg.layers:
    layer.trainable = False

model = Flatten()(model_vgg.output)
model = Dense(10, activation='softmax')(model)
model_vgg_mnist_pretrain = Model(model_vgg.input, model, name='vgg16_pretrain')
model_vgg_mnist_pretrain.summary()

sgd = SGD(lr=0.05, decay=1e-5)
model_vgg_mnist_pretrain.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])

(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train = [cv2.cvtColor(cv2.resize(i, (ishape, ishape)), cv2.COLOR_GRAY2BGR) for i in X_train]
X_train = np.concatenate([arr[np.newaxis] for arr in X_train]).astype('float32')
X_test = [cv2.cvtColor(cv2.resize(i, (ishape, ishape)), cv2.COLOR_GRAY2BGR) for i in X_test]
X_test = np.concatenate([arr[np.newaxis] for arr in X_test]).astype('float32')

# 归一化
X_train /= 255
X_test /= 255
# 独热编码
def tran_y(y):
    y_ohe = np.zeros(10)
    y_ohe[y] = 1
    return y_ohe

# 把标签进行独热编码
y_train_ohe = np.array([tran_y(y_train[i]) for i in range(len(y_train))])
y_test_ohe = np.array([tran_y(y_test[i]) for i in range(len(y_test))])
# 放入批量样本进行,训练模型
model_vgg_mnist_pretrain.fit(X_train, y_train_ohe, validation_data=(X_test, y_test_ohe), epochs=200, batch_size=128)
  • 3
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Python基于卷积神经网络CNN模型和VGG16模型有很多相关的资料可供学习和参考。 卷积神经网络CNN)是一种广泛应用于图像识别和处理的深度学习模型。Python提供了多个优秀的深度学习框架,如TensorFlow、Keras和PyTorch,它们都具备构建CNN模型的能力。这些框架提供了丰富的教程、文档、示例代码等资料,如TensorFlow官网上的教程、Keras官方文档以及PyTorch官方教程等都提供了关于CNN模型的详细资料。 VGG16是一种经典的卷积神经网络模型,由Visual Geometry Group在2014年提出。它具有16层深的卷积神经网络结构,并在ImageNet图像分类比赛取得了较好的成绩。在Python,我们可以通过使用Keras等深度学习框架的预训练模型来实现VGG16模型。这些深度学习框架提供了预训练的VGG16模型,例如Keras的"vgg16"模块,可以直接加载并使用,无需从头开始训练。同时,也有许多博客、教程和论文介绍了VGG16模型的细节和应用。 除了官方文档和预训练模型外,还有一些优秀的开源项目和GitHub仓库提供了关于Python基于CNN和VGG16模型的资料和示例代码。例如,可以通过GitHub上的Awesome Deep Vision仓库找到与CNN和VGG16相关的资源和项目。 总的来说,对于Python基于CNN模型和VGG16模型的资料,我们可以通过深度学习框架的官方文档、预训练模型、教程和示例代码,以及开源项目和GitHub仓库来学习和参考。这些资料将帮助我们理解和应用CNN模型和VGG16模型在图像识别和处理方面的应用。 ### 回答2: Python是一种广泛应用于科学计算和人工智能领域的编程语言。基于卷积神经网络(CNN)模型和VGG16模型,我们可以使用Python来进行图像分类和物体识别等任务。 卷积神经网络是一种深度学习模型,特别适用于图像处理任务。它通过层叠的卷积层、池化层和全连接层对输入图像进行特征提取和分类。Python提供了许多库和框架来构建和训练卷积神经网络模型,如TensorFlow、Keras和PyTorch等。 VGG16是一种经典的卷积神经网络模型,由16层卷积层和全连接层组成。它是在ImageNet图像数据集上进行训练的,可用于图像分类和特征提取。PythonKeras库提供了VGG16模型的预训练版本,可以方便地加载和使用。 使用Python构建基于卷积神经网络和VGG16模型的应用时,我们可以首先导入相应的库和模块。然后,可以定义模型的结构,包括卷积层、池化层和全连接层等。接下来,可以加载训练好的权重参数,或者在新的数据集上进行训练。最后,可以使用模型对新的图像进行分类或物体识别。 总结起来,Python提供了丰富的工具和库,可以用于构建、训练和应用基于卷积神经网络和VGG16模型的应用。这些模型在图像处理和物体识别等任务具有重要的应用价值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值