基於tensorflow2實現卷積神經網路

2021-10-05 11:16:48 字數 2917 閱讀 9910

利用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()

訓練中發生了損失率和準確率不管迭代多少次都不會變化的梯度消失的現象,如下圖所示

查閱了很多資料,也訓練了很多次,通過不斷除錯發現造成這個現象的原因可能是一下兩點:

1:讀取資料集的時候沒有對資料進行歸一化

2:在卷積層中新增了啟用引數但貌似tensorflow2.x不同版本的實際效果不同,可以嘗試使用在卷積層和池化層之間增加乙個啟用函式

以上都可以解決梯度消失的問題

tensorflow2實現線性回歸例子

tensorflow version 2.x import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers from tensorflow import initializers as...

tensorflow2實現yolov3過程

本篇文章為閱讀 源 後整理的筆記。部分變數我還是理解的不到位 如下面打問號的地方 希望有大神能多多指教!配置引數準備 train input size 大小 416 strides 跨度 取值 8,16,32 類別 80個類別 batch size 4 train output sizes 計算方法...

tensorflow2的資料載入

對於一些小型常用的資料集,tensorflow有相關的api可以呼叫 keras.datasets 經典資料集 1 boston housing 波士頓房價 2 mnist fasion mnist 手寫數字集 時髦品集 3 cifar10 100 物象分類 4 imdb 電影評價 使用 tf.da...