Stanford CS231n实践笔记(课时22卷积神经网络工程实践技巧与注意点 cnn in practise 上)

简介: 本课主要2个实践内容:1、keras中数据集丰富,从数据集中提取更多特征(Data augmentation)2、迁移学习(Tranform learning)代码:https://github.com/jsxyhelu/DateSets1、keras中数据集丰富,从数据集中提取更多特征(Data augmentation)keras是比较现代化的DL工具,所以这方面的功能都是具备的。
本课主要2个实践内容:
1、keras中数据集丰富,从数据集中提取更多特征(Data augmentation)
2、迁移学习(Tranform learning)

代码:https://github.com/jsxyhelu/DateSets
1、keras中数据集丰富,从数据集中提取更多特征(Data augmentation)
keras是比较现代化的DL工具,所以这方面的功能都是具备的。这里首先将相关知识进行整理,然后将例子进行实现,特别注重结果的展示。
具体内容包括:
  • 旋转 | 反射变换(Rotation/reflection): 随机旋转图像一定角度; 改变图像内容的朝向;
  • 翻转变换(flip): 沿着水平或者垂直方向翻转图像;
  • 缩放变换(zoom): 按照一定的比例放大或者缩小图像;
  • 平移变换(shift): 在图像平面上对图像以一定方式进行平移;
  • 可以采用随机或人为定义的方式指定平移范围和平移步长, 沿水平或竖直方向进行平移. 改变图像内容的位置;
  • 尺度变换(scale): 对图像按照指定的尺度因子, 进行放大或缩小; 或者参照SIFT特征提取思想, 利用指定的尺度因子对图像滤波构造尺度空间. 改变图像内容的大小或模糊程度;
  • 对比度变换(contrast): 在图像的HSV颜色空间,改变饱和度S和V亮度分量,保持色调H不变. 对每个像素的S和V分量进行指数运算(指数因子在0.25到4之间), 增加光照变化;
  • 噪声扰动(noise): 对图像的每个像素RGB进行随机扰动, 常用的噪声模式是椒盐噪声和高斯噪声;

    使用的函数为: 
参数非常多,用以生成一个batch的图像数据,支持实时数据提升。训练时该函数会无限生成数据,直到达到规定的epoch次数为止;那么在训练的时候肯定是需要结合fit_generate来使用,正好是最近研究的。
主要方法:
a、 flow(self, X, y, batch_size=32, shuffle=True, seed=None, save_to_dir=None, save_prefix='', save_format='png')
将会返回一个生成器,这个生成器用来扩充数据,每次都会产生batch_size个样本。
因为目前我们只导入了一张图片,因此每次生成的图片都是基于这张图片而产生的,可以看到结果,旋转、位移、放大缩小,统统都有。正如其名称,这个生成器可以一直生成下去。
b、flow_from_directory(directory): 
以文件夹路径为参数,生成经过数据提升/归一化后的数据,在一个无限循环中无限产生batch数据
e.g
from keras.preprocessing.image import ImageDataGenerator
from keras.preprocessing import image
import matplotlib.pyplot as plt
import numpy as np

# 指定参数
# rotation_range 旋转
# width_shift_range 左右平移
# height_shift_range 上下平移
# zoom_range 随机放大或缩小
img_generator = ImageDataGenerator(
rotation_range = 90,
width_shift_range = 0.2,
height_shift_range = 0.2,
zoom_range = 0.3
)
# 导入并显示图片
img_path = 'e:/template/lena.jpg'
img = image.load_img(img_path)
plt.imshow(img)
plt.show()

# 将图片转为数组
x = image.img_to_array(img)
# 扩充一个维度
x = np.expand_dims(x, axis= 0)
# 生成图片
gen = img_generator.flow(x, batch_size= 1)

# 显示生成的图片
plt.figure()
for i in range( 3):
for j in range( 3):
x_batch = next(gen)
idx = ( 3*i) + j
plt.subplot( 3, 3, idx+ 1)
plt.imshow(x_batch[ 0]/ 256)
x_batch.shape
plt.show()

代码中的绝对核心一句
gen = img_generator.flow(x, batch_size= 1)
这样,gen相当于是img_generatror的一个生成器,下面直接使用next(gen)就可以不断生成。
e.g2验证DateAugment性能。
都说这个DateAugment好,但是不之际动手实践一下,总是不放心。
from keras.datasets import cifar10
from keras.layers.core import Dense, Flatten, Activation, Dropout
from keras.layers.convolutional import Conv2D
from keras.layers.pooling import MaxPooling2D
from keras.layers.normalization import BatchNormalization
from keras.models import Sequential
from keras.utils import np_utils
from keras.preprocessing.image import ImageDataGenerator
from keras.preprocessing import image
import matplotlib.pyplot as plt
import numpy as np
from keras.utils import generic_utils

(x_train, y_train),(x_test, y_test) = cifar10.load_data()
print(x_train.shape, y_train.shape, x_test.shape, y_test.shape)

def preprocess_data( x):
x /= 255
x -= 0.5
x *= 2
return x

# 预处理
x_train = x_train.astype(np.float32)
x_test = x_test.astype(np.float32)

x_train = preprocess_data(x_train)
x_test = preprocess_data(x_test)

# one-hot encoding
n_classes = 10
y_train = np_utils.to_categorical(y_train, n_classes)
y_test = np_utils.to_categorical(y_test, n_classes)

# 取 20% 的训练数据
x_train_part = x_train[: 10000]
y_train_part = y_train[: 10000]

print(x_train_part.shape, y_train_part.shape)

# 建立一个简单的卷积神经网络,序贯结构
def build_model():
model = Sequential()

model.add(Conv2D( 64, ( 3, 3), input_shape=( 32, 32, 3)))
model.add(Activation( 'relu'))
model.add(BatchNormalization( scale= False, center= False))

model.add(Conv2D( 32, ( 3, 3)))
model.add(Activation( 'relu'))
model.add(MaxPooling2D(( 2, 2)))
model.add(Dropout( 0.2))
model.add(BatchNormalization( scale= False, center= False))

model.add(Flatten())
model.add(Dense( 256))
model.add(Activation( 'relu'))
model.add(Dropout( 0.2))
model.add(BatchNormalization())

model.add(Dense(n_classes))
model.add(Activation( 'softmax'))

return model

# 训练参数
batch_size = 128
#epochs = 20
epochs = 2
#cifar-10 20%数据,训练结果,绘图
model = build_model()
model.compile( optimizer= 'adam', loss= 'categorical_crossentropy', metrics=[ 'accuracy'])
model.fit(x_train_part, y_train_part, epochs=epochs, batch_size=batch_size, verbose= 1, validation_split= 0.1)

loss, acc = model.evaluate(x_test, y_test, batch_size= 32)
print( 'Loss: ', loss)
print( 'Accuracy: ', acc)

#cifar-10 20%数据 + Data Augmentation.训练结果
# 设置生成参数
img_generator = ImageDataGenerator(
rotation_range = 20,
width_shift_range = 0.2,
height_shift_range = 0.2,
zoom_range = 0.2
)
model_2 = build_model()
model_2.compile( optimizer= 'adam', loss= 'categorical_crossentropy', metrics=[ 'accuracy'])

#采用文档中提示自动方法
img_generator.fit(x_train_part)

# fits the model_2 on batches with real-time data augmentation:
model_2.fit_generator(img_generator.flow(x_train_part, y_train_part, batch_size=batch_size),
steps_per_epoch= len(x_train_part), epochs=epochs)
初步比较结果:
原始
Loss:  1.6311466661453247
Accuracy:  0.6169
调整
Epoch 1/20
2184/10000 [=====>........................] - ETA: 11:11 - loss: 1.0548 - acc: 0.6254
虽然没有走完,但是已经初见端倪。


2、迁移学习(Tranform learning)
基于前面已经实现的代码,在fasion_mnist上实现vgg的模型迁移。
import numpy as np
from keras.datasets import fashion_mnist
import gc

from keras.models import Sequential, Model
from keras.layers import Input, Dense, Dropout, Flatten
from keras.layers.convolutional import Conv2D, MaxPooling2D
from keras.applications.vgg16 import VGG16
from keras.optimizers import SGD
import matplotlib.pyplot as plt
import os

import cv2
import h5py as h5py
import numpy as np
def tran_y( y):
y_ohe = np.zeros( 10)
y_ohe[y] = 1
return y_ohe
epochs = 1

# 如果硬件配置较高,比如主机具备32GB以上内存,GPU具备8GB以上显存,可以适当增大这个值。VGG要求至少48像素
ishape= 48
(X_train, y_train), (X_test, y_test) = fashion_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_train /= 255.0

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_test /= 255.0

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))])
y_train_ohe = y_train_ohe.astype( 'float32')
y_test_ohe = y_test_ohe.astype( 'float32')


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( 4096, activation= 'relu', name= 'fc1')(model)
model = Dense( 4096, activation= 'relu', name= 'fc2')(model)
model = Dropout( 0.5)(model)
model = Dense( 10, activation = 'softmax', name= 'prediction')(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'])
log = model_vgg_mnist_pretrain.fit(X_train, y_train_ohe, validation_data = (X_test, y_test_ohe), epochs = epochs, batch_size = 64)

score = model_vgg_mnist_pretrain.evaluate(X_test, y_test_ohe, verbose= 0)
print( 'Test loss:', score[ 0])
print( 'Test accuracy:', score[ 1])

plt.figure( 'acc')
plt.subplot( 2, 1, 1)
plt.plot(log.history[ 'acc'], 'r--', label= 'Training Accuracy')
plt.plot(log.history[ 'val_acc'], 'r-', label= 'Validation Accuracy')
plt.legend( loc= 'best')
plt.xlabel( 'Epochs')
plt.axis([ 0, epochs, 0.9, 1])
plt.figure( 'loss')
plt.subplot( 2, 1, 2)
plt.plot(log.history[ 'loss'], 'b--', label= 'Training Loss')
plt.plot(log.history[ 'val_loss'], 'b-', label= 'Validation Loss')
plt.legend( loc= 'best')
plt.xlabel( 'Epochs')
plt.axis([ 0, epochs, 0, 1])
plt.show()
os.system( "pause")
其中绝对核心为:
model = Flatten()(model_vgg.output) 
model = Dense(4096, activation='relu', name='fc1')(model)
model = Dense(4096, activation='relu', name='fc2')(model)
model = Dropout(0.5)(model)
model = Dense(10, activation = 'softmax', name='prediction')(model) 
迁移学习非常重要(也只有这里需要编码)就是你迁移的那几层,如何进行修改。可能是要和你实际操作的数据的模式是相关的。
Test loss: 0.10201766314683482
Test accuracy: 0.9673
小结:
本课主要2个实践内容:
1、keras中数据集丰富,从数据集中提取更多特征(Data augmentation)
2、迁移学习(Tranform learning)
分别使用了cifar10和fasion_mnist数据集。这两个数据集能够很方便地用以实验,一方面是因为它们都是已经规整好的数据集,另一方面,两者
都是“单”数据集,也就是一个标签就是一个图片类型的情况。这些都可能被进一步复杂。





目前方向:图像拼接融合、图像识别 联系方式:[email protected]
目录
相关文章
|
7月前
|
机器学习/深度学习 自然语言处理 数据可视化
基于图神经网络的自然语言处理:融合LangGraph与大型概念模型的情感分析实践
本文探讨了在企业数字化转型中,大型概念模型(LCMs)与图神经网络结合处理非结构化文本数据的技术方案。LCMs突破传统词汇级处理局限,以概念级语义理解为核心,增强情感分析、实体识别和主题建模能力。通过构建基于LangGraph的混合符号-语义处理管道,整合符号方法的结构化优势与语义方法的理解深度,实现精准的文本分析。具体应用中,该架构通过预处理、图构建、嵌入生成及GNN推理等模块,完成客户反馈的情感分类与主题聚类。最终,LangGraph工作流编排确保各模块高效协作,为企业提供可解释性强、业务价值高的分析结果。此技术融合为挖掘非结构化数据价值、支持数据驱动决策提供了创新路径。
493 6
基于图神经网络的自然语言处理:融合LangGraph与大型概念模型的情感分析实践
|
2月前
|
监控 负载均衡 安全
WebSocket网络编程深度实践:从协议原理到生产级应用
蒋星熠Jaxonic,技术宇宙中的星际旅人,以代码为舟、算法为帆,探索实时通信的无限可能。本文深入解析WebSocket协议原理、工程实践与架构设计,涵盖握手机制、心跳保活、集群部署、安全防护等核心内容,结合代码示例与架构图,助你构建稳定高效的实时应用,在二进制星河中谱写极客诗篇。
WebSocket网络编程深度实践:从协议原理到生产级应用
|
8月前
|
存储 SQL 运维
中国联通网络资源湖仓一体应用实践
本文分享了中国联通技术专家李晓昱在Flink Forward Asia 2024上的演讲,介绍如何借助Flink+Paimon湖仓一体架构解决传统数仓处理百亿级数据的瓶颈。内容涵盖网络资源中心概况、现有挑战、新架构设计及实施效果。新方案实现了数据一致性100%,同步延迟从3小时降至3分钟,存储成本降低50%,为通信行业提供了高效的数据管理范例。未来将深化流式数仓与智能运维融合,推动数字化升级。
424 0
中国联通网络资源湖仓一体应用实践
|
3月前
|
机器学习/深度学习 传感器 数据采集
基于贝叶斯优化CNN-LSTM混合神经网络预测(Matlab代码实现)
基于贝叶斯优化CNN-LSTM混合神经网络预测(Matlab代码实现)
657 0
|
3月前
|
机器学习/深度学习 传感器 数据采集
【故障识别】基于CNN-SVM卷积神经网络结合支持向量机的数据分类预测研究(Matlab代码实现)
【故障识别】基于CNN-SVM卷积神经网络结合支持向量机的数据分类预测研究(Matlab代码实现)
287 0
|
4月前
|
机器学习/深度学习 数据采集 TensorFlow
基于CNN-GRU-Attention混合神经网络的负荷预测方法(Python代码实现)
基于CNN-GRU-Attention混合神经网络的负荷预测方法(Python代码实现)
220 0
|
5月前
|
机器学习/深度学习 人工智能 PyTorch
零基础入门CNN:聚AI卷积神经网络核心原理与工业级实战指南
卷积神经网络(CNN)通过局部感知和权值共享两大特性,成为计算机视觉的核心技术。本文详解CNN的卷积操作、架构设计、超参数调优及感受野计算,结合代码示例展示其在图像分类、目标检测等领域的应用价值。
340 7
|
11月前
|
边缘计算 容灾 网络性能优化
算力流动的基石:边缘网络产品技术升级与实践探索
本文介绍了边缘网络产品技术的升级与实践探索,由阿里云专家分享。内容涵盖三大方面:1) 云编一体的混合组网方案,通过边缘节点实现广泛覆盖和高效连接;2) 基于边缘基础设施特点构建一网多态的边缘网络平台,提供多种业务形态的统一技术支持;3) 以软硬一体的边缘网关技术实现多类型业务网络平面统一,确保不同网络间的互联互通。边缘网络已实现全球覆盖、差异化连接及云边互联,支持即开即用和云网一体,满足各行业需求。
405 4
|
6月前
|
机器学习/深度学习 数据采集 监控
基于CNN卷积神经网络和GEI步态能量提取的步态识别算法matlab仿真,对比不同角度下的步态识别性能
本项目基于CNN卷积神经网络与GEI步态能量提取技术,实现高效步态识别。算法使用不同角度(0°、45°、90°)的步态数据库进行训练与测试,评估模型在多角度下的识别性能。核心流程包括步态图像采集、GEI特征提取、数据预处理及CNN模型训练与评估。通过ReLU等激活函数引入非线性,提升模型表达能力。项目代码兼容Matlab2022a/2024b,提供完整中文注释与操作视频,助力研究与应用开发。
|
9月前
|
缓存 边缘计算 安全
阿里云CDN:全球加速网络的实践创新与价值解析
在数字化浪潮下,用户体验成为企业竞争力的核心。阿里云CDN凭借技术创新与全球化布局,提供高效稳定的加速解决方案。其三层优化体系(智能调度、缓存策略、安全防护)确保低延迟和高命中率,覆盖2800+全球节点,支持电商、教育、游戏等行业,帮助企业节省带宽成本,提升加载速度和安全性。未来,阿里云CDN将继续引领内容分发的行业标准。
555 7

热门文章

最新文章