天天看点

python第七章_Python深度学习第7章,python,第七章

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()