参考文章: https://www.cnblogs.com/ncuhwxiong/p/9836648.html文章目录
- 1 库导入部分
- 2. 载入数据并进行预处理
- 3. 神经网络
- 3.1 定义神经网络模型
- 3.2 模型评估
- 3.3 最佳模型
- 4 完整code
祝大家国庆快乐,学个习为祖国庆生!
<--------挖坑5处,欢迎评论区答疑和指正 !------->
2021.09.30 LeeML-Notes:P15,P16,P171 库导入部分
import keras #导入Keras from keras.models import Sequential # 导入序贯模型 from keras.layers.core import Dense,Dropout,Activation # 导入全连接层,激活函数 # from keras.layers import Conv2D,MaxPooling2D,Flatten from keras.optimizers import SGD,Adam # 导入优化函数SGD和Adam from keras.utils import np_utils from keras.datasets import mnist #导入手写集 import numpy as np
-
Dropout
Dropout的主要目的是使网络中过度拟合的影响最小化。
Dropout技术是通过随机减少神经网络中相互连接的神经元的数量来实现的。
摘自:https://baijiahao.baidu.com/s?id=1667213407197650339&wfr=spider&for=pc
-
mnist
MNIST是一组经过预处理的手写数字图片数据集,它为机器学习的初学者提供了一个练手的机会,可以在真实的数据上用学到的算法来解决问题。由于很多的机器学习教程都以MNIST作为入门项目,因此它也被称作是机器学习领域的“hello world”。
MNIST中每个样本都是一张长28、宽28的灰度图片,其中包含一个0-9的数字。
def load_data():
(x_train,y_train),(x_test,y_test) = mnist.load_data() # 下载mnist数据集
#切数据 定训练数据量
number = 10000 #x_train.shape为(60000,28,28)说明一共有6万张图片,每张是28*28。y_train是6万维的列向量(60000,)。test有1万张
x_train = x_train[0:number] #取前1万张作为训练集
y_train = y_train[0:number]
#数据格式变化
x_train = x_train.reshape(number,28*28) #x_train原来是(10000,28,28)现在转化为(1000,28*28)
x_test = x_test.reshape(x_test.shape[0],28*28) #x_test原来是(10000,28,28)现在转化为(10000,28*28)
#astype转换数据类型
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
#onehot编码
y_train = np_utils.to_categorical(y_train,10) #onehot编码
y_test = np_utils.to_categorical(y_test,10)
#没看懂 去掉应该不受影响
x_train = x_train
x_test = x_test
# #归一化到0-1区间 变为只有0 1的矩阵
x_train = x_train/255 #这个255可以不用除
x_test = x_test/255
return (x_train,y_train),(x_test,y_test)
(x_train,y_train),(x_test,y_test) = load_data()
-
【2行_挖坑1:这个写法有点不懂】(x_train,y_train),(x_test,y_test) = mnist.load_data()
但我觉得是固定写法,也就是从mnist下载数据集,分别是训练的一套和测试的一套。
-
x_test.shape[0]
因为我们不知道x_test具体个数 但他的形式我们知道(个数,28,28),所以取第一项就是它的个数。我觉得应该也可以查看一下这个数据集是多少 然后直接填数也可以
-
np_utils.to_categorical(y_train,10)
onehot编码,将结果分了0~9十个类
5 --> [ 0, 0, 0, 0, 0,1, 0, 0, 0, 0]
-
x_train = x_train x_test = x_test【挖坑2】啥用,是否能去掉
-
x_train = x_train/255
归一化 每个pixel我们用一个0-1之间的值进行表示.【26行_挖坑3】不知道是不是因为RGB三通道 ?所以才255
.【26行_挖坑4】为什么归一化后收敛速度反而慢了,没有不归一好?是不是一定要归一化?
#注释掉
# x_train=x_train/255
# x_test=x_test/255
- 【29行_挖坑5:为什么要再取一下】(x_train,y_train),(x_test,y_test) = load_data()
model=Sequential() model.add(Dense(input_dim=28*28,units=500,activation='sigmoid')) model.add(Dense(units=500,activation='sigmoid')) model.add(Dense(units=500,activation='sigmoid')) model.add(Dense(units=10,activation='softmax'))
-
model = sequential()
序贯模型是函数式模型的简略版,为最简单的线性、从头到尾的结构顺序,不分叉,是多个网络层的线性堆叠。
-
Dense
全连接层
-
model.add(Dense(units=10,activation=‘softmax’))
最后一个layer,因为output是10维,所以units=10,activation一般选softmax,意味着输出每个dimension只会介于0-1之间,总和是1,就可以把它当做为一种几率的东西。
#选择loss function的形式与optimizer的类别 model.compile(loss='mse',optimizer=SGD(lr=0.1),metrics=['accuracy'])
-
loss='mse’
均方误差作为损失函数
-
optimizer=SGD(lr=0.1)
梯度下降方式为SGD,随机梯度下降,学习率为0.1
-
metrics=[‘accuracy’]
指标要的正确率
#开始训练 model.fit(x_train,y_train,batch_size=100,epochs=30) #用test集进行检验: result=model.evaluate(x_test,y_test) print(result[1])
-
x_train,y_train
作为训练数据和标签
-
batch_size=100
100数据打个包,一起训练
注意:在划分batch的时候要随机打乱training data,不过在Keras这里我们只要指定batch size,里面都由Keras帮我们随机放数据进去。
-
epochs=30
若每个数据训练一遍,交一个epochs 那么30遍学习结束
-
要看一个epoch的更新速度,batch size大一些,会稳定一些,可以进行并行运算加速,但是太大,gpu吃不消
50000个数据:
- batch_size=1,epochs=1,那么就是1epoch训练了50000次,每次1个数据;训练1遍结束;
- batch_size=1,epochs=30,那么就是1epoch训练了5000次,每次10个数据;训练1遍结束;
因为GPU可以并行,所以基本上下面比上面快10倍
-
model.evaluate(x_test,y_test)
模型来预测x_test和y_test准确率
#case1:测试集正确率
score = model.evaluate(x_test,y_test)
print("Total loss on Testing Set:", score[0])
print("Accuracy of Testing Set:", score[1])
#case2:模型预测
result = model.predict(x_test)
-
model.evaluate(x_test,y_test)
把x_test,y_test喂给它,就会自动给你计算出Accuracy(精准性)。
它会output一个二维的向量,第一个维度代表了在test set上loss【损失值】,第二个维度代表了在test set上的accuracy【正确率】,这两个值是不一样的。
-
predict
第二种是做predict,就是系统上线后,没有正确答案的,call predict进行预测
import keras
from keras.models import Sequential
from keras.layers.core import Dense,Dropout,Activation
# from keras.layers import Conv2D,MaxPooling2D,Flatten
from keras.optimizers import SGD,Adam
from keras.utils import np_utils
from keras.datasets import mnist
import numpy as np
#载入数据并进行预处理:
def load_data():
(x_train,y_train),(x_test,y_test) = mnist.load_data() #x_train.shape为(60000,28,28)说明一共有6万张图片,每张是28*28。y_train是6万维的列向量。test有1万张
number = 10000
x_train = x_train[0:number] #取前1万张作为训练集
y_train = y_train[0:number]
x_train = x_train.reshape(number,28*28) #x_train原来是(10000,28,28)现在转化为(1000,28*28)
x_test = x_test.reshape(x_test.shape[0],28*28) #x_test原来是(10000,28,28)现在转化为(10000,28*28)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
y_train = np_utils.to_categorical(y_train,10) #onehot编码
y_test = np_utils.to_categorical(y_test,10)
x_train = x_train
x_test = x_test
x_train = x_train/255 #这个255可以不用除
x_test = x_test/255
return (x_train,y_train),(x_test,y_test)
(x_train,y_train),(x_test,y_test) = load_data()
#搭NN:
model = Sequential()
model.add(Dense(input_dim=28*28,units=500,activation='sigmoid'))
model.add(Dense(units=500,activation='sigmoid'))
model.add(Dense(units=10,activation='softmax'))
#选择loss function的形式与optimizer的类别
model.compile(loss='mse',optimizer=SGD(lr=0.1),metrics=['accuracy'])
#开始训练
model.fit(x_train,y_train,batch_size=100,epochs=30)
#用test集进行检验:
result=model.evaluate(x_test,y_test)
print(result[1])



