Keras搭建卷积神经网络

本文分享了作者从TensorFlow转向Keras的心得体会,详细介绍了使用Keras构建深度学习模型的过程,包括数据预处理、模型搭建、训练及评估。通过实例展示了Keras的简洁性和高效性。

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

之前一直用的是TensorFlow,但是一用Keras之后就立马被它圈粉,Keras对于函数的封装十分得精炼。
先上代码

导入模块

import numpy as np
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.preprocessing.image import ImageDataGenerator
from keras.callbacks import ReduceLROnPlateau
from keras.callbacks import TensorBoard
from keras.callbacks import ModelCheckpoint
from keras.models import load_model
import os
import warnings
# 忽略硬件加速的警告信息
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
warnings.filterwarnings('ignore')

导入训练和测试数据

X_train = np.random.random((1000, 28, 28, 1))
print(X_train.shape)
#这里的数据模仿的是图片数据
y_train = keras.utils.to_categorical(np.random.randint(10, size=(1000, 1)), num_classes=10)
#这些照片总共有10个类别
print(y_train.shape)
X_test = np.random.random((100, 28, 28, 1))
y_test = keras.utils.to_categorical(np.random.randint(10, size=(100, 1)), num_classes=10)

(1000, 28, 28, 1)的意思是说有1000张测试图片,它们的width, height,channel分别为28,28,1,属于灰度图片。这些照片总共有10个类别,使用keras.utils.to_categorical将类别信息转换为独热码的形式(独热码有利于神经网络的训练)

batch_size=28    #每次喂给网络28组数据
epochs=2

一共进行2轮。这里的意思也就是说1000张图片,每次训练28张,所以需要训练1000÷28=35次余20个,相当于一共训练36次,只不过最后一次只喂了20组数据给网络。当最后20个数据喂完后,1个epoch就结束了,然后再回到这1000张图片的第一张,从头开始继续训练。

建立模型

model = Sequential() #这里使用序贯模型,比较容易理解
#序贯模型就像搭积木一样,将神经网络一层一层往上搭上去
model.add(Conv2D(32, (3, 3), activation='relu', padding='same', data_format='channels_last',name='layer1_con1',input_shape=(28, 28, 1)))
#搭一个卷积层
model.add(Conv2D(32, (3, 3), activation='relu', padding='same', data_format='channels_last',name='layer1_con2'))
#再搭一层卷积层效果更好
model.add(MaxPooling2D(pool_size=(2, 2),strides=(2,2), padding = 'same', data_format='channels_last',name = 'layer1_pool'))
#搭一个最大池化层
model.add(Dropout(0.25))
#dropout层可以防止过拟合,每次有25%的数据将被抛弃

这里搭建的卷积层共有32个卷积核,卷积核大小为3*3,采用relu的激活方式。这里的data_format='channels_last’意思是通道数在最后,因为我之前的图片数据就是(100, 28, 28, 1),最后那个1就是通道数,普通的照片是3通道的,就是有RGB三种颜色,我生成的是灰度图。这里的name就是给这层卷积层的命名,给它一个名字。这样的好处在使用tensorboard后非常的明显。input_shape,字面意思就是输入数据的维度。

model.add(Conv2D(64, (3, 3), activation='relu', padding='same', data_format='channels_last',name='layer2_con1'))
model.add(Conv2D(64, (3, 3), activation='relu', padding='same', data_format='channels_last',name='layer2_con2'))
model.add(MaxPooling2D(pool_size=(2, 2),strides=(2,2), padding = 'same', data_format='channels_last',name = 'layer2_pool'))
#和上面的网络结构类似

最后的全连接层

model.add(Flatten())
model.add(Dense(128, activation='relu'))  #该全连接层共128个神经元
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax')) 
#一共分为10类,所以最后一层有10个神经元,并且采用softmax输出

模型编译

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics = ['accuracy'])
#定义损失值、优化器

回调函数Callbacks

learning_rate_reduction = ReduceLROnPlateau(monitor = 'val_acc', patience = 3,mode='auto',  verbose = 1, factor=0.5, min_lr = 0.00001)

当评价指标不再提升时,减少学习率。当学习停滞时,减少2倍或10倍的学习率常常能获得较好的效果。该回调函数检测指标的情况,如果在patience个epoch中看不到模型性能提升,则减少学习率。此处patience=3,也就是说,当模型训练了3个epoch后,模型准确率还没有提升,就减小学习率

https://keras-cn.readthedocs.io/en/latest/other/callbacks/

#TensorBoard可视化
TensorBoard=TensorBoard(log_dir='./log', write_images=1, histogram_freq=1)

TensorBoard是一款非常好的可视化利器。在cmd窗口输入tensorboard --logdir=log文件路径,即可获得tensorboard的地址。此处tensorboard的log文件存入log这个文件夹里

#保存训练参数
Checkpoint=ModelCheckpoint(filepath='./cnn_model',monitor='val_acc',mode='auto' ,save_best_only=True)

图片增强

data_augment = ImageDataGenerator(rotation_range= 10,zoom_range= 0.1,
                                  width_shift_range = 0.1,height_shift_range = 0.1,
                                  horizontal_flip = False, vertical_flip = False)

将原始图片通过旋转放大等操作,获得更多的数据集,同时也增加了模型的鲁棒性

模型训练

model.fit_generator(data_augment.flow(X_train, y_train, 
batch_size=batch_size),epochs= epochs, validation_data = (X_test,y_test),     
verbose=5,callbacks=[learning_rate_reduction,TensorBoard,Checkpoint],shuffle=True)

模型评估

[loss,accuracy] = model.evaluate(X_test, y_test)
print('\nTest Loss: ', loss)
print('\nTest Accuracy: ', accuracy)

总之Keras还是比较容易上手的,不过一开始可以试试TensorFlow,虽然繁琐,但对于网络的构建能够更深入的理解。当然,如果用C语言写,那就再好不过了,从上到下敲完一遍神经网络,直接就升华了。。。

完整代码:
https://github.com/lubu-Alex/My_keras
里面还有Keras迁移学习以及预测的代码

参考资料:
https://keras-cn.readthedocs.io/en/latest/getting_started/sequential_model/

### 使用Keras构建卷积神经网络(CNN) #### 导入必要的库 要使用Keras创建CNN模型,首先需要导入所需的Python包。这通常包括`tensorflow.keras`用于定义和训练模型以及`numpy`处理数据。 ```python import numpy as np from tensorflow import keras from tensorflow.keras import layers ``` #### 准备数据集 对于图像分类任务来说,准备合适的数据集至关重要。这里假设已经有一个预处理过的MNIST手写数字识别数据集作为例子[^1]。 ```python # 加载 MNIST 数据集 (x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data() # 归一化像素值到0-1之间,并调整形状以适应卷积层的要求 x_train = x_train.astype("float32") / 255.0 x_test = x_test.astype("float32") / 255.0 x_train = np.expand_dims(x_train, -1) x_test = np.expand_dims(x_test, -1) print("x_train shape:", x_train.shape) print(x_train.shape[0], "train samples") print(x_test.shape[0], "test samples") # 将类别标签转换成one-hot编码形式 y_train = keras.utils.to_categorical(y_train, num_classes=10) y_test = keras.utils.to_categorical(y_test, num_classes=10) ``` #### 定义模型架构 接下来就是设计具体的CNN结构了。下面给出的是一个简单的两层卷积加池化的网络配置: ```python model = keras.Sequential( [ keras.Input(shape=(28, 28, 1)), layers.Conv2D(32, kernel_size=(3, 3), activation="relu"), layers.MaxPooling2D(pool_size=(2, 2)), layers.Conv2D(64, kernel_size=(3, 3), activation="relu"), layers.MaxPooling2D(pool_size=(2, 2)), layers.Flatten(), layers.Dropout(0.5), layers.Dense(num_classes, activation="softmax"), ] ) model.summary() ``` 这段代码中包含了两个主要部分:首先是连续两次应用带有ReLU激活函数的二维卷积操作(`layers.Conv2D`);其次是最大池化(`layers.MaxPooling2D`)用来降低空间维度并减少过拟合风险。最后通过展平(Flatten),丢弃(Dropout)一些节点防止过拟合并连接全连接(Dense)输出层完成整个前馈过程[^2]。 #### 编译与训练模型 设置好损失函数(loss function)、优化算法(optimizer)之后就可以调用fit方法来进行实际的学习过程了。 ```python batch_size = 128 epochs = 15 model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"]) model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, validation_split=0.1) ``` 在此过程中,每一轮迭代都会更新权重参数使得预测误差最小化。同时也会保留一部分验证集来评估泛化性能。 #### 测试模型准确性 经过多轮次的训练后,可以利用测试集中未见过的数据检验最终效果如何。 ```python score = model.evaluate(x_test, y_test, verbose=0) print("Test loss:", score[0]) print("Test accuracy:", score[1]) ``` 以上即为使用Keras框架快速搭建起一个基础版本的手写字体识别系统的全过程介绍。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值