日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > 卷积神经网络 >内容正文

卷积神经网络

基于Keras的卷积神经网络用于猫狗分类(未进行数据增强)+卷积层可视化

發(fā)布時間:2024/7/23 卷积神经网络 75 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于Keras的卷积神经网络用于猫狗分类(未进行数据增强)+卷积层可视化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先看數據集路徑:

cats和dogs存放的就是各種大小的貓狗圖片。

讀取數據集代碼:

import os import matplotlib.pyplot as plt """ 讀取數據 返回數據的文件夾名字,和具體的貓狗的路徑 """ def read_data(): #提取數據集的樣本路徑base_dir='./data/cats_and_dogs_filtered'train_dir=os.path.join(base_dir,'train')validation_dir=os.path.join(base_dir,'validation')train_cats_dir=os.path.join(train_dir,'cats')train_dogs_dir=os.path.join(train_dir,'dogs')validation_cats_dir=os.path.join(validation_dir,'cats')validation_dogs_dir=os.path.join(validation_dir,'dogs')#對狗和貓的圖片名稱提取存放在列表里train_cat_fnames=os.listdir(train_cats_dir)train_cat_fnames.sort()print(train_cat_fnames[:10])train_dog_fnames=os.listdir(train_dogs_dir)train_dog_fnames.sort()print(train_dog_fnames[:10])# print(len(os.listdir(train_cats_dir)))# pic_index=0# plt.figure(figsize=(16,16))#設置畫布大小為1600×1600# # fig=plt.gcf()# # fig.set_size_inches(ncols*4,nrows*4)# pic_index+=8#提取數據集具體的路徑進入列表中next_cat_pix=[os.path.join(train_cats_dir,fname)for fname in train_cat_fnames]#print(next_cat_pix)next_dog_pix=[os.path.join(train_dogs_dir,fname)for fname in train_dog_fnames]return train_dir,validation_dir,next_cat_pix,next_dog_pixdef test():train_dir,validation_dir,next_cat_pix,next_dog_pix=read_data()print(train_dir)print(validation_dir)print(next_dog_pix)nrows = 4ncols = 4for i,img_path in enumerate(next_cat_pix+next_dog_pix):if i<16:sp=plt.subplot(nrows,ncols,i+1)sp.axis('off')#去除軸img=plt.imread(img_path)#讀取圖片plt.imshow(img)plt.show()if __name__ == '__main__':# read_data()test()

打印結果:打印16張照片看看

模型代碼:

import numpy as np import matplotlib.pyplot as plt import random import data_read import tensorflow as tf from keras.models import Model from keras import layers,optimizers from keras import backend as K from keras.preprocessing.image import ImageDataGenerator,img_to_array,load_img """ 獲得所需求的圖片--未進行圖像增強 """ def data_deal():# 獲取數據的路徑train_dir, validation_dir, next_cat_pix, next_dog_pix = data_read.read_data()#像素縮小到0~1train_datagen=ImageDataGenerator(rescale=1./255)test_datagen=ImageDataGenerator(rescale=1./255)#從文件夾獲取所需要求的圖片#優(yōu)點 能夠根據train下的兩個文件夾二分類train_generator=train_datagen.flow_from_directory(train_dir,target_size=(150,150),batch_size=20,class_mode='binary')test_generator = test_datagen.flow_from_directory(validation_dir,target_size=(150, 150),batch_size=20,class_mode='binary')# print(train_generator)# print(test_generator.samples)return train_generator,test_generator """ 定義模型 """ def define_model(): #定義TF backend session# tf_config=tf.ConfigProto(gpu_options=tf.GPUOptions(allow_growth=True))# K.set_session(tf.Session(config=tf_config))#卷積過程 三層卷積img_input=layers.Input(shape=(150,150,3))x=layers.Conv2D(filters=16,kernel_size=(3,3),activation='relu')(img_input)print('第一次卷積尺寸={}'.format(x.shape))x=layers.MaxPooling2D(strides=(2,2))(x)print('第一次池化尺寸={}'.format(x.shape))x=layers.Conv2D(filters=32,kernel_size=(3,3),activation='relu')(x)print('第二次卷積尺寸={}'.format(x.shape))x=layers.MaxPooling2D(strides=(2,2))(x)print('第二次池化尺寸={}'.format(x.shape))x=layers.Conv2D(filters=64,kernel_size=(3,3),activation='relu')(x)print('第三次卷積尺寸={}'.format(x.shape))x=layers.MaxPooling2D(strides=(2,2))(x)print('第三次池化尺寸={}'.format(x.shape))#全連接層x=layers.Flatten()(x)x=layers.Dense(512,activation='relu')(x)output=layers.Dense(1,activation='sigmoid')(x)model=Model(inputs=img_input,outputs=output,name='CAT_DOG_Model')return img_input,model """ 訓練模型 """ def train_model():#構建網絡模型img_input,model=define_model()#編譯模型model.compile(optimizer=optimizers.RMSprop(lr=0.001),loss='binary_crossentropy',metrics=['accuracy'])train_generator,test_generator=data_deal()#verbose:日志顯示,0為不在標準輸出流輸出日志信息,1為輸出進度條記錄,2為每個epoch輸出一行記錄print('=============開始訓練模型==================')#訓練模型history=model.fit_generator(train_generator,steps_per_epoch=100,#2000 images=batch_szie*stepsepochs=10,validation_data=test_generator,validation_steps=50,#1000=20*50verbose=2)# 模型參數個數model = model.summary()# print(model)#精度acc=history.history['acc']val_acc=history.history['val_acc']print('訓練集精度={}'.format(acc))print('驗證集精度={}'.format(val_acc))#損失loss=history.history['loss']val_loss=history.history['val_loss']print('訓練集損失值={}'.format(loss))print('驗證集損失值={}'.format(val_loss))#epochs的數量epochs=range(len(acc))plt.plot(epochs,acc)plt.plot(epochs, val_acc)plt.title('training and validation accuracy')plt.figure()plt.plot(epochs, loss)plt.plot(epochs, val_loss)plt.title('training and validation loss')plt.show()""" 查看卷積層生成的圖 """ def visualize_model():img_input,model=define_model()# print(model.layers)#存儲每一層的tensor的shape 類型等successive_outputs=[layer.output for layer in model.layers]print('查看輸出={}'.format(successive_outputs))visualization_model=Model(img_input,successive_outputs)#從訓練集例返回圖片的地址train_dir, validation_dir, cat_img_files,dog_img_files = data_read.read_data()#返回隨機一張圖片的地址img_path=random.choice(cat_img_files+dog_img_files)img=load_img(img_path,target_size=(150,150))x=img_to_array(img)#print(x.shape)#變成(1,150,150,3)x=x.reshape((1,)+x.shape)x/=255#(samples,150,150,3) 存儲10層的信息successive_feature_maps=visualization_model.predict(x)print('該模型結構層數={}'.format(len(successive_feature_maps)))for i in range(len(successive_feature_maps)):print('第{}層shape={}'.format(i,successive_feature_maps[i].shape))layer_names=[layer.name for layer in model.layers]#zip 打包成一個個元組以列表形式返回[(),()]#并且遍歷元組里的內容images_per_row = 16for layer_name,feature_map in zip(layer_names,successive_feature_maps):if len(feature_map.shape)==4:#只查看卷積層n_features=feature_map.shape[-1]#(1,150,150,3)取3 取出深度size=feature_map.shape[1]##(1,150,150,3)取150 尺寸大小n_cols = n_features // images_per_rowdisplay_grid=np.zeros((size*n_cols,size*images_per_row))for col in range(n_cols):for row in range(images_per_row):x=feature_map[0,:,:,col*images_per_row+row]x-=x.mean()x/=(x.std()+0.001)x*=64x+=128#限定x的值大小 小于0 則為0 大于255則為255x=np.clip(x,0,255).astype('uint8')display_grid[col*size:(col+1)*size,row*size:(row+1)*size]=x#第一種顯示方法scale=1./sizeplt.figure(figsize=(scale*display_grid.shape[1],scale*display_grid.shape[0]))plt.title(layer_name)plt.grid(False)plt.imshow(display_grid, aspect='auto', cmap='viridis')plt.savefig('{}+{}.jpg'.format(layer_name,col))#第二種顯示方法# sp = plt.subplot(4, 4, i + 1)# sp.axis('off') # 去除軸# plt.imshow(display_grid[:,i*size:(i+1)*size],aspect='auto',cmap='viridis')plt.show() if __name__ == '__main__':train_model()#visualize_model()# data_deal()

訓練10個epoch打印結果:

可看出訓練精度一直上升,損失值一直減少,測試精度上升一定就穩(wěn)定了,且損失值一直上升,因為發(fā)生了過擬合,下一步就要解決過擬合。

調用卷積層可視化函數,打印

第一次卷積尺寸=(?, 148, 148, 16)
第一次池化尺寸=(?, 74, 74, 16)
第二次卷積尺寸=(?, 72, 72, 32)
第二次池化尺寸=(?, 36, 36, 32)
第三次卷積尺寸=(?, 34, 34, 64)
第三次池化尺寸=(?, 17, 17, 64)

的卷積圖,如下:

可發(fā)現越到后面越模糊,因為提取了高級特征,具有泛化能力。

總結

以上是生活随笔為你收集整理的基于Keras的卷积神经网络用于猫狗分类(未进行数据增强)+卷积层可视化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。