1,mnist数据集
1.1 直接使用2个稠密层
#使用keras的完整mnist训练代码
from keras import models
from keras import layers
from keras.datasets import mnist
from keras.utils import to_categorical
(train_images,train_labels),(test_images,test_labels)=mnist.load_data()
network=models.Sequential()
#稠密层,也称为全连接层,操作为output=relu(dot(W,input)+b)
#relu(x)=max(x,0),即小于0时为0,大于0时为自己
#input_shape为每个图片像素信息对应张量,第二个留空(不指定批次大小)
network.add(layers.Dense(512,activation='relu',input_shape=(28*28,)))
#后面不需要指定输入大小,自动推算出为512
network.add(layers.Dense(10,activation='softmax'))
#编译需要优化器、损失函数、度量标准
network.compile(optimizer='rmsprop',loss='categorical_crossentropy',metrics=['accuracy'])
#将2维的像素降维。然后将像素转换为0-1之间的浮点数(因为是灰度图)
train_images = train_images.reshape((60000, 28 * 28))
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape((10000, 28 * 28))
test_images = test_images.astype('float32') / 255
#将标签转换,这个跟独热码是类似的,只是封装的更好用
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
#训练,指定输入数据、输入标签、批量大小、整体训练次数、verbose=0不打印过程,有利于提高性能
network.fit(train_images, train_labels, epochs=5, batch_size=128,verbose=0)
#测试结果
test_loss, test_acc = network.evaluate(test_images, test_labels)
#98.01%
print('test_acc:', test_acc)
1.2 使用卷积层
#基于卷积网络的mnist
from keras import models
from keras import layers
from keras.datasets import mnist
from keras.utils import to_categorical
import os
(train_images,train_labels),(test_images,test_labels)=mnist.load_data()
#reshape,指定颜色通道为1位
train_images=train_images.reshape((60000,28,28,1))
#转换成浮点数
train_images=train_images.astype('float32')/255
test_images=test_images.reshape((10000,28,28,1))
test_images=test_images.astype('float32')/255
#将标签转换成独热码形式
train_labels=to_categorical(train_labels)
test_labels=to_categorical(test_labels)
model=models.Sequential()
#卷积层,窗口3*3,输出(None,26,26,32)
#窗口一般为3*3或5*5
#32表示对于每一个窗口,提取32种特征行为
#填充padding:valid or same
#步长strides:默认1,很少设为其他值,使用池化层即可
model.add(layers.Conv2D(32,(3,3),activation="relu",input_shape=(28,28,1)))
#最大池化层,窗口2*2,步长为2,输出(None,13,13,32)
#作用:一般取窗口中最大值。如果没有池化层,如使用3*3窗口,到第三个卷积层也不过是代表了7*7窗口
#仅能反映部分信息;另一方面,将产生过多的参数,难以训练也容易过拟合
#平均池化层:使用窗口中元素的平均值。一般最大值包含的信息量更多,表现优于平均值。
model.add(layers.MaxPooling2D((2,2)))
#输出(None,11,11,64)
model.add(layers.Conv2D(64,(3,3),activation="relu"))
#输出(None,5,5,64)
model.add(layers.MaxPooling2D((2,2)))
#输出(None,3,3,64)
model.add(layers.Conv2D(64,(3,3),activation="relu"))
#Flatten层,输出(None,3*3*64)
model.add(layers.Flatten())
# 输出(None,64)
model.add(layers.Dense(64,activation='relu'))
# 输出(None,10)
model.add(layers.Dense(10,activation='softmax'))
#输出模型概要
# sum=model.summary()
# print(sum)
model.compile(optimizer='rmsprop',loss='categorical_crossentropy',metrics=['acc'])
model.fit(train_images,train_labels,epochs=5,batch_size=64)
result=model.evaluate(test_images,test_labels)
#[0.027329410206822648, 0.9928]从98.01%提高到99.28%,成功率虽然没提高多少,但是失败率降低了64%
print(result)
2,cat vs dog数据集
数据集:猫和狗各有1000个训练样本,500个验证样本,500个测试样本
2.1 使用4个卷积-池化层,精度70%
#图像分类,取自cat_dog数据集中的一小部分
from keras import models
from keras import layers
from keras import optimizers
import numpy as np
import json
from keras.preprocessing.image import ImageDataGenerator
import matplotlib.pyplot as plt
#需要注意目录结构,首先分成train,validation和test,每个文件夹下另有cats和dogs文件夹
train_dir='D:/Data/DeepLearningWithPython/cat_dog/kaggle/cat_dog_small/train'
validation_dir='D:/Data/DeepLearningWithPython/cat_dog/kaggle/cat_dog_small/validation'
test_dir='D:/Data/DeepLearningWithPython/cat_dog/kaggle/cat_dog_small/test'
model=models.Sequential()
mo