Q1:如何理解神经网络中的梯度消失和梯度爆炸?如何解决梯度消失和梯度爆炸?
Q2:学习调用keras中的预训练模型(VGG16,ResNet50)等提取特征,完成ImageNet图像分类。
answer1:
请参考该博主的文章:https://blog.csdn.net/program_developer/article/details/80032376
answer2:
"""
首先需要了解一下keras 关于图像处理的
一些既定的模型
###RestNet50
from keras.applications.resnet50 import ResNet50
from keras.applications.vgg16 import VGG16
from keras.applications.vgg19 import VGG19
from keras.preprocessing import image
from keras.applications.resnet50 import preprocess_input,decode_predictions
import numpy as np
model = VGG16(weights='imagenet')#类似的可以使用VGG19,RestNet50等预测模块
img_path='timg.jpg'#选了一个戴眼镜的狗
img=image.load_img(img_path,target_size=(224,224))
x=image.img_to_array(img)
#print (np.shape(x))转化为数组是[224,224,3]
x=np.expand_dims(x,axis=0)#在axis=0上,也就是横向上扩充为度
#print (np.shape(x)) [1,224,224,3]
x=preprocess_input(x)#进行预处理
preds=model.predict(x)
#decode the results into a list of tuples (class, description, probability)
# (one such list for each sample in the batch)
print ('predicted:',decode_predictions(preds,top=3)[0])#四维数据,因此选中了一个列表中的第一个元素
"""
####接下来为第二个问题的详细代码
from keras.applications.resnet50 import ResNet50
from keras.preprocessing import image
from keras.applications.vgg16 import preprocess_input,decode_predictions
import numpy as np
from keras.layers import Dense,GlobalAveragePooling2D,Dropout
from keras.models import Model
"""
关于全连接层请看博文:https://blog.csdn.net/gyh_420/article/details/78569225的前半部分
关于池化官方文档:https://keras-cn.readthedocs.io/en/latest/layers/pooling_layer/
关于函数模型,可以看官方文档:https://keras-cn.readthedocs.io/en/latest/models/model/
"""
#保留VGG16模型的权重,另外不保留顶层3个圈连接网络
base_model=ResNet50(weights='imagenet',inclde_top=False)
##自定义一个模型,keras 一般有两个模型,序贯模型(Sequential)上一篇有讲到,另外一个就是函数模型(Model)
x=base_model.output#上述模型的输出,个人认为对于每一个输入的样本都会输出多个评测结果和对应的概率,那么就需要池化来减小数值量
x=GlobalAveragePooling2D()(x)
x=Dense(2048,activation='relu')(x)
x=Dropout(0.5)(x)
predictions=Dense(1000,activation='softmax')(x)
model=Model(inputs=base_model.input,outputs=predictions)#这样就根据参数来实现了一个自己建立的模型
model.compile(optimizer='sgd',loss='categorical_crossentropy')#对模型进行了相关的编译,优化器使用的是随机梯度下降,损失函数为常用的多类对数损失
#传入图像
im_path='timg.jpg'#狼
img=image.load_img(im_path,target_size=(224,224))#加载图片
x=image.img_to_array(img)#转换为数组
x=np.extend_dims(x,axis=0)
x=preprocess_input(x)
##然后用上面自己构建的分类器进行分类,也可以直接用VGG16
preds=model.predict(x)
print ('Predicted:',decode_predictions(preds,top=5)[0])#取前五