下边是鸢尾花案例的三种模型构建的代码和讲解(有问题欢迎评论区指出):
import tensorflow as tf
from sklearn import datasets #导入数据集
import numpy as np
#下载数据集并对应数据和标签
iris = datasets.load_iris()
data = iris.data
labels = iris.target
#查看一下数据和标签的维度
print(data.shape) #(150,4)
print(labels.shape) #(150,)
#在150对应的维度上进行拼接
data = np.concatenate((data,labels.reshape(150,1)),axis=-1)
#将数据打乱:神经网络的拟合能力太强了,如果不乱序的话,同一个组合的batch反复出现,模型有可能会“记住”这些样本的次序,从而影响泛化能力。
np.random.shuffle(data)
#再查看一下此时data的shape
print(data.shape) #(150,5)
#将数据拆分为数据和标签
Y = data[:,-1]
X = data[:,:4]
#第一种 顺序模型
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(32,activation='relu'))
model.add(tf.keras.layers.Dense(32,activation='relu'))
model.add(tf.keras.layers.Dense(3,activation='softmax'))#因为是多分类 所以用softmax分类器
#顺序模型的第二种写法
model = tf.keras.Sequential([
tf.keras.layers.Dense(32, activation='relu'),#第一层
tf.keras.layers.Dense(32, activation='relu'),#第二层
tf.keras.layers.Dense(3,activation='softmax')#第三层
])
#第二种 函数模型
inputs = tf.keras.Input(shape=(4,))#因为数据由四个特征 (前边我们输出了data的形状为(150,4)) 所以这里shape为(4,)
x = tf.keras.layers.Dense(32,activation='relu')(inputs)
x = tf.keras.layers.Dense(32,activation='relu')(x)
predictions = tf.keras.layers.Dense(3,activation='softmax')(x)
model = tf.keras.Model(inputs,predictions)
#第三种 子类模型
class MyModel(tf.keras.Model):
def __init__(self):
super(MyModel,self).__init__()
self.D1 = tf.keras.layers.Dense(32,activation='relu')
self.D2 = tf.keras.layers.Dense(32,activation='relu')
self.D3 = tf.keras.layers.Dense(3,activation='softmax')
def call(self,inputs):
x = self.D1(inputs)
x = self.D2(x)
x = self.D3(x)
return x
model = MyModel()
####模型训练
model.compile(optimizer=tf.keras.optimizers.Adam(),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=[tf.keras.metrics.SparseCategoricalAccuracy()])
#keras
model.fit(X, Y, batch_size=32, epochs=100,shuffle=True)
每一种方法都可以成功运行,欢迎来互相交流!