基于tensorflow2实现卷积神经网络
程序员文章站
2022-05-22 10:40:27
...
利用tensorflow2中的api实现一个简单的卷积神经网络,完成梯度下降的操作并绘制训练集和测试集准确率曲线。
数据集在这里
数据分布:训练集数量为209,测试集数量为50
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
在之前的编程过程中,始终会发生调用不了This is probably because cuDNN failed to initialize
和This is probably because GEMM failed to initialize
等错误,通过查询相关问题,最有可能和tensorflow总是自动申请全部显存有关,所以有相关问题的同学们可以在程序开头增加下面的代码,通过设定Tensorflow申请显存的占比来解决这个问题(因为网上能找到的都是tensorflow1版本中的代码,所以还需要用到config=tf.compat.v1.ConfigProto()
让代码能成功运行)。
config=tf.compat.v1.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.5
sess =tf.compat.v1.Session(config=config)
#读取数据集,数据集格式为h5,调用h5py,File读取文件
train_fp=h5py.File("./datasets/train_catvnoncat.h5")
test_fp = h5py.File("./datasets/test_catvnoncat.h5")
train_calss,train_x_get,train_y_get=train_fp.keys()
train_image = train_fp[train_x_get][0:]
train_layber = train_fp[train_y_get][0:]
train_calss = train_fp[train_calss][0:]
#训练集
test_calss,test_x_get,test_y_get=test_fp.keys()
test_image = test_fp[test_x_get][0:]
test_layber = test_fp[test_y_get][0:]
test_calss = test_fp[test_calss][0:]
#测试集
#对数据格式进行整理,归一化
train_image = train_image.reshape((-1,64,64,3))/255
test_image = test_image.reshape((-1,64,64,3))/255
#print(train_image[0])输出一个看一下
#神经网络建立
model = tf.keras.Sequential([
layers.Conv2D(input_shape=(train_image.shape[1],
train_image.shape[2],train_image.shape[3]),
filters=32,kernel_size=(3,3),strides=(1,1),
padding='valid'),
layers.ReLU(),
#建立卷积层,输入维度为(64,64,3),滤波器32个,
#卷积核大小为(3,3),步长为1
layers.MaxPool2D(pool_size=(2,2)),
#建立池化层,池化方式最大池化,池化层维度为(2,2)
layers.Flatten(),
layers.Dense(32,activation='relu'),
layers.Dense(2,activation='sigmoid')
])
#模型配置
model.compile(optimizer = keras.optimizers.Adam(0.001),
loss=keras.losses.SparseCategoricalCrossentropy(),
metrics = ['accuracy']
)
#查看神经网络模型model.summary()
#记录训练历史信息
history = model.fit(train_image,train_layber,batch_size=32,
epochs=20,validation_data=(test_image,test_layber))
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.legend(['training', 'valivation'], loc='upper left')
plt.show()
训练中发生了损失率和准确率不管迭代多少次都不会变化的梯度消失的现象,如下图所示
查阅了很多资料,也训练了很多次,通过不断调试发现造成这个现象的原因可能是一下两点:
1:读取数据集的时候没有对数据进行归一化
2:在卷积层中添加了**参数但貌似Tensorflow2.X不同版本的实际效果不同,可以尝试使用在卷积层和池化层之间增加一个**函数
以上都可以解决梯度消失的问题
推荐阅读
-
Python通过TensorFlow卷积神经网络实现猫狗识别
-
基于tensorflow实现mnist手写识别 (多层神经网络)
-
PyTorch上实现卷积神经网络CNN的方法
-
Python神经网络TensorFlow基于CNN卷积识别手写数字
-
tensorflow2.0之keras实现卷积神经网络
-
手写数字识别 ----卷积神经网络模型官方案例注释(基于Tensorflow,Python)
-
TensorFlow 实战之实现卷积神经网络的实例讲解
-
吴恩达作业10:用卷积神经网络识别人脸happy(基于Keras)
-
【Tensorflow】人脸128个关键点识别基于卷积神经网络实现
-
基于Tensorflow2 Lite在Android手机上实现图像分类