数据是人工智能的关键,但是一个成熟的人工智能应用,一定是经过海量的数据处理,而这些海量数据的存储算得上是一项巨大挑战。常见的数据类型有音频、图像、视频和文本,本文就来讨论如何通过Keras以数据压缩的形式解决图像文件存储的问题。
首先,要明白Keras是什么。作为一个由Python编写的深度神经网络库,有不同的神经网络压缩数据方式,如长短期记忆、循环神经网络或自动编码器。
使用Keras进行简单的图像压缩
使用基本的自动编码器压缩黑白图像。对于这种情况,基于典型前馈神经网络的自动编码器就足够了。
作为模型的数据源,选择公共MNIST数据集,该数据集包含通常用于训练各种图像处理系统的手写数字。
1.首先,借助pip安装包安装一些库:
pip install tensorflow==2.4.3
pip install keras==2.4.3
pip install matplotlib==3.3.4
pip install numpy==1.19.5
pip install extra-keras-datasets==1.2.0
2. 然后开始编写一个简单的深度学习模型并导入所需的类和模块:
from keras.layers import Input, Dense
from keras.datasets import mnist
from keras.models import Model
import numpy as np
3. 现在,编写一个函数,创建一个简单的自动编码器,其中一个隐藏层为 64 个神经元,用于模型的编码器和解码器部分:
IMAGE_SIZE = 784 # 28 * 28 pixels
def encoder(input_image, code_dimention):
layer1 = Dense(64, activation='relu')(input_image)
layer2 = Dense(code_dimention, activation='sigmoid')(layer1)
return layer2
def decoder(encoded_image):
layer1 = Dense(64, activation='relu')(encoded_image)
layer2 = Dense(IMAGE_SIZE, activation='sigmoid')(layer1)
return layer2
4. 接下来,加载数据集并开始训练神经网络。在下面的示例中,来回运行数据集十次,批大小为 64:
input_image = Input(shape=(IMAGE_SIZE, ))
model = Model(input_image, decoder(encoder(input_image, 100)))
model.compile(loss='mean_squared_error', optimizer='nadam')
(x_train, _), (x_test, _) = mnist.load_data()
# Normalize data
x_train = x_train.astype('float32') /= 255.0
x_train = x_train.reshape((len(x_train), np.prod(x_train.shape[1:])))
x_test = x_test.astype('float32') /= 255.0
x_test = x_test.reshape((len(x_test), np.prod(x_test.shape[1:])))
# Training
model.fit(x_train, x_train, batch_size=64, epochs=10, validation_data=(x_test, x_test), shuffle=True)
解压缩结果将根据所选的code大小(代码层中的节点数量)而有所不同。
当code=128时,图片压缩效果如图:
当code=32时,图片压缩效果如图:
当code=8时,图片压缩效果如图:
通过上述结果可知,随着code减小代,解压缩图片的质量会变差。这就是为什么需要确定好数据被压缩的程度,以便在图片解压缩后保持可容忍的质量。