1.Functional API 搭建神经网络模型
1.1.利用Functional API编写宽深神经网络模型进行手写数字识别
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
iris = load_iris()
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size=0.2,random_state=23)
X_train,X_valid,y_train,y_valid = train_test_split(x_train,y_train,test_size=0.2,random_state=12)
import tensorflow as tf
from tensorflow import keras
#创建了一个输入层inputs,其形状与X_train的形状(除了第一个维度,即样本数量)相同。
inputs = keras.layers.Input(shape=X_train.shape[1:])
#添加了一个隐藏层hidden1,它包含300个神经元,并使用ReLU激活函数。
hidden1 = keras.layers.Dense(300,activation='relu')(inputs)
hidden2 = keras.layers.Dense(100,activation='relu')(hidden1)
concat = keras.layers.concatenate([inputs,hidden2])
output = keras.layers.Dense(10,activation='softmax')(concat)
model_fun_WideDeep = keras.models.Model(inputs=[inputs],outputs=[output])
model_fun_WideDeep.summary() #观察神经网络的整体情况
运行结果:
注:在这个模型中,inputs层代表了宽度的特征,而hidden1和hidden2层代表了深度的特征。通过将输入层和第二个隐藏层的输出拼接在一起,模型结合了宽度和深度的特征,以提高模型的预测能力。
#利用.compile()与.fit()函数对数据进行编译与训练
model_fun_WideDeep.compile(loss='sparse_categorical_crossentropy',optimizer='sgd',metrics=["accuracy"])
h=model_fun_WideDeep.fit(X_train,y_train,batch_size=32,epochs=30,validation_data=(X_valid,y_valid))
运行结果:
注:optimizer=‘sgd’:这是模型训练时使用的优化器。sgd代表随机梯度下降(Stochastic Gradient Descent),它是一种简单的优化算法,用于在训练过程中更新模型的权重。
1.2.利用Functional API编写多输入神经网络模型进行手写数字识别
X_train_A, X_train_B = X_train[:, :200], X_train[:, 100:]
X_valid_A, X_valid_B = X_valid[:, :200], X_valid[:, 100:]
# 定义输入层
input_A = keras.layers.Input(shape=X_train_A.shape[1])
input_B = keras.layers.Input(shape=X_train_B.shape[1])
# 定义隐藏层和输出层
hidden1 = keras.layers.Dense(300, activation='relu')(input_B)
hidden2 = keras.layers.Dense(100, activation='relu')(hidden1)
concat = keras.layers.concatenate([input_A, hidden2])
output = keras.layers.Dense(10, activation='softmax')(concat)
# 创建模型
model_fun_MulIn = keras.models.Model(inputs=[input_A, input_B], outputs=[output])
# 编译模型
model_fun_MulIn.compile(loss='sparse_categorical_crossentropy',optimizer='sgd',metrics=["accuracy"])
# 训练模型
h=model_fun_MulIn.fit((X_train_A,X_train_B),y_train,batch_size=32,epochs=10, validation_data=((X_valid_A, X_valid_B), y_valid))
运行结果:
注:这段代码将训练数据集X_train和验证数据集X_valid分割成两个子集,分别是X_train_A和X_train_B以及X_valid_A和X_valid_B。每个子集都包含原始数据集的一部分特征。
pd.DataFrame(h.history).plot(figsize=(8, 5))
plt.grid(True)
plt.gca().set_ylim(0, 1)
plt.show()
运行结果:
2.SubClassing API 搭建神经网络模型
2.1.构建继承keras.model.Model的子类来搭建神经网络模型
class Model_sub_fnn(keras.models.Model):
def __init__(self, units_1=300, units_2=100, units_out=10, activation='relu'):
super().__init__()
self.hidden1 = keras.layers.Dense(units_1, activation=activation)
self.hidden2 = keras.layers.Dense(units_2, activation=activation)
self.main_output = keras.layers.Dense(units_out, activation='softmax')
def call(self, data):
hidden1 = self.hidden1(data)
hidden2 = self.hidden2(hidden1)
main_output = self.main_output(hidden2)
return main_output
#初始化模型
model_sub_fnn = Model_sub_fnn()
#通过在初始化中传递参数改变模型元素默认值
model_sub_fnn2 = Model_sub_fnn(300, 100, 10, activation='relu')
#编译模型与训练
model_sub_fnn.compile(loss='sparse_categorical_crossentropy',optimizer='sgd',metrics=["accuracy"])
h= model_sub_fnn.fit(X_train,y_train,batch_size=32,epochs=30,validation_data = (X_valid,y_valid))
model_sub_fnn.summary()
运行结果:
pd.DataFrame(h.history).plot(figsize=(8, 5))
plt.grid(True)
plt.gca().set_ylim(0, 1)
plt.show()
运行结果:
注:在这段代码中,我们定义了一个名为Model_sub_fnn的Keras模型类,并在之后实例化了两个模型实例,分别命名为model_sub_fnn和model_sub_fnn2。这两个模型实例的参数值有所不同,这可以通过在实例化时传递不同的参数值来实现。