如何用Keras轻松搭建一个神经网络-Keras入门实战篇

Keras是目前最受欢迎的深度学习库之一,它人工智能的产品化做出了巨大贡献。 它使用简单,只需几行代码即可构建强大的神经网络。 在这篇文章中,您将了解如何使用Keras构建神经网络,通过将用户评论分类(正面和负面)来做情感分析,我们将使用著名的imdb评论数据集。我们只需要将模型进行一些改进就可以应用于其他机器学习问题。

请注意,我们不会详细介绍Keras或Deep Learning。 本文旨在为您提供Keras的简单的入门实践程序,让你能更好的了解keras.

什么是Keras?

Keras是一个开源的python库,可以让您轻松构建神经网络。 该库能够在TensorFlow,Microsoft Cognitive Toolkit,Theano和MXNet之上运行。 Tensorflow和Theano是Python中用于构建深度学习算法的最常用科学计算平台,但它们有时可能非常复杂且难以使用。 相比之下,Keras提供了一种简单方便的方法来构建深度学习模型。 它的创建者FrançoisChollet开发了它,使人们能够尽可能快速,轻松地构建神经网络。 他把重点放在可扩展性,模块化,极简主义和python的支持上。 Keras可以与GPU和CPU一起使用,它同时支持Python 2和3. Google Keras为深度学习和人工智能的产品化做出了巨大贡献,因为它已经产品化了强大的现代深度学习算法,这些算法以前不仅无法访问,而且 也无法使用。

什么是情感分析?

通过情感分析,我们可以确定例如关于文档,事件的作者的态度(例如情绪)。 因此,需要理解文本是一种自然的语言处理问题,以预测作者潜在的态度。 情绪主要分为若干类比如积极,消极和中性的。 通过使用情感分析,我们希望根据作者撰写的关于事物的评论来预测客户对事物的看法和态度。 因此,情感分析广泛应用于评论,调查,文档分析等领域。

imdb 数据库

imdb情绪分类数据集包含来自imdb用户的50000个电影评论,这些评论被标记为正(1)或负(0)。 对评论进行预处理,并将每个评论编码为整数形式的单词索引序列。 评论中的单词由其在数据集中的整体频率编制索引。 例如,整数“2”编码数据中第二个最常用的字。 50000条评论分为25,000条训练集和25,000条测试集。 该数据集由斯坦福大学的研究人员创建,并于2011年在一篇论文中发表,他们的准确率达到88.89%。 它也被用于2011年的“Bag of Words Meets Bags of Popcorn”Kaggle比赛中

导入依赖包并下载数据

我们首先导入所需的依赖包并下载我们的数据然后构建我们的模型。

import matplotlib
import matplotlib.pyplot as plt
import numpy as np
from keras.utils import to_categorical
from keras import models
from keras import layers
%matplotlib inline

我们首先下载imdb数据集,幸运的是已经内置到Keras中。 由于我们不想对训练集和测试集按50%和50%的比例分配,因此我们会在下载后将数据合并按80%和20%的比例分配训练集和测试集。

from keras.datasets import imdb
(training_data, training_targets), (testing_data, testing_targets) = imdb.load_data(num_words=10000)
data = np.concatenate((training_data, testing_data), axis=0)
targets = np.concatenate((training_targets, testing_targets), axis=0)

查看数据

现在我们可以查看一下数据集中的数据

print("Categories:", np.unique(targets))
print("Number of unique words:", len(np.unique(np.hstack(data))))

从上面的数据结果中可以看到数据的标签分为0和1两类,总共有9998个单词(唯一单词)

length = [len(i) for i in data]
print("Average Review length:", np.mean(length))
print("Standard Deviation:", round(np.std(length)))

您可以在上面的输出中看到,数据集被标记为两个类别,0或1,表示作者的情绪。 整个数据集包含9998个唯一单词,评论的平均长度为234个单词,标准差为173个单词。

现在我们来看一个单一的训练示例:

print("Label:", targets[0])
print(data[0])

在上面输出结果中,你可以看到数据集的第一个评论的标签为1,评论中的数字表示单词在词汇表中的索引。 下面的代码创建单词对索引和索引对单词的两个字典,以便我们可以根据索引从词汇表中得到对应的单词。 并且用“#”替换未知单词。 它通过使用get_word_index()函数创建单词对索引的字典。

word2index = imdb.get_word_index()
index2word = dict([(value, key) for (key, value) in word2index.items()]) 
decoded = " ".join( [index2word.get(i - 3, "#") for i in data[0]] )
print(decoded)

准备数据

现在是该准备我们的数据了。 我们要创建一个词袋,词袋是一个二维矩阵,每一行代表一条评论,每一列代表一个单词,我们将对每个评论进行矢量化,并用零填充词袋,然后根据每个评论中的每个单词的索引号,将词袋对应的列置为1。 这意味着我们词袋将是一个含有很多0元素的稀疏矩阵。 我们这样做是因为我们的神经网络的每个输入都需要具有相同的大小。 我们还将目标转换为浮点数。

def vectorize(sequences, dimension = 10000):
    results = np.zeros((len(sequences), dimension))
    for i, sequence in enumerate(sequences):
        results[i, sequence] = 1
    return results
 
data = vectorize(data)
targets = np.array(targets).astype("float32")

现在我们将数据分成训练和测试集。 训练集将包含40000条评论,测试集10000条。

test_x = data[:10000]
test_y = targets[:10000]
train_x = data[10000:]
train_y = targets[10000:]

建立和训练模型

我们现在可以建立我们简单的神经网络。 我们首先定义我们想要构建的模型类型。 Keras中有两种类型的模型:Sequential模型和与Model类API

然后我们简单地添加输入层,隐藏层和输出层。 在他们之间,我们正在使用dropout来防止过拟合。 请注意,您应始终将dropout设置在20%到50%之间。 在dropout后面我们使用“dense”全连接层。 在隐藏层中,我们使用relu函数激活函数,因为在大多数情况下它产生令人满意的结果。 你也可以随意尝试其他激活函数。 在输出层,我们使用sigmoid函数,它将值映射到0和1.请注意,我们在输入层将输入形维度设置为10000,因为我们的评论长度为10000。

最后,我们让Keras打印出我们刚刚建立的模型的摘要。

model = models.Sequential()
# Input - Layer
model.add(layers.Dense(50, activation = "relu", input_shape=(10000, )))
# Hidden - Layers
model.add(layers.Dropout(0.3, noise_shape=None, seed=None))
model.add(layers.Dense(50, activation = "relu"))
model.add(layers.Dropout(0.2, noise_shape=None, seed=None))
model.add(layers.Dense(50, activation = "relu"))
# Output- Layer
model.add(layers.Dense(1, activation = "sigmoid"))
model.summary()

现在我们需要编译我们的模型,这只是为训练配置模型。 我们使用“adam”优化器。 优化器是在训练期间改变权重和偏差的算法。 我们还选择二元 - 交叉熵作为损失(因为我们处理二分类)和准确率作为我们的评估指标。

model.compile(
 optimizer = "adam",
 loss = "binary_crossentropy",
 metrics = ["accuracy"]
)

我们现在能够训练我们的模型。 我们设置batch_size值为500,并且仅用于两个epochs,因为我发现如果我们训练更长时间,模型会过度拟合。 batch_size定义将通过神经网络处理的样本数,而epochs是整个训练数据的迭代次数。 通常,较大的batch_size大小会导致更快的训练,但并不总是快速收敛。 较小的batch_size在训练中较慢,但它可以更快地收敛。 根据您自己项目,您可以尝试一些不同的值。 如果您是没有经验的初学者,我建议您首先将batch_size设置为32,因为这是标准大小。

results = model.fit(
 train_x, train_y,
 epochs= 2,
 batch_size = 500,
 validation_data = (test_x, test_y)
)

接下来我们来评估我们的模型

print(np.mean(results.history["val_acc"])

非常棒! 有了这个简单的模型,我们已经超过了我在开始时提到的2011年论文的准确率。下面是全部完整的代码,接下来你可以随意尝试超参数和层数。

import numpy as np
from keras.utils import to_categorical
from keras import models
from keras import layers
from keras.datasets import imdb
(training_data, training_targets), (testing_data, testing_targets) = imdb.load_data(num_words=10000)
data = np.concatenate((training_data, testing_data), axis=0)
targets = np.concatenate((training_targets, testing_targets), axis=0)
def vectorize(sequences, dimension = 10000):
 results = np.zeros((len(sequences), dimension))
 for i, sequence in enumerate(sequences):
  results[i, sequence] = 1
 return results
 
data = vectorize(data)
targets = np.array(targets).astype("float32")
test_x = data[:10000]
test_y = targets[:10000]
train_x = data[10000:]
train_y = targets[10000:]
model = models.Sequential()
# Input - Layer
model.add(layers.Dense(50, activation = "relu", input_shape=(10000, )))
# Hidden - Layers
model.add(layers.Dropout(0.3, noise_shape=None, seed=None))
model.add(layers.Dense(50, activation = "relu"))
model.add(layers.Dropout(0.2, noise_shape=None, seed=None))
model.add(layers.Dense(50, activation = "relu"))
# Output- Layer
model.add(layers.Dense(1, activation = "sigmoid"))
model.summary()
# compiling the model
model.compile(
 optimizer = "adam",
 loss = "binary_crossentropy",
 metrics = ["accuracy"]
)
results = model.fit(
 train_x, train_y,
 epochs= 2,
 batch_size = 500,
 validation_data = (test_x, test_y)
)
print("Test-Accuracy:", np.mean(results.history["val_acc"]))


总结

在此文中,您了解了情感分析是什么以及为什么Keras是最常用的深度学习库之一。 最重要的是,你了解到Keras为深度学习和人工智能的产品化做出了巨大贡献。 您学习了如何构建一个简单的神经网络,其中包含六层,可以预测电影评论的情绪,准确率达到89%。 您现在可以使用此模型对其他文本源进行二元情感分析,但您需要将您的数据长度全部更改为10000,或者更改输入图层的输入形状。 您也可以将此模型应用于其他相关的机器学习问题,只需进行一些更改。

学习资源

https://keras.io/datasets/

https://en.wikipedia.org/wiki/Sentiment_analysis

https://machinelearningmastery.com/introduction-python-deep-learning-library-keras/

  • 5
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
首先,我们需要导入keras和相关的库: ```python import keras from keras.models import Sequential from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense from keras.datasets import mnist from keras.utils import to_categorical ``` 然后我们加载mnist数据集,并对其进行预处理: ```python # 加载mnist数据集 (x_train, y_train), (x_test, y_test) = mnist.load_data() # 数据预处理 x_train = x_train.reshape(x_train.shape[0], 28, 28, 1).astype('float32') / 255 x_test = x_test.reshape(x_test.shape[0], 28, 28, 1).astype('float32') / 255 y_train = to_categorical(y_train, 10) y_test = to_categorical(y_test, 10) ``` 接下来,我们搭建Lenet-5网络模型: ```python # 创建lenet-5网络 model = Sequential() model.add(Conv2D(filters=6, kernel_size=(5, 5), strides=(1, 1), activation='tanh', input_shape=(28, 28, 1))) model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) model.add(Conv2D(filters=16, kernel_size=(5, 5), strides=(1, 1), activation='tanh')) model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) model.add(Flatten()) model.add(Dense(120, activation='tanh')) model.add(Dense(84, activation='tanh')) model.add(Dense(10, activation='softmax')) ``` 最后,我们编译并训练模型,并在测试集上进行评估: ```python # 编译模型 model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.Adadelta(), metrics=['accuracy']) # 训练模型 model.fit(x_train, y_train, batch_size=128, epochs=10, validation_data=(x_test, y_test)) # 在测试集上评估模型性能 score = model.evaluate(x_test, y_test, verbose=0) print('Test loss:', score[0]) print('Test accuracy:', score[1]) ``` 通过以上步骤,我们就成功基于keras搭建一个Lenet-5网络,并实现了对mnist手写数字的识别。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-派神-

感谢您慷慨解囊,我会更加努力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值