这一周的作业我们将学习:
为什么使用Keras?
Keras能够使得我们很快的建立不同的神经网络模型。TensorFlow是一个比python高级的框架,而Keras是比TensorFlow还高级的框架,提供了额外的抽象方法。最关键的是Keras可以使你较快的从想法到实现,让你更快的找到好的模型。但是Keras的缺点是比低级框架受到更多限制,所以很多复杂的模型还是选择用TensorFlow实现而不是Keras。但是我们还是可以说在很多常见模型上Keras是比较好的。
在这个练习中,我们需要解决“Happy House”问题,我们需要下载需要的包来解决这个问题,如下所示:
代码:
import numpy as np
from keras import layers
from keras.layers import Input,Activation,ZeroPadding2D,BatchNormalization,Flatten,Conv2D
from keras.layers import AveragePooling2D,MaxPooling2D,Dropout,GlobalAveragePooling2D,GlobalMaxPool2D
from keras.models import Model
from keras.preprocessing import image
from keras.utils import layer_utils
from keras.utils.data_utils import get_file
from keras.applications.imagenet_utils import preprocess_input
import pydot
from IPython.display import SVG
from keras.utils.vis_utils import model_to_dot
from keras.utils import plot_model
#kt_utils文件代码放在文章最后
from Week4.Second.utils.kt_utils import *
import keras.backend as K
K.set_image_data_format('channels_last')
import matplotlib.pyplot as plt
from matplotlib.pyplot import imshow
题目背景:你租了一个房子,希望让每个进入的人都证明他们处于幸福、开心的状态。
看到这个题目,我们首先想到的就是建立一个深度学习模型,使用门口的摄像头获得进入者的图片,用模型检测这个人是否处于开心的状态。
假设我们已经收集了很多朋友和自己的照片,均是由门口的摄像头拍摄,且数据集经过标记。
if __name__ == "__main__":
X_train_orig, Y_train_orig, X_test_orig, Y_test_orig, classes = load_dataset()
X_train = X_train_orig / 255
X_test = X_test_orig / 255
Y_train = Y_train_orig.T
Y_test = Y_test_orig.T
print("number of training examples = " + str(X_train.shape[0]))
print("number of test examples = " + str(X_test.shape[0]))
print("X_train shape: " + str(X_train.shape))
print("Y_train shape: " + str(Y_train.shape))
print("X_test shape: " + str(X_test.shape))
print("Y_test shape: " + str(Y_test.shape))
使用keras建立模型的例子:
代码:
def model(input_shape):
#1.定义一个输入数据向量,相当于tensor占位符
X_input = Input(input_shape)
#2.Zero_padding
X = ZeroPadding2D((3, 3))(X_input)
#3. Conv -> BN -> RELU Block applied to X
X = Conv2D(32, (7, 7), strides=(1, 1), name='conv0')(X)
#axis的值取决于按照qnput的哪一个维度进行BN,如果输入为channel_last,[height, width, channel]则axis = 3
X = BatchNormalization(axis=3, name='bn0')(X)
X = Activation('relu')(X)
#4.MaxPOOL
X = MaxPooling2D((2, 2), name='max_pool')
#5.Flatten X + FullyConnected
X = Flatten()(X)
X = Dense(1, activation='sigmoid', name='fc')(X)
model = Model(inputs = X_input, outputs = X, name='HappyModel')
return model
从上面的例子我们可以看出,Keras将我们建立模型的过程简化了很多,接下来我么就利用Kera来完成一个HappyModel()模型的建立。
练习:实现HappyModel()。我们建议您从使用我们建议的体系结构来实现一个模型开始,然后使用这个模型作为您的初始模型来完成剩下的任务。后面你需要主动尝试其他的模型架构。例如,您可以从上面的模型中获得灵感,然后根据需要改变网络架构和超参数。你还可以使用其他函数:AveragePooling2D(), GlobalMaxPooling2D(), Dropout()
代码:
def HappyModel(input_shape):
X_input = Input(input_shape)
X = ZeroPadding2D((3, 3))(X_input)
X = Conv2D(32, (7, 7), strides=(1, 1), name='conv0')(X)
X = BatchNormalization(axis=3, name='bn0')(X)
X = Activation('relu')(X)
X = MaxPooling2D((2, 2), name='max_pool')(X)
X = Flatten()(X)
X = Dense(1, activation='sigmoid', name='fc')(X)
model = Model(inputs=X_input, outputs=X, name='HappyModel')
return model
现在我们已经建立了一个模型了,如果想要训练和测试这个模型,在Keras中需要4步。
model.compile(optimizer = "...", loss = "...", metrics = ["accuracy"])
model.fit(x = ..., y = ..., epochs = ..., batch_size = ...)
model.evaluate(x = ..., y = ...)
代码:
#1.创建模型
happyModel = HappyModel(X_train.shape[1:])
#2.编译模型
happyModel.compile('adam', 'binary_crossentropy', metrics=['accuracy'])
#3.训练模型
happyModel.fit(X_train, Y_train, epochs=40, batch_size=50)
部分运行结果截图(训练过程太长,不一一放上来了,只放第40次迭代过程):
注意,如果再次运行fit(),模型将继续使用它已经学习过的参数进行训练,而不是重新初始化它们。
评价模型:
#4.测试模型
preds = happyModel.evaluate(X_test, Y_test, batch_size=32, verbose=1, sample_weight=None)
print()
print("Loss = " + str(preds[0]))
print("Test Accuracy = " + str(preds[1]))
运行结果:
如果你的准确度没有高于75%,那么可以尝试者改变模型。
总结:
img_path = 'datasets/my_image.jpg'
img = image.load_img(img_path, target_size=(64, 64))
imshow(img)
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)
print(happyModel.predict(x))
model.summary()
:在表中打印各层输入/输出大小的详细信息。plot_model()
:在一个漂亮的布局中绘制图形,我们可以使用SVG()将其保存为png格式图片。代码:
happyModel.summary()
plot_model(happyModel, to_file='HappyModel.png')
SVG(model_to_dot(happyModel).create(prog='dot', format='svg'))
kt_utils.py
import keras.backend as K
import math
import numpy as np
import h5py
import matplotlib.pyplot as plt
def mean_pred(y_true, y_pred):
return K.mean(y_pred)
def load_dataset():
train_dataset = h5py.File('datasets/train_happy.h5', "r")
train_set_x_orig = np.array(train_dataset["train_set_x"][:]) # your train set features
train_set_y_orig = np.array(train_dataset["train_set_y"][:]) # your train set labels
test_dataset = h5py.File('datasets/test_happy.h5', "r")
test_set_x_orig = np.array(test_dataset["test_set_x"][:]) # your test set features
test_set_y_orig = np.array(test_dataset["test_set_y"][:]) # your test set labels
classes = np.array(test_dataset["list_classes"][:]) # the list of classes
train_set_y_orig = train_set_y_orig.reshape((1, train_set_y_orig.shape[0]))
test_set_y_orig = test_set_y_orig.reshape((1, test_set_y_orig.shape[0]))
return train_set_x_orig, train_set_y_orig, test_set_x_orig, test_set_y_orig, classes