7.1第二种模型表示方式
# coding=utf-8
"""
__project_ = 'Python深度学习'
__file_name__ = '7.1函数式API'
__author__ = 'WIN10'
__time__ = '2020/4/15 21:20'
__product_name = PyCharm
"""
from keras import Input, layers
from keras.models import Model
input_tensor = Input(shape=(64,))
x = layers.Dense(32, activation='relu')(input_tensor)
x = layers.Dense(32, activation='relu')(x)
output_tensor = layers.Dense(10, activation='softmax')(x)
model = Model(input_tensor, output_tensor)
model.summary()
# 双输入模型
text_input = Input(shape=(None,), dtype='int32', name='text')
embedded_text = layers.Embedding(10000, 64)(text_input)
encoded_text = layers.LSTM(32)(embedded_text)
question_input = Input(shape=(None,), dtype='int32', name='question')
embedded_question = layers.Embedding(10000, 32)(question_input)
encoded_question = layers.LSTM(16)(embedded_question)
concatenated = layers.concatenate([encoded_text, encoded_question], axis=-1)
answer = layers.Dense(500, activation='softmax')(concatenated)
model = Model([text_input, question_input], answer)
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics='acc')
# 多输出模型
posts_input = Input(shape=(None,), dtype='int32', name='posts')
embedded_posts = layers.Embedding(256, 50000)(posts_input)
x = layers.Conv1D(128, 5, activation='relu')(embedded_posts)
x = layers.MaxPooling1D(5)(x)
x = layers.Conv1D(256, 5, activation='relu')(x)
x = layers.Conv1D(256, 5, activation='relu')(x)
x = layers.MaxPooling1D(5)(x)
x = layers.Conv1D(256, 5, activation='relu')(x)
x = layers.Conv1D(256, 5, activation='relu')(x)
x = layers.GlobalMaxPool1D(x)
x = layers.Dense(128, activation='relu')(x)
# 输出层,必须有名字
age_prediction = layers.Dense(1, name='age')(x)
income_prediction = layers.Dense(10, activation='softmax', name='income')(x)
gender_prediction = layers.Dense(1, activation='sigmoid', name='gender')(x)
model = Model(posts_input, [age_prediction, income_prediction, gender_prediction])
model.compile(optimizer='rmsprop',
loss={'age': 'mse',
'income': 'categorical_crossentropy',
'gender': 'binary_crossentropy'
},
loss_weights={'age': 0.25,
'income': 1.,
'gender': 10.
}
)
7.2有向无环图
# coding=utf-8
"""
__project_ = 'Python深度学习'
__file_name__ = '7.2有向无环图'
__author__ = 'WIN10'
__time__ = '2020/4/15 22:38'
__product_name = PyCharm
"""
from keras import layers,Input
#inception模块
x= Input(shape=(64,))
branch_a=layers.Conv2D(128,1,activation='relu',strides=2)(x)
branch_b=layers.Conv2D(128,1,activation='relu')(x)
branch_b=layers.Conv2D(128,3,activation='relu',strides=2)(branch_b)
branch_c=layers.AveragePooling2D(3,strides=2)(x)
branch_c=layers.Conv2D(128,3,activation='relu',strides=2)(branch_c)
branch_d=layers.Conv2D(128,1,activation='relu')(x)
branch_b=layers.Conv2D(128,3,activation='relu')(branch_d)
branch_b=layers.Conv2D(128,3,activation='relu',strides=2)(branch_d)
output=layers.concatenate([branch_a,branch_b,branch_c,branch_d],axis=-1)
#resnet 模块
x= Input(shape=(64,))
y=layers.Conv2D(128,3,activation='relu',padding='same')(x)
y=layers.Conv2D(128,3,activation='relu',padding='same')(y)
y=layers.Conv2D(128,3,activation='relu',padding='same')(y)
y=layers.add([y,x])
#resnet 模块 特征尺寸不同,使用1*1 下采样
x= Input(shape=(64,))
y=layers.Conv2D(128,3,activation='relu',padding='same')(x)
y=layers.Conv2D(128,3,activation='relu',padding='same')(y)
y=layers.Conv2D(128,3,activation='relu',padding='same')(y)
residual=layers.Conv2D(128,1,strides=2,padding='same')(x)
y=layers.add([y,residual])
7.3回调函数
# coding=utf-8
"""
__project_ = 'Python深度学习'
__file_name__ = '7.3回调函数'
__author__ = 'WIN10'
__time__ = '2020/4/15 22:54'
__product_name = PyCharm
"""
import keras
x,y,x_val,y_val=[]
callbacks_list=[
#监控验证精度,如果多余一轮时间精度不改善,就中断训练
keras.callbacks.EarlyStopping(
monitor='acc',
patience=1,
),
#如果val_loss没有改善,不需要覆盖模型
keras.callbacks.ModelCheckpoint(
filepath='my_model.h5',
monitor='val_loss',
save_best_only=True
)
]
keras.models.Model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['acc']
)
keras.models.Model.fit(x,y,
epochs=10,
callbacks=callbacks_list,
validation_data=(x_val,y_val))
#降低学习率
callbacks_list=[
#监控val_loss 10轮回没改善 ,学习率除以10
keras.callbacks.ReduceLROnPlateau(
monitor='val_loss',
factor=0.1,
patience=10
)
]
7.4深度可分离卷积神经网络
# coding=utf-8
"""
__project_ = 'Python深度学习'
__file_name__ = '7.4深度可分离卷积神经网络'
__author__ = 'WIN10'
__time__ = '2020/4/15 23:17'
__product_name = PyCharm
"""
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras import layers
from keras import optimizers
import matplotlib.pyplot as plt
def DataGen(dir_path, img_row, img_col, batch_size, is_train):
if is_train:
datagen = ImageDataGenerator(rescale=1. / 255,
zoom_range=0.2,
rotation_range=40.,
shear_range=0.2,
width_shift_range=0.2,
height_shift_range=0.2,
horizontal_flip=True,
fill_mode='nearest')
else:
datagen = ImageDataGenerator(rescale=1. / 255)
generator = datagen.flow_from_directory(
dir_path, target_size=(img_row, img_col),
batch_size=batch_size,
# class_mode='binary',
shuffle=is_train)
return generator
# 数据准备
image_size = 65
image_class=3
batch_size = 128
epochs=100
train_image_path='G:\\DL\\MyData\\MattingImages\\train'
test_image_path='G:\\DL\\MyData\\MattingImages\\val'
train_generator = DataGen(train_image_path, image_size, image_size, batch_size, True)
validation_generator = DataGen(test_image_path, image_size, image_size, batch_size, False)
model=Sequential()
model.add(layers.SeparableConv2D(32,3,activation='relu',input_shape=(65,65,3,)))
model.add(layers.SeparableConv2D(64,3,activation='relu'))
model.add(layers.MaxPooling2D(2))
model.add(layers.SeparableConv2D(64,3,activation='relu'))
model.add(layers.SeparableConv2D(128,3,activation='relu'))
model.add(layers.MaxPooling2D(2))
model.add(layers.SeparableConv2D(64,3,activation='relu'))
model.add(layers.SeparableConv2D(128,3,activation='relu'))
model.add(layers.GlobalAveragePooling2D())
model.add(layers.Dense(32,activation='relu'))
model.add(layers.Dense(3,activation='softmax'))
#编译 需要3个参数 ,损失函数、优化器、训练和测试过程中的键控指标
model.compile(optimizer=optimizers.RMSprop(lr=1e-4),
loss='categorical_crossentropy',
metrics=['accuracy'])
#训练
history=model.fit_generator(
train_generator,
steps_per_epoch=2,
epochs=epochs,
validation_data=validation_generator,
validation_steps=1)
model.save('my_model_split.h5')
#绘制训练损失和验证损失
history_dict=history.history
acc=history_dict['accuracy']
val_acc=history_dict['val_accuracy']
loss=history_dict['loss']
val_loss=history_dict['val_loss']
epochs=range(1,len(acc)+1)
plt.plot(epochs,acc,'bo',label='Training acc')
plt.plot(epochs,val_acc,'b',label='Validation acc')
plt.title('training and val acc')
plt.legend()
plt.figure()
plt.plot(epochs,loss,'bo',label='Training loss')
plt.plot(epochs,val_loss,'b',label='Validation loss')
plt.title('train and val loss')
plt.legend()
plt.show()