用Keras实现鸢尾花的分类

第一个例子,用for循环对参数进行更新

import numpy as np
import tensorflow as tf
from sklearn.datasets import load_iris

#无需下载,直接从sklearn数据库中导入Iris数据集
#Iris数据集以字典的形式存储,dict_key(['data','target','target_name',DESCR','feature_name']
#这里只用到data和target
data=load_iris()
iris_target=data.target
iris_data=np.float32(data.data)#转化为floa类型的list
#鸢尾花分成三类,这里对target进行one-hot处理,因为是三类,处理成n行3列的形式
iris_target=np.float32(tf.keras.utils.to_categorical(iris_target,num_classes=3))
#
iris_data=tf.data.Dataset.from_tensor_slices(iris_data).batch(50)
iris_target=tf.data.Dataset.from_tensor_slices(iris_target).batch(50)

#训练模型
inputs=tf.keras.layers.Input(shape=(4))#输入的属性是四个
#设置神经网络
x=tf.keras.layers.Dense(32, activation="relu")(inputs)
x=tf.keras.layers.Dense(64, activation="relu")(x)
predictions=tf.keras.layers.Dense(3, activation="softmax")(x)
#输入输出进行连接
model=tf.keras.Model(inputs=inputs,outputs=predictions)
#优化器设置
opt=tf.optimizers.Adam(1e-3)
#用for语句实现循环进行梯度更新
for epoch in range(1000):
    for _data,label in zip(iris_data,iris_target):
        with tf.GradientTape() as type:
            logits=model(_data)
            loss_value=tf.reduce_mean(tf.keras.losses.categorical_crossentropy(y_true=label, y_pred=logits))
            grads=type.gradient(loss_value,model.trainable_variables)
            opt.apply_gradients(zip(grads,model.trainable_variables))
    print("Training loss is :", loss_value.numpy())
model.save('./saver/the_save_model.h5')

#预测模型
new_model=tf.keras.models.load_model('./saver/the_save_model.h5')#载入模型
new_predction=new_model.predict(iris_data)#预测
print(tf.argmax(new_predction,axis=1))

第二个例子用compil函数和fit函数实现数据载入和数据分析

import numpy as np
import tensorflow as tf
from sklearn.datasets import load_iris
#导入数据
data=load_iris()
iris_target=data.target
iris_data=np.float32(data.data)
iris_target=np.float32(tf.keras.utils.to_categorical(iris_target,num_classes=3))
#对样本和标签进行打包,样本与标签一一对应
train_data=tf.data.Dataset.from_tensor_slices((iris_data,iris_target)).batch(128)
#设置神经网络
input_xs=tf.keras.Input(shape=(4),name='input_xs')
out=tf.keras.layers.Dense(32,activation='relu',name='dense_1')(input_xs)
out=tf.keras.layers.Dense(64,activation='relu',name='dense_2')(out)
logits=tf.keras.layers.Dense(3,activation='softmax',name='predictions')(out)
#设置输入与输出
model=tf.keras.Model(inputs=input_xs,outputs=logits)
opt=tf.optimizers.Adam(1e-3)
#用compil函数进行优化区、损失函数和评估标准进行设置
model.compile(optimizer=tf.optimizers.Adam(1e-3),loss=tf.losses.categorical_crossentropy, metrics=['accuracy'])
#利用fit函数进行迭代
#fit(x, y, batch_size=, epochs=),其中,x表示训练数据,y表示标签
#之前已经用from_tensor_slices函数对数据进行打包好了,并设置了batch为128
model.fit(train_data,epochs=500)
#输入数据和标签,输出损失和精度
score=model.evaluate(iris_data,iris_target)
print("last score",score)

第三个例子,多输入和单输出
有时会遇到多个输入,单个输出的情况,在数据转化部分对数据进行打包
输入1,输入2,输入3,标签–>(输入1,输入2,输入3),标签
在鸢尾花例子中,人为将其4个属性分为3+1两个部分

#多输入单输出
import numpy as np
import tensorflow as tf
from sklearn.datasets import load_iris

data=load_iris()
iris_data=np.float32(data.data)
iris_data_1=[]
iris_data_2=[]
#将数据切成两部分,每组数据的前一个作为一部分,后三个作为一部分
for iris in iris_data:
    iris_data_1.append(iris[0])
    iris_data_2.append(iris[1:4])
iris_target=np.float32(tf.keras.utils.to_categorical(data.target,num_classes=3))

train_data=tf.data.Dataset.from_tensor_slices(((iris_data_1,iris_data_2),iris_target)).batch(128)
#接收数据1
input_xs_1=tf.keras.Input(shape=(1),name='input_xs_1')
#接收数据2
input_xs_2=tf.keras.Input(shape=(3),name='input_xs_2')
#重新组合数据
input_xs=tf.concat([input_xs_1,input_xs_2],axis=-1)
out=tf.keras.layers.Dense(32,activation='relu',name='dense_1')(input_xs)
out=tf.keras.layers.Dense(64,activation='relu',name='dense_2')(out)
logits=tf.keras.layers.Dense(3,activation='softmax',name='predictions')(out)
#同样地,模型的输入部分也要进行整合
model=tf.keras.Model(inputs=[input_xs_1,input_xs_2],outputs=logits)
opt=tf.optimizers.Adam(1e-3)
model.compile(optimizer=tf.optimizers.Adam(1e-3),loss=tf.losses.categorical_crossentropy,metrics=['accuracy'])
model.fit(x=train_data,epochs=500)
score=model.evaluate(train_data)
print("多头score",score)

第四个例子,多输入和多输出
将属性分成两组,每组有两个特征
引入one-hot处理的分类数据集之外,还加入数据分类的真实值作为目标的辅助分类计算结果
(输入1,输入2),(one-hot标签,原标签)

#多输入多输出
import numpy as np
import tensorflow as tf
from sklearn.datasets import load_iris

data=load_iris()
iris_data=np.float32(data.data)
iris_data_1=[]
iris_data_2=[]
#将属性分成两组,每组有两个特征
for iris in iris_data:
    iris_data_1.append(iris[:2])
    iris_data_2.append(iris[2:])
iris_label=np.float32(data.target)
iris_target=np.float32(tf.keras.utils.to_categorical(data.target,num_classes=3))

#引入one-hot处理的分类数据集之外,还加入数据分类的真实值作为目标的辅助分类计算结果
train_data=tf.data.Dataset.from_tensor_slices(((iris_data_1,iris_data_2),(iris_target,iris_label))).batch(128)
input_xs_1=tf.keras.Input(shape=(2),name='input_xs_1')
input_xs_2=tf.keras.Input(shape=(2),name='input_xs_2')
input_xs=tf.concat([input_xs_1,input_xs_2],axis=-1)#重新组合数据
out=tf.keras.layers.Dense(32,activation='relu',name='dense_1')(input_xs)
out=tf.keras.layers.Dense(64,activation='relu',name='dense_2')(out)
logits=tf.keras.layers.Dense(3,activation='softmax',name='predictions')(out)
label=tf.keras.layers.Dense(1,name='label')(out)
model=tf.keras.Model(inputs=[input_xs_1,input_xs_2],outputs=[logits,label])
opt=tf.optimizers.Adam(1e-3)

#定义loss
def my_MSE(y_true, y_pred):
    my_loss=tf.reduce_mean(tf.square(y_true-y_pred))
    return my_loss

model.compile(optimizer=opt, loss={'predictions':tf.losses.categorical_crossentropy, 'label':my_MSE},loss_weights={'predictions':0.1, 'label':0.5},metrics=['accuracy'])
model.fit(x=train_data,epochs=500)
score=model.evaluate(train_data)
print("多头score",score)

你可能感兴趣的:(学习记录,机器学习)