|
05、除Sequential外模型构建方法:函数式API与子类API
Wide与Deep模型实战
子类API
功能API(函数式API)
多输入与多输出
东方老师AI官网:http://www.ai111.vip
有任何问题可联系东方老师微信:dfy_88888
【微信二维码图片】
- # -*- coding: utf-8 -*-
- __author__ = u'东方耀 微信:dfy_88888'
- __date__ = '2019/10/30 10:10'
- __product__ = 'PyCharm'
- __filename__ = 'tf-keras-regression-wide&deep'
- import numpy as np
- import matplotlib as mpl
- import matplotlib.pyplot as plt
- import sklearn
- import pandas as pd
- import os
- import sys
- import time
- import tensorflow as tf
- from tensorflow import keras
- print(sys.version_info)
- for module in mpl, np, pd, sklearn, tf, keras:
- print(module.__name__, module.__version__)
- from sklearn.datasets import fetch_california_housing
- housing = fetch_california_housing()
- # print(housing.DESCR)
- print(housing.data.shape)
- print(housing.target.shape)
- from sklearn.model_selection import train_test_split
- x_train_all, x_test, y_train_all, y_test = train_test_split(
- housing.data, housing.target, random_state=7)
- x_train, x_valid, y_train, y_valid = train_test_split(
- x_train_all, y_train_all, random_state=11)
- print(x_train.shape, y_train.shape)
- print(x_valid.shape, y_valid.shape)
- print(x_test.shape, y_test.shape)
- from sklearn.preprocessing import StandardScaler
- scaler = StandardScaler()
- x_train_scaled = scaler.fit_transform(x_train)
- x_valid_scaled = scaler.transform(x_valid)
- x_test_scaled = scaler.transform(x_test)
- def create_model_function():
- # 第一种方法:函数式api实现wide&deep模型 像使用函数一样
- input_1 = keras.layers.Input(shape=x_train.shape[1])
- # 复合函数的形式
- hidden_1 = keras.layers.Dense(30, activation='relu')(input_1)
- hidden_2 = keras.layers.Dense(30, activation='relu')(hidden_1)
- # wide model
- concat = keras.layers.concatenate(inputs=[input_1, hidden_2])
- output = keras.layers.Dense(1)(concat)
- model = keras.models.Model(inputs=[input_1], outputs=[output], name='wide_deep_model')
- return model
- class WideDeepModel(keras.models.Model):
- # 第二种方法:子类api实现wide & deep模型
- def __init__(self):
- super(WideDeepModel, self).__init__()
- # 定义模型的层
- self.hidden1_layer = keras.layers.Dense(30, activation='relu')
- self.hidden2_layer = keras.layers.Dense(30, activation='relu')
- self.output_layer = keras.layers.Dense(1)
- def call(self, input):
- # 完成模型的正向计算
- hidden1 = self.hidden1_layer(input)
- hidden2 = self.hidden2_layer(hidden1)
- concat = keras.layers.concatenate([input, hidden2])
- output = self.output_layer(concat)
- return output
- # 第一种方法
- # model = create_model_function()
- # 第二种方法(类的实例化对象 build方式指定input_shape)
- model = WideDeepModel()
- model.build(input_shape=(None, x_train.shape[1]))
- model.summary()
- model.compile(optimizer=keras.optimizers.Adam(0.001), loss='mean_squared_error')
- callbacks = [
- keras.callbacks.EarlyStopping(patience=5, min_delta=1e-2)
- ]
- history = model.fit(x_train_scaled, y_train, validation_data=(x_valid_scaled, y_valid), epochs=50,
- callbacks=callbacks)
- print(type(history))
- print(history.history)
- def plot_learning_curve(history):
- # ValueError: arrays must all be same length
- # 表格型数据 要求每一列的len一致 这里即:history.history字典里每个key对应的value长度一致
- df_history = pd.DataFrame(data=history.history)
- print(df_history)
- print(df_history.index)
- print(df_history.columns)
- print(df_history.dtypes)
- df_history.plot(figsize=(8, 5))
- plt.grid(True)
- # x就是DataFrame的索引
- plt.ylim(0, 1)
- plt.show()
- plot_learning_curve(history)
- # Returns the loss value & metrics values for the model in test mode.
- print(model.evaluate(x_test_scaled, y_test))
复制代码
|
|