欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于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 initializeThis 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()

训练中发生了损失率和准确率不管迭代多少次都不会变化的梯度消失的现象,如下图所示
基于tensorflow2实现卷积神经网络
查阅了很多资料,也训练了很多次,通过不断调试发现造成这个现象的原因可能是一下两点:
1:读取数据集的时候没有对数据进行归一化
2:在卷积层中添加了**参数但貌似Tensorflow2.X不同版本的实际效果不同,可以尝试使用在卷积层和池化层之间增加一个**函数
以上都可以解决梯度消失的问题
基于tensorflow2实现卷积神经网络