天天看點

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