Keras入门笔记(一)-从二分类问题到多分类问题、图像识别问题

本文介绍了Keras深度学习框架的基础,包括模型结构、网络层、模型编译和训练过程。通过实例展示了二分类(电影评论)、多分类(路透社新闻)、回归(波士顿房价)和图像识别(MNIST)问题的解决方法,强调了模型编译、训练和评估的关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Keras是一个Python深度学习框架,是个高层的API库。它不同于TensorFlow、PyTorch等微分器,Keras高度封装了底层的微分计算等操作,提供了用户友好的API,并且支持在TensorFlow、Theano和CNTK这三个底层微分库之间切换。目前,Keras已被钦定为TensorFlow的用户接口,其地位相当于TorchVision之于PyTorch

  • 本文主要基于Keras2作介绍。

Keras的结构

Keras中我们

  • utils
  • activations:提供了常见的激活函数,如relu等。
  • applications
  • backend:提供了TensorFlow、Theano和CNTK的底层接口。
  • datasets:提供了一些常用的小数据集,用于上手。
  • engine
  • layers:提供了常见的网络结构层,是Keras最重要的包。
  • preprocessing:数据预处理模块,也提供了数据增强的常用包。
  • wrappers
  • callbacks
  • constraints
  • initializers:提供了参数初始化的方法。
  • metrics
  • models:模型是Keras对网络层、优化器等结构的组织模块。
  • losses:提供了常见的损失函数/目标函数,如Mean-Squared-Error等。
  • optimizers: 优化器,包含了一些优化的方法。
  • regularizers:提供了一系列正则器。

Keras的常见结构

① 模型

Keras的核心数据结构是“模型”,模型指的是对网络层的组织方式。目前,Keras的模型只有两种形式:

  1. Sequential
  2. Functional
from keras.models import Sequential
network = Sequential()

就构建了一个序列模型,接下下来就是不断往这个网络结构中添加不同的网络层并构建它们的连接次序。

② 网络层

网络层由keras.layers进行定义:

from keras.layers import Dense

就引入了一个全连接层,接着我们无返回地把它添加到网络结构中:

network.add(Dense(units=512, activation='relu', inputshap=(1024, )))
network.add(Dense(units=10, activation='softmax'))

就为网路结构添加了一个512个神经元的全链接层和10个神经元的输出层。

注意到:只有第一层需要指定输入数据的尺寸;此后的每一层将会自动进行推导。

③ 模型编译和训练

现在我们要指定模型的训练方式,我们需要重点关心的有:

  1. optimizer:优化器,可能会影响到模型的收敛速度
  2. loss:模型的目标函数/损失函数
  3. metrics:指标列表,训练时将会根据该列表记录训练效果的衡量值
  4. epochsbatch_size:训练的轮次和梯度下降时每个batch将包含的样本数。
  5. verbose:控制台日志,值为0|1|2——分别对应”不在控制台输出任何消息“、“训练每轮训练进度”、“仅输出训练轮的信息”
  6. validation_datavalidation_split:验证集或自动划分验证集的比例。

我们调用model.compile方法进行编译:

network.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

随后,再对编译完毕的模型进行训练:

network.fit(train_data, train_labels, epochs=10, batch_size=1024, validation_split=0.3, verbose=2)

二分类问题:电影评论分类

二分类问题可能是应用最广泛的机器学习问题。我们可以利用Keras自带的IMDB数据集进行初步上手练习。

IMDB 数据集它包含来自互联网电影数据库(IMDB)的 50 000 条严重两极分化的评论。数据集被分为用于训练的 25 000 条评论与用于测试的 25 000 条评论,训练集和测试集都包含 50% 的正面评论和 50% 的负面评论。

  • imdb_data 是由评论词组成的索引列表,其前三位为保留值,即真正的评论词索引从序数 3 3 3 开始。
  • imdb_label 是由 0|1 组成的二值化评价。
from keras.datasets import imdb
from keras.layers import Dense
from keras.models import Sequential
import numpy as np
import matplotlib.pyplot as plt


def ont_hot(data_mat, dim):
    """
    对一个矩阵进行独热编码
    :param data_mat: 数据矩阵
    :param dim: 独热编码的维度
    :return: 返回独热编码后的数据矩阵
    """
    res = np.zeros((len(data_mat), dim))
    for i, index in enumerate(data_mat):
        res[i][index] = 1.0
    return res


# 取前10000个高频评论词汇
nb_words = 10000

(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=nb_words)

# 对训练数据、测试数据进行独热编码和numpy向量化
train_data = ont_hot(train_data, nb_words)
test_data = ont_hot(test_data, nb_words)
train_labels = np.asarray(train_labels).astype('float32')
test_labels = np.asarray(test_labels).astype('float32')

network = Sequential()
network.add(Dense(16, activation='relu', input_shape=(nb_words,)))
network.add(Dense(16, activation='relu', input_shape=(16,)))
network.add(Dense(1, activation='sigmoid'))

network.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

history = network.fit(train_data, train_labels, epochs=10, batch_size=1024, validation_split=0.3, verbose=2).history


# --模型的应用--

# 随机选择一项进行预测
result = list(map(lambda x: 1 if x > 0.5 else 0, network.predict(test_data)))
print('positive' if result[np.random.randint(len(result))] == 1 else 'negative')


# 画图,可以明显看到过拟合现象
train_loss, val_loss = history['loss'], history['val_loss']

epochs = range(len(train_loss))

plt.plot(epochs, train_loss, 'bo', label='train loss')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值