最简单深度学习Python实现(多分类问题)
程序员文章站
2024-03-19 23:14:40
...
一 准备数据
我们使用路透社数据集,包含许多短新闻及对应的主题。共包括46个对应的主题。该数据集内置于Keras库
from keras.datasets import reuters
(train_data,train_labels),(test_data,test_labels)=reuters.load_data(num_words=10000)
将数据限定为前10000个最常出现的单词。共有8982个训练样本和2246个测试样本。
print('训练样本:{},测试样本{}'.format
(len(train_data),len(test_data)))
每一个样本都是一个整数列表(表示单词索引)
print(train_data[10])
接下来我们要将数据进行向量化,转化为numpy数组
#数据向量化
def vectoriza_sequences(sequences,dimension=10000):
results = np.zeros((len(sequences),dimension))
#生成一个元素全部为0,形状是数据长度*10000的二维numpy数组
for i, sequence in enumerate(sequences):
#enumerate()函数返回两个参数:元素下标,对应的元素
results[i,sequence] = 1
#这里i返回的就是0-24999,sequence返回的是一个列表。
return results
x_train = vectoriza_sequences(train_data)
x_test = vectoriza_sequences(test_data)
标签我们将其转化为one-hot。每个标签除了标签索引对应的元素为1,其余皆为0.
#标签转one-hot编码
def to_one_hot(labels,dimension=46):
results = np.zeros((len(labels),dimension))
for i,label in enumerate(labels):
results[i,label] = 1
return results
one_hot_train_labels = to_one_hot(train_labels)
one_hot_test_labels = to_one_hot(test_labels)
数据准备完毕接下来开始构建网络了
二 构建网络
#构建网络
from keras import models
from keras import layers
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'))
#编译模型
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
softmax**层将输出在46个不用输出类别上的概率分布。46个的概率总和为1
为了调整超参数,我们可以留出1000个样本作为验证集
x_val = x_train[:1000]
partial_x_train = x_train[1000:]
y_val = one_hot_train_labels[:1000]
partial_y_train = one_hot_train_labels[1000:]
现在开始训练模型。
history = model.fit(partial_x_train,
partial_y_train,
epochs=20,
batch_size=512,
validation_data=(x_val,y_val))
最后我们来绘制损失曲线进行观察。
import matplotlib.pyplot as plt
#绘制训练损失和验证损失
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(1,len(loss)+1)
plt.plot(epochs,loss,'bo',label='训练损失')
plt.plot(epochs,val_loss,'b',label='验证损失')
plt.title('训练损失和验证损失',fontproperties=my_font)
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend(prop=my_font)
plt.show()
可以看到在第八轮以后验证损失开始慢慢增加,说明开始过拟合了。所以我们重新训练一个模型,共8个轮次,然后在测试集上评估模型。
#构建网络
from keras import models
from keras import layers
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'))
#编译模型
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
x_val = x_train[:1000]
partial_x_train = x_train[1000:]
y_val = one_hot_train_labels[:1000]
partial_y_train = one_hot_train_labels[1000:]
history = model.fit(partial_x_train,
partial_y_train,
epochs=8,
batch_size=512,
validation_data=(x_val,y_val))
results = model.evaluate(x_test,one_hot_test_labels)
print(results)
可以看到这么简单的网络就有有将近百分之八十的精确率哦!
备注:因为标签是one-hot,所以损失函数使用categorical_crossentropy
如果直接转成numpy数组,损失函数应使用spares_categorical_crossentropy。这里面有其数学原理,有兴趣的朋友可以深入研究。
上一篇: JS快速回顾
下一篇: Fragment 基础知识