当前位置:   article > 正文

深度学习之加宽全连接

深度学习之加宽全连接

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()  #观察神经网络的整体情况
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

运行结果:
在这里插入图片描述
:在这个模型中,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))
  • 1
  • 2
  • 3

运行结果:
在这里插入图片描述
: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))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

运行结果:
在这里插入图片描述
:这段代码将训练数据集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()
  • 1
  • 2
  • 3
  • 4

运行结果:
在这里插入图片描述

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

运行结果:
在这里插入图片描述
在这里插入图片描述

pd.DataFrame(h.history).plot(figsize=(8, 5))
plt.grid(True)
plt.gca().set_ylim(0, 1)
plt.show()
  • 1
  • 2
  • 3
  • 4

运行结果:
在这里插入图片描述
:在这段代码中,我们定义了一个名为Model_sub_fnn的Keras模型类,并在之后实例化了两个模型实例,分别命名为model_sub_fnn和model_sub_fnn2。这两个模型实例的参数值有所不同,这可以通过在实例化时传递不同的参数值来实现。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/636782
推荐阅读
相关标签
  

闽ICP备14008679号