吴恩达深度学习 第四课第二周编程作业_Keras tutorial - the Happy House

Keras tutorial - the Happy House

参考:https://blog.csdn.net/u013733326/article/details/80250818

##决定不是全部翻译或者照搬了,把每周有价值的东西记录。

欢迎来到第二周的第一个作业。在这个作业中,你将:

学习使用Keras,这是一种高级的神经网络API(编程框架),用Python编写,能够运行在几个底层框架之上,包括TensorFlow和CNTK。
看看你如何在几个小时内构建一个深度学习算法
我们为什么要使用Keras?开发Keras是为了让深度学习工程师能够非常快速地构建和试验不同的模型。正如TensorFlow是一个比Python更高级别的框架,Keras是一个更高级别的框架,它提供了额外的抽象方法。能够以最小的延迟从想法到结果是找到好的模型的关键。然而,Keras比底层框架具有更多的限制性,因此有些非常复杂的模型可以在TensorFlow中实现,但在Keras中却不能(不太困难)实现。也就是说,Keras可以很好地用于许多常见的模型。

在这个练习中,您将处理“快乐之家”问题,我们将在下面解释。让我们装载所需的包来解决快乐之家的问题吧!

 

 1 import numpy as np
 2 from keras import layers
 3 from keras.layers import Input, Dense, Activation, ZeroPadding2D, BatchNormalization, Flatten, Conv2D
 4 from keras.layers import AveragePooling2D, MaxPooling2D, Dropout, GlobalMaxPooling2D, GlobalAveragePooling2D
 5 from keras.models import Model
 6 from keras.preprocessing import image
 7 from keras.utils import layer_utils
 8 from keras.utils.data_utils import get_file
 9 from keras.applications.imagenet_utils import preprocess_input
10 import pydot
11 from IPython.display import SVG
12 from keras.utils.vis_utils import model_to_dot
13 from keras.utils import plot_model
14 from kt_utils import *
15 import os
  os.environ['KERAS_BACKEND']='tensorflow'
16 import keras.backend as K 17 K.set_image_data_format('channels_last') 18 import matplotlib.pyplot as plt 19 from matplotlib.pyplot import imshow 20 21 %matplotlib inline

注意:如您所见,我们已经从Keras导入了很多函数。你可以通过直接在笔记本中调用它们来轻松地使用它们。例如:X = Input(…)或X = ZeroPadding2D(…)。

运行后出现问题:

Warning! ***HDF5 library version mismatched error***
The HDF5 header files used to compile this application do not match
the version used by the HDF5 library to which this application is linked.
Data corruption or segmentation faults may occur if the application continues.
This can happen when an application was compiled by one version of HDF5 but
linked with a different version of static or shared HDF5 library.
You should recompile the application or check your shared library related
settings such as 'LD_LIBRARY_PATH'.
You can, at your own risk, disable this warning by setting the environment
variable 'HDF5_DISABLE_VERSION_CHECK' to a value of '1'.
Setting it to 2 or higher will suppress the warning messages totally.
Headers are 1.10.4, library is 1.10.5


---
                   HDF5 Version: 1.10.5
                  Configured on: 2019-03-04
                  Configured by: Visual Studio 15 2017 Win64
                    Host system: Windows-10.0.17763
              Uname information: Windows
                       Byte sex: little-endian
             Installation point: C:/Program Files/HDF5

参考:更新anacaonda后,HDF5 header version与HDF5 library不匹配问题的解决

解决引入keras后出现的Using TensorFlow backend的错误

1 - The Happy House

  下一次放假的时候,你决定和你的五个朋友一起度过一个星期。这是一个非常好的房子,在附近有很多事情要做,但最重要的好处是每个人在家里都会感到快乐,所以任何想进入房子的人都必须证明他们目前的幸福状态。

 

 2 - Building a model in Keras

Keras非常适合快速制作模型,它可以在很短的时间内建立一个很优秀的模型,举个例子:

def model(input_shape):
    """
    模型大纲
    """
    #定义一个tensor的placeholder,维度为input_shape
    X_input = Input(input_shape)
    
    #使用0填充:X_input的周围填充0
    X = ZeroPadding2D((3,3))(X_input)
    
    # 对X使用 CONV -> BN -> RELU 块
    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
    

这里的MaxPooling2D是什么意思?

请注意:Keras框架使用的变量名和我们以前使用的numpy和TensorFlow变量不一样。它不是在前向传播的每一步上创建新变量(比如X, Z1, A1, Z2, A2,…)以便于不同层之间的计算。在Keras中,我们使用X覆盖了所有的值,没有保存每一层结果,我们只需要最新的值,唯一例外的就是X_input,我们将它分离出来是因为它是输入的数据,我们要在最后的创建模型那一步中用到。

 1 def HappyModel(input_shape):
 2     """
 3     实现一个检测笑容的模型
 4     
 5     参数:
 6         input_shape - 输入的数据的维度
 7     返回:
 8         model - 创建的Keras的模型
 9         
10     """
11     
12     #你可以参考和上面的大纲
13     X_input = Input(input_shape)
14 
15     #使用0填充:X_input的周围填充0
16     X = ZeroPadding2D((3, 3))(X_input)
17 
18     #对X使用 CONV -> BN -> RELU 块
19     X = Conv2D(32, (7, 7), strides=(1, 1), name='conv0')(X)
20     X = BatchNormalization(axis=3, name='bn0')(X)
21     X = Activation('relu')(X)
22 
23     #最大值池化层
24     X = MaxPooling2D((2, 2), name='max_pool')(X)
25 
26     #降维,矩阵转化为向量 + 全连接层
27     X = Flatten()(X)
28     X = Dense(1, activation='sigmoid', name='fc')(X)
29 
30     #创建模型,讲话创建一个模型的实体,我们可以用它来训练、测试。
31     model = Model(inputs=X_input, outputs=X, name='HappyModel')
32 
33     return model
def HappyModel(input_shape):

 

现在我们已经设计好了我们的模型了,要训练并测试模型我们需要这么做:

  1. 创建一个模型实体。
  2. 编译模型,可以使用这个语句:model.compile(optimizer = "...", loss = "...", metrics = ["accuracy"])
  3. 训练模型:model.fit(x = ..., y = ..., epochs = ..., batch_size = ...)
  4. 评估模型:model.evaluate(x = ..., y = ...)

如果你想要获取关于model.compile(), model.fit(), model.evaluate()的更多的信息,你可以参考这里

#创建一个模型实体
happy_model = HappyModel(X_train.shape[1:])
#编译模型
happy_model.compile("adam","binary_crossentropy", metrics=['accuracy'])
#训练模型
#请注意,此操作会花费你大约6-10分钟。
happy_model.fit(X_train, Y_train, epochs=40, batch_size=50)
#评估模型
preds = happy_model.evaluate(X_test, Y_test, batch_size=32, verbose=1, sample_weight=None)
print ("误差值 = " + str(preds[0]))
print ("准确度 = " + str(preds[1]))

执行结果:

Epoch 1/40
600/600 [==============================] - 12s 19ms/step - loss: 2.2593 - acc: 0.5667
Epoch 2/40
600/600 [==============================] - 9s 16ms/step - loss: 0.5355 - acc: 0.7917
Epoch 3/40
600/600 [==============================] - 10s 17ms/step - loss: 0.3252 - acc: 0.8650
Epoch 4/40
600/600 [==============================] - 10s 17ms/step - loss: 0.2038 - acc: 0.9250
Epoch 5/40
600/600 [==============================] - 10s 16ms/step - loss: 0.1664 - acc: 0.9333

...

Epoch 38/40
600/600 [==============================] - 10s 17ms/step - loss: 0.0173 - acc: 0.9950
Epoch 39/40
600/600 [==============================] - 14s 23ms/step - loss: 0.0365 - acc: 0.9883
Epoch 40/40
600/600 [==============================] - 12s 19ms/step - loss: 0.0291 - acc: 0.9900
150/150 [==============================] - 3s 21ms/step
误差值 = 0.407454126676
准确度 = 0.840000001589

 

 

 

3 - Conclusion

这个任务算是完成了,你可以在你家试试[手动滑稽]

 

4 - Test with your own image (Optional)

### START CODE HERE ###
img_path = 'images/my_image.jpg'
### END CODE HERE ###
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))

行结果:

 

 

 

5 - Other useful functions in Keras (Optional)

  • model.summary():打印出你的每一层的大小细节
  • plot_model() : 绘制出布局图
happy_model.summary()

 

 

plot_model(happyModel, to_file='HappyModel.png')
SVG(model_to_dot(happyModel).create(prog='dot', format='svg'))

 

 

 

坑:本人未出现,可能因为其他任务装过pydot啥的

  1. 请下载并安装Graphviz的windows版本,然后写入环境变量,博主的环境变量填的是:E:\Anaconda3\Lib\site-packages\Graphviz\bin,因人而异吧.
  2. 请安装pydot-ng & graphviz,其代码CMD代码为:pip install pydot-ng & pip install graphviz或者是pip install pydotpip install graphviz
  3. 重启Jupyter Notebook 【手动微笑】【手动再见】

 

 

 

 

posted @ 2020-09-13 21:54  廖海清  阅读(793)  评论(3编辑  收藏  举报