深度学习之加宽全连接

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。这两个模型实例的参数值有所不同,这可以通过在实例化时传递不同的参数值来实现。

  • 15
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值