系类文章往期回顾
睿智的keras深度学习(零)——keras使用时可能遇到的参数及含义(持续更新
睿智的keras深度学习(一)——阈值逻辑单元和多层感知机
使用函数式API构建顺序模型
前言
本篇文章只是用来说明模型的构架和数据的传入,并不代表所使用的数据集就应该按照文章的方法进行训练,读者仅需掌握API的使用即可,不必过度注重数据集和模型训练
加载数据集
这里使用fetch_california_housing数据集进行操作
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
housing = fetch_california_housing()
X_train_full, X_test, y_train_full, y_test = train_test_split(housing.data, housing.target)
X_train, X_valid, y_train, y_valid = train_test_split(X_train_full, y_train_full)
数据归一化
为了提高模型的可靠性我们很多时候都需要进行数据的归一化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_valid = scaler.transform(X_valid)
X_test = scaler.transform(X_test)
使用函数式API构建残差模型
构建模型
from keras.layers import Input, Concatenate
from keras import Model
input_ = Input(shape=X_train.shape[1:])
hidden1 = Dense(30, activation="relu")(input_)
hidden2 = Dense(30, activation="relu")(hidden1)
concat = Concatenate()([input_, hidden2])
output = Dense(1)(concat)
model = Model(inputs=[input_], outputs=[output])
plot_model(model)
使用函数式API构建多输入模型
构建模型
input_A = Input(shape=[5], name="wide_input")
input_B = Input(shape=[6], name="deep_input")
hidden1 = Dense(30, activation="relu")(input_B)
hidden2 = Dense(30, activation="relu")(hidden1)
concat = Concatenate()([input_A, hidden2])
output = Dense(1, name="output")(concat)
model = Model(inputs=[input_A, input_B], outputs=[output])
plot_model(model)
模型训练
from tensorflow.keras.optimizers import SGD
model.compile(loss="mse", optimizer=SGD(lr=1e-3))
X_train_A, X_train_B = X_train[:, :5], X_train[:, 2:]
X_valid_A, X_valid_B = X_valid[:, :5], X_valid[:, 2:]
X_test_A, X_test_B = X_test[:, :5], X_test[:, 2:]
X_new_A, X_new_B = X_test_A[:3], X_test_B[:3]
history = model.fit((X_train_A, X_train_B), y_train, epochs=20, validation_data=((X_valid_A, X_valid_B), y_valid))
mse_test = model.evaluate((X_test_A, X_test_B), y_test)
y_pred = model.predict((X_new_A, X_new_B))
y_pred
使用函数式API构建多输入多输出模型
构建模型
output = Dense(1, name="main_output")(concat)
aux_output = Dense(1, name="aux_output")(hidden2)
model = Model(inputs=[input_A, input_B], outputs=[output, aux_output])
plot_model(model)
模型训练和评估
由于模型是多输出模型,所以指定两个损失函数,并且可以给他们分配不同的权值,权值的大小会影响模型的最终结果
model.compile(loss=["mse", "mse"], loss_weights=[0.9, 0.1], optimizer="sgd")
history = model.fit([X_train_A, X_train_B], [y_train, y_train], epochs=20, validation_data=([X_valid_A, X_valid_B], [y_valid, y_valid]))
total_loss, main_loss, aux_loss = model.evaluate([X_test_A, X_test_B], [y_test, y_test])
y_pred_main, y_pred_aux = model.predict([X_new_A, X_new_B])
total_loss, main_loss, aux_loss
y_pred_main, y_pred_aux