keras多分类

"""分类问题:
二分类:只有两个类别,且每个数据点只能划分到一个类别
单标签,多分类:含有多个类别,且每个数据点只能划分到一个类别
多标签,多分类:含有多个类别,且每个数据点可以划分到多个类别"""

"""下面利用keras解决单标签,多分类问题"""

import tensorflow as tf
from tensorflow import keras
import numpy as np
"""数据加载:
    使用keras自带的路透社数据集,其包含许多短新闻及其对应的主题
    一共46种主题"""

from tensorflow.keras.datasets import reuters
(train_data,train_labels),(test_data,test_labels)=reuters.load_data(num_words=10000)  #将数据限定在10000经常出现的单词

# print(train_data.shape,test_data.shape)
# print(train_labels.shape,test_labels.shape)
# print(len(train_data[0]),len(train_data[1]))

"""数据预处理:
填充序列,使数据长度一致,采用二分类中定义的函数来实现
标签数据的编码:
1.如果采用one-hot编码,此时的损失函数只能为:categorical_crossentropy
2.如果直接转为整数,不进行编码,此时损失函数只能为:sparse_categorical_crossentropy
两种损失函数原理一直,只是提供的接口不一样"""

from tensorflow.python.keras.utils.np_utils import to_categorical
def vectorize_sequences(sequences,dimension=10000):
    result=np.zeros((len(sequences),dimension))
    for i,sequence in enumerate(sequences):
        result[i,sequence]=1
    return result

train_data=vectorize_sequences(train_data)
test_data=vectorize_sequences(test_data)
#标签one-hot
# train_labels=to_categorical(train_labels)
# test_labels=to_categorical(test_labels)
train_labels=np.array(train_labels)
test_labels=np.array(test_labels)
"""训练集与验证集的划分:
留出1000个样本作为验证集"""
x_val=train_data[:1000]
y_val=train_labels[:1000]
x_train=train_data[1000:]
y_train=train_labels[1000:]
# print(train_data.shape,train_labels.shape)
# print(test_data.shape,test_labels.shape)
print(x_val.shape,y_val.shape)
print(x_train.shape,y_train.shape)


"""构建网络:
使用两个隐藏层,每层64个神经元"""

from tensorflow.keras import layers
from tensorflow.keras import models

model=models.Sequential()
model.add(layers.Dense(64,activation="relu",input_shape=(10000,)))
model.add(layers.Dense(64,activation="relu"))
model.add(layers.Dense(46,activation="softmax"))

"""配置学习过程"""
from tensorflow.keras import optimizers
from tensorflow.keras import losses
# model.compile(optimizer=optimizers.RMSprop(1e-3),loss=losses.categorical_crossentropy,metrics=["acc"])
model.compile(optimizer=optimizers.RMSprop(1e-3),loss=losses.sparse_categorical_crossentropy,metrics=["acc"])
"""模型训练"""
history=model.fit(x_train,y_train,batch_size=512,epochs=8,validation_data=(x_val,y_val))

"""测试集上评估"""
test_result=model.evaluate(test_data,test_labels)
print("Test Acc:",test_result)

history_dict=history.history

"""训练过程绘制:损失值+准确率
随着神经网络在训练集上的表现越来越好,模型最终会出现过拟合,并在前所未见的
数据上表现越来越差,所以一定要一直监控模型在训练集之外数据上的性能"""

import matplotlib.pyplot as plt
"""损失函数绘制"""
train_loss_values=history_dict["loss"]
val_loss_values=history_dict["val_loss"]
epochs=np.arange(1,len(train_loss_values)+1)

plt.figure(1)
plt.plot(epochs,train_loss_values,label="training loss")
plt.plot(epochs,val_loss_values,label="val loss")
plt.title("Training and Val Loss")
plt.xlabel("Epoch")
plt.ylabel("Loss")
plt.legend()

"""精度(准确率)绘制"""
train_acc=history_dict["acc"]
val_acc=history_dict["val_acc"]

plt.figure(2)
plt.plot(epochs,train_acc,label="Training Acc")
plt.plot(epochs,val_acc,label="Val Acc")
plt.title("Training and Val Acc")
plt.xlabel("Epoch")
plt.ylabel("Acc")
plt.legend()

plt.show()





  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值