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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章