课程来自bilibili@Momodel平台 全长只有两个小时,理论部分讲得很粗糙
1 人的视觉和计算机视觉
人的大脑:神经元细胞,轴突发送信号,树突接收信号,互相连接,连接的强度和状态会随着新的经历刺激而变化。
用计算机模拟大脑,每个神经元的输入有很多,有很多权重,经过激活函数,输出一个值。
全连接网络:略
计算机图像的一些基础概念:略
图像-flatten(二维展开成一维)->全连接网络
2 神经网络介绍
人工设计神经网络(结构);参数是学习训练出来的。需要数据和相应标签。
与真实值的偏差是损失。使得损失最小的算法:梯度下降,反向传播。
3 卷积神经网络
处理图像时,全连接网络的第一层将会非常大,如100*100*3的图片,有1000个神经元,会有3e7的连接,这样就太大了。
卷积层->最大池化层(多次)-flatten>全连接网络
模式1比整张图片要小;2模式可能出现在图像的不同区域。如“猫耳检测器”,可以复用;3对图像进行缩小并不会改变图像,而可以使得参数大量减少。
1.2属性导致了卷积层的存在。不同的卷积核有不同的效果,如边缘检测、锐化等。
边界可以padding。full padding:卷积结果比原图片大,对任何一个像素都不放过。same padding:卷积结果与原图片一样大。
Stride:卷积核每次移动的步长。
彩色图片:三通道,处理后相加。
3属性导致了池化层的存在。起到了图像缩小的效果。
逐步抽象。
框架 Keras
是一个用python编写的高级神经网络API
Keras现在已经被收入tensorflow里了
方式1
Sequenttial序列模型
非常简单,只支持单输入,单输出(适合猫狗识别)
方式2
函数式API
支持多输入多输出
import keras
from keras import layers #层
model=keras.Sequential() #建立序列模型
model.add(layers.Dense(20,activation='relu',input_shape=(10,))) #加层,Dense表示全连接层
#参数是神经元数量、激活函数,输入的参数值数量
model.add(layers.Dense(20,activation='relu'))
model.add(layers.Dense(10,activation='softmax'))
#训练,x表示样本数据,y表示标签,epochs即训练迭代次数,batch_size是一批的大小
model.fit(x,y,epochs=10,batch_size=32)
#Conv2D 创造卷积核
#参数,filters=输出空间的维度,kernel_size:卷积核的宽高,strides=步长,padding选择valid或same
keras.layers.Conv2D(filters,kernel_size,strides=(1,1),padding='valid',data_format=None)
#MaxPooling2D 池化层
#参数,pool_size缩小比例的因数,strides,padding
keras.layers.MaxPooling2D(pool_size=(2,2),strides=None,padding='valid',data_format=None)
导入数据集
从momodel里直接导入
导包
import sys
from matplotlib import pyplot
from keras.utils import to_categorical
from keras.models import Sequential
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Dense
from keras.layers import Flatten
from keras.optimizers import SGD
from keras.preprocessing.image import ImageDataGenerator
import tensorflow as tf
tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR)
基础CNN模型
def define_cnn_model():
model=Sequential() #建立序列模型
#卷积层
model.add(Conv2D(32,(3,3),activation='relu',padding='same',input_shape=(200,200,3)))
#最大池化层
model.add(MaxPooling2D((2,2)))
#Flatten层
model.add(Flatten())
#全连接层
model.add(Dense(128,activation='relu',))
model.add(Dense(1,activation='sigmoid'))
#编译模型 优化器
opt=SGD(lr=0.001,momentum=0.9)
model.compile(optimizer=opt,loss='binary_crossentropy',metrics=['accuracy'])
return model
打印模型结构
model=define_cnn_model()
plot_model(model,to_file='cnn_model.png',dpi=100,show_shapes=True,show_layer_names=True)
def train_cnn_model():
model=define_cnn_model()
#图片生成器
datagen=ImageDataGenerator(rescale=1.0/255.0)
train_it=datagen.flow_from_directory(
'/home/jovyan/work/datasets/ma1ogo3ushu4ju4ji2-momodel/dogs_cats/data/train',
class_mode='binary',
batch_size=64,
target_size=(200,200)
)
#训练模型
model.fit_generator(train_it,
steps_per_epoch=len(train_it),
epochs=1,
verbose=1)
使用gpu添加任务进行训练
train_cnn_model()
epochs=1时结果为58%的准确率
epochs=20时,准确率达到了92.8%
预测
from keras.models import load_model
model_path='/home/jovyan/work/datasets/ma1ogo3ushu4ju4ji2-momodel/dogs_cats/model/basic_cnn_model.h5'
model=load_model(model_path)
import os,random
from matplotlib.pyplot import imshow
import numpy as np
from PIL import Image
%matplotlib inline
def read_random_image():
folder='/home/jovyan/work/datasets/ma1ogo3ushu4ju4ji2-momodel/dogs_cats/data/test/'
file_path=folder+random.choice(os.listdir(folder))
pil_im=Image.open(file_path,'r')
return pil_im
def get_predict(pil_im,model):
pil_im=pil_im.resize((200,200))#对图片缩放
array_im=np.asarray(pil_im)
array_im = array_im[np.newaxis,:]
result=model.predict([[array_im]])
if result[0][0]>0.5:
print('狗')
else:
print('猫')
pil_im=read_random_image()
imshow(np.asarray(pil_im))
get_predict(pil_im,model)
预测结果:
迁移学习
是一种机器学习方法,把为A任务开发的模型拿出来复用。即使用预训练的模型。
基于inceptionV3模型做迁移学习
include_top=是否包括推理部分