wide&deep
tensorflow 2 函数api实现
from tensorflow import keras
from sklearn.datasets import fetch_california_housing
housing = fetch_california_housing()
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)
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)
input_wide = keras.layers.Input(shape=[5])
input_deep = keras.layers.Input(shape=[6])
hide1 = keras.layers.Dense(30, activation='relu')(input_deep)
hide2 = keras.layers.Dense(30, activation='relu')(hide1)
concat = keras.layers.concatenate([input_wide, hide2])
output = keras.layers.Dense(1)(concat)
model = keras.models.Model(inputs=[input_wide, input_deep], outputs=[output])
model.compile(optimizer='adam', loss=keras.losses.mse)
x_train_scaled_wide = x_train_scaled[:, :5]
x_train_scaled_deep = x_train_scaled[:, 2:]
x_valid_scaled_wide = x_valid_scaled[:, :5]
x_valid_scaled_deep = x_valid_scaled[:, 2:]
x_test_scaled_wide = x_test_scaled[:, :5]
x_test_scaled_deep = x_test_scaled[:, 2:]
history = model.fit([x_train_scaled_wide, x_train_scaled_deep],
y_train,
validation_data=([x_valid_scaled_wide, x_valid_scaled_deep], y_valid),
epochs=100)
print(model.evaluate([x_test_scaled_wide, x_test_scaled_deep], y_test))
tensorflow 2 子类继承实现
'''*************************subclass to code wide&deep**************************************'''
class WideAndDeep(keras.models.Model):
def __init__(self):
super(WideAndDeep, self).__init__()
self.hide1_layer = keras.layers.Dense(30, activation='relu')
self.hide2_layer = keras.layers.Dense(30, activation='relu')
self.output_layer = keras.layers.Dense(1)
def call(self, input):
print(type(input),input)
a,b=input
hide1 = self.hide1_layer(a)
hide2 = self.hide2_layer(hide1)
concat = keras.layers.concatenate([b, hide2])
output = self.output_layer(concat)
return output
model = WideAndDeep()
model.compile(optimizer='adam', loss=keras.losses.mse)
model.fit([x_train_scaled_wide, x_train_scaled_deep],y_train,validation_data=([x_valid_scaled_wide, x_valid_scaled_deep], y_valid),epochs=10)
print(model.evaluate([x_test_scaled_wide, x_test_scaled_deep], y_test))