赞
踩
参考:
yty的小迷弟_【头歌平台】人工智能-深度学习初体验
HNU岳麓山大小姐_人工智能导论:深度学习初体验
A橙_人工智能-实验四
1、了解深度学习的基本原理;
2、能够使用深度学习开源工具;
3、应用深度学习算法求解实际问题。
1、解释深度学习原理;
2、采用深度学习框架完成课程综合实验,并对实验结果进行分析;
3、回答思考题。
1、课程实训平台 https://www.educoder.net/paths/369
2、华为云平台(推荐使用昇腾910、ModelArts、OCR识别、图像识别等完成综合实验)
https://www.huaweicloud.com/
全连接网络包含输入层、隐藏层和输出层
输入层表示用来接收数据输入的一组神经元。
输出层表示用来输出的一组神经元。
隐藏层表示介于输入层与输出层之间的一组神经元。
对
层数较多的神经网络为深层神经网络
深度学习:
构建多层隐藏层的人工神经网络;
通过卷积,池化,误差反向传播等手段,进行特征学习,提高分类或预测的准确性。
深度学习通过增加网络的深度,减小每层需要拟合的特征个数,逐层提取底层到高层的信息,达到更好的预测和分类性能。强调模型结构的深度,通常有5层以上的隐藏层。
对
ReLU(11)=11
ReLU 函数的公式:f(x)=max(0,x)
图像:
下列说法错误的是
A、用深层神经网络实现想要的功能就是深度学习
B、神经网络的灵感来自于人类大脑的神经系统的构成
C、含有1层隐藏层的神经网络称之为深层神经网络
反向传播主要是为了计算参数对损失函数的梯度?
梯度下降是一种迭代更新的算法?
神经网络的训练过程只有前向传播过程?
作用:常用于图像识别。CNN是识别二维形状的一个多层感知器,对于平移、比例缩放、旋转等其他形式的变相具有一定的不变性
算法思想:
卷积
池化
全连接网络
from keras.models import Sequential
model = Sequential()
'''
units=64表示这层有64个神经元
activation='relu'表示这层的激活函数是relu
'''
model.add(Dense(units=64, activation='relu')
'''
16表示该卷积层有16个卷积核
kernel_size=3表示卷积核的大小为3*3
activation='relu'表示卷积层的激活函数是relu
input_shape=[IMAGE_HEIGHT, IMAGE_WIDTH, 3]表示待卷积图像为32*32的3通道图像
'''
model.add(Conv2D(16, kernel_size=3, activation='relu', input_shape=[32, 32, 3]))
'''
pool_size=2表示池化窗口的大小为2*2
'''
model.add(MaxPooling2D(pool_size=2))
'''
卷积或者池化后想要接上全连接层之前需要接入扁平层
'''
model.add(Flatten())
'''
loss='categorical_crossentropy'表示使用交叉熵损失函数
optimizer=keras.optimizers.SGD(lr=0.0001)表示训练时使用mini-batch梯度下降方法来更新参数,学习率为0.0001
metrics=['accu\fracy']表示训练时模型主要考量正确率
'''
model.compile(loss='categorical_crossentropy', optimizer=keras.optimizers.SGD(lr=0.0001),
metrics=['accu\fracy'])
'''
images表示的是训练集图像
onehot表示的是训练集图像所对应的onehot编码
epochs=5表示的是迭代5次
batch=32表示batch的数量是32
verbose=0表示在训练过程中不打印损失值、正确率等信息
'''
model.fit(images, onehot, epochs=5, batch_size=32, verbose=0)
'''
images表示待预测图像
batch_size表示batch的数量
'''
result = model.predict(images, batch_size=32)
from keras.models import Sequential from keras.layers import Conv2D, MaxPool2D, Flatten, Dense import numpy as np # 设置随机种子 np.random.seed(1447) def build_model(): ''' 在Begin-End段中构建出如下结构的卷积神经网络 1.64个5*5的卷积核组成的卷积层,激活函数为relu 2.最大池化层,池化核大小为2*2 3.扁平 4.128个神经元的全连接层,激活函数为relu 5.10个神经元的全连接层,激活函数为softmax :return: 构建好的模型 ''' model = Sequential() model.add(Conv2D(32, (5, 5), activation='relu', input_shape=[28, 28, 1])) #********* Begin *********# model.add(Conv2D(64, (5, 5), activation='relu')) model.add(MaxPool2D(pool_size=(2, 2))) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dense(10, activation='softmax')) #********* End *********# return model # 包含两个卷积层,一个池化层,然后连接了一个扁平层, # 扁平层的作用是将多维的输入一维化,用在从卷积层到全连接层的过渡, # 最后连接了两个全连接层,输出结果。
Embedding层:
from keras.layers import Embedding, SimpleRNN, Dense
from keras import Sequential
model = Sequential()
# 对输入的影评进行word embedding,一般对于自然语言处理问题需要进行word embedding
model.add(Embedding(1000, 64))
# 构建一层有40个神经元的RNN层
model.add(SimpleRNN(40))
# 将RNN层的输出接到只有一个神经元全连接层
model.add(Dense(1, activation='sigmoid'))
from keras.models import Sequential from keras.layers import Embedding, SimpleRNN, Dense def build_model(): ''' 在Begin-End段中构建如下结构的循环神经网络 1.有30个神经元的SimpleRNN层 2.有16个神经元的全连接层,激活函数为relu 3.有1个神经元的全连接层,激活函数为sigmoid :return: 构建好的模型 ''' model = Sequential() model.add(Embedding(1000, 64)) #********* Begin *********# model.add(SimpleRNN(30)) model.add(Dense(units=16, activation='relu')) model.add(Dense(units=1, activation='sigmoid')) #********* End *********# return model
# 导入 cv2
import cv2
#使用 imread 函数来读取图片,其中 filename 是想要读取的图片路径。
img = cv2.imread(filename)
#由于训练集中的图片大小不一,所以需要将读取到的图片强制缩放到固定的宽和高
# resize 函数,其中 (32, 32) 的意思是将源图像缩放成宽和高都是 32 个像素的图像。
resized_image = cv2.resize(img, (32, 32))
img = img / 255.0
# 先用 numpy 的 zeros 函数分配好空间
# row 指的是有多少张训练集图片,col 指的是有多少种标签
onehot = np.zeros((row, col))
# 然后根据图片名字在对应的列上填 1 即可
#(在这里假设 onehot 的第 1 列是猫,第 2 列是狗)
model = keras.Sequential()
model.add(Conv2D(32, kernel_size=3, activation='relu', input_shape=[IMAGE_HEIGHT, IMAGE_WIDTH, 3]))
model.add(MaxPooling2D(pool_size=2))
model.add(Conv2D(32, kernel_size=3, activation='relu'))
model.add(MaxPooling2D(pool_size=2))
model.add(Flatten())
model.add(Dense(96, activation='relu'))
model.add(Dense(2, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer=keras.optimizers.Adam(lr=0.0001),
metrics=['accu\fracy'])
model.fit(images, onehot, epochs=20, batch_size=32, verbose=0)
result = model.predict(images, batch_size=32)
# 得到预测结果
predict_idx = np.argmax(result, axis=1)
from keras.layers import Dense, Activation, Flatten, Dropout, Conv2D, MaxPooling2D import keras import os import numpy as np import cv2 # 设置随机种子 np.random.seed(1447) IMAGE_HEIGHT = 128 IMAGE_WIDTH = 128 def get_train_data(data_path): ''' 读取并处理数据 :return:处理好的图像和对应的one-hot编码 ''' images = [] onehot = np.zeros((500, 2)) #********* Begin *********# for i, img_name in enumerate(os.listdir(data_path)): if 'cat' in img_name: onehot[i, 0] = 1 else: onehot[i, 1] = 1 img = cv2.imread(os.path.join(data_path, img_name)) img = cv2.resize(img, (IMAGE_HEIGHT, IMAGE_WIDTH)) images.append(np.array(img, "float32") / 255.0) #********* End *********# return np.array(images), onehot def build_model(): ''' 构建模型 :return:构建好的模型 ''' model = keras.Sequential() #********* Begin *********# model.add(Conv2D(32, kernel_size=3, activation='relu', input_shape=[IMAGE_HEIGHT, IMAGE_WIDTH, 3])) model.add(MaxPooling2D(pool_size=2)) model.add(Conv2D(32, kernel_size=3, activation='relu')) model.add(MaxPooling2D(pool_size=2)) model.add(Flatten()) model.add(Dense(96, activation='relu')) model.add(Dense(2, activation='softmax')) #********* End *********# return model def fit_and_predict(model, train_images, onehot, test_images): ''' 训练模型,并对测试图像进行预测 :param model: 训练好的模型 :param train_images: 训练集图像 :param onehot: 训练集的one-hot编码 :param test_images: 测试集图像 :return: 预测结果 ''' #********* Begin *********# # 编译模型 model.compile(loss='categorical_crossentropy', optimizer=keras.optimizers.Adam(lr=0.0001), metrics=['accuracy']) #********* End *********# model.fit(train_images, onehot, epochs=20, batch_size=32, verbose=0) result = model.predict(test_images, batch_size=10) predict_idx = np.argmax(result, axis=1) return predict_idx
from keras.layers import Dense, Activation, Flatten, Dropout, Conv2D, MaxPooling2D import keras import os import numpy as np import cv2 # 设置随机种子 np.random.seed(1447) IMAGE_HEIGHT = 128 IMAGE_WIDTH = 128 def get_train_data(data_path): ''' 读取并处理数据 :return:处理好的图像和对应的one-hot编码 ''' images = [] onehot = np.zeros((500, 2)) #********* Begin *********# for i, img_name in enumerate(os.listdir(data_path)): if 'cat' in img_name: onehot[i, 0] = 1 else: onehot[i, 1] = 1 img = cv2.imread(os.path.join(data_path, img_name)) img = cv2.resize(img, (IMAGE_HEIGHT, IMAGE_WIDTH)) img = img / 255.0 images.append(img) #********* End *********# return np.array(images), onehot def build_model(): ''' 构建模型 :return:构建好的模型 ''' model = keras.Sequential() #********* Begin *********# model.add(Conv2D(32, kernel_size=3, activation='relu', input_shape=[IMAGE_HEIGHT, IMAGE_WIDTH, 3])) model.add(MaxPooling2D(pool_size=2)) model.add(Conv2D(32, kernel_size=3, activation='relu')) model.add(MaxPooling2D(pool_size=2)) model.add(Flatten()) model.add(Dense(96, activation='relu')) model.add(Dense(2, activation='softmax')) #********* End *********# return model def fit_and_predict(model, train_images, onehot, test_images): ''' 训练模型,并对测试图像进行预测 :param model: 训练好的模型 :param train_images: 训练集图像 :param onehot: 训练集的one-hot编码 :param test_images: 测试集图像 :return: 预测结果 ''' #********* Begin *********# # 编译模型 model.compile(loss='categorical_crossentropy', optimizer=keras.optimizers.Adam(lr=0.0001), metrics=['accuracy']) #********* End *********# model.fit(train_images, onehot, epochs=20, batch_size=32, verbose=0) result = model.predict(test_images, batch_size=10) predict_idx = np.argmax(result, axis=1) return predict_idx
# 通过版本
images.append(np.array(img, "float32") / 255.0)
# 不通过版本
img = img / 255.0
images.append(img)
两种实现的异同:
结论:把img先变成float32类型,再进行除法就可以通过(这里改成float64的话也会出错)
# right
img = img.astype("float32")/ 255.0
img = img.astype(np.float32)/ 255.0
# error
img = img.astype(float)/ 255.0
img = img.astype("float")/ 255.0
img = img.astype(np.float)/ 255.0
img = img.astype("float64")/ 255.0
img = img.astype(np.float64)/ 255.0
1.深度算法参数的设置对算法性能的影响?
深度学习中的参数是控制模型结构、训练效率、训练效果的关键。常见的参数及对模型训练的影响如下:
学习率(Learning rate):决定在优化算法中更新参数权重的幅度。学习率可以是恒定的,逐渐降低的,基于动量的等
迭代次数(Epoch):训练次数;
一次训练选取的样本数(Batch size):影响训练时间;
优化器:常见的有SGD(随机梯度下降),dagrad(自适应梯度下降,不同参数学习率不同)等
激活函数:增加神经网络模型的非线性,要根据具体问题选择合适的激活函数。
损失函数:影响收敛速度和模型整体性能。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。