人工智能
我搭建的神经网络代码哪里出了问题?
面冷心慈的枇杷 SegmentFault 思否
2 浏览
有人能帮忙看一下我自定义的卷积神经网络的代码哪里出了问题吗,我想做的是图像分类,循环的过程中验证集的损失值越来越大而且accuracy一直在0.1徘徊(我是小白真的不知道怎么办了)#调用库
import numpy as np
import matplotlib.pyplot as plt #画图
from PIL import Image #读图
import os
import splitfolders #自动划分数据集
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
from tensorflow.keras.optimizers import Adam
from sklearn.metrics import confusion_matrix,classification_report
import seaborn as sns
#数据集划分
input_folder=r"D:\machine learning\rename_picture"
output_folder=r"D:\machine learning\split_picture"
splitfolders.ratio(input_folder,output=output_folder,seed=123,ratio=(0.8,0.2)) #123固定每次划分一致
train_path=output_folder+r"\train"
val_path=output_folder+r"\val"
#处理读取数据
img_size=(128,128)
batch_size=32
#归一化像素
train_datagen=ImageDataGenerator(rescale=1./255,
rotation_range=15,
width_shift_range=0.1,
height_shift_range=0.1,
zoom_range=0.1,
horizontal_flip=True)
val_datagen=ImageDataGenerator(rescale=1./255)
#统一尺寸
train_generator=train_datagen.flow_from_directory(train_path,
target_size=img_size,batch_size=batch_size,
class_mode="categorical",shuffle=True)
val_generator=val_datagen.flow_from_directory(val_path,
target_size=img_size,batch_size=batch_size,
class_mode="categorical",shuffle=False)
#搭建CNN模型
from tensorflow.keras.callbacks import EarlyStopping,ReduceLROnPlateau
from tensorflow.keras.layers import BatchNormalization
model=Sequential()
model.add(Conv2D(filters=32,kernel_size=(3,3),activation='relu',input_shape=(128,128,3)))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(filters=64,kernel_size=(3,3),activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(filters=128,kernel_size=(3,3),activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(filters=192,kernel_size=(3,3),activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(256,activation='relu'))
model.add(Dropout(0.6))
model.add(Dense(10,activation='softmax'))
model.compile(optimizer=Adam(learning_rate=0.0003),
loss='categorical_crossentropy',metrics=['accuracy'])
callbacks=[ReduceLROnPlateau(monitor='val_loss',factor=0.5,patience=2,min_lr=1e-7,verbose=1),
EarlyStopping(monitor='val_loss',patience=6,restore_best_weights=True,verbose=1)]
model.summary()
history=model.fit(train_generator,
validation_data=val_generator,
epochs=20,
callbacks=callbacks)
acc=history.history['accuracy']
val_acc=history.history['val_accuracy']
loss=history.history['loss']
val_loss=history.history['val_loss']
epochs_range=range(len(acc))
plt.figure(figsize=(9,6))
plt.plot(epochs_range,loss,label='Training Loss')
plt.plot(epochs_range,val_loss,label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.show()
plt.figure(figsize=(9,6))
plt.plot(epochs_range,acc,label='Training Accuracy')
plt.plot(epochs_range,val_acc,label='Validation Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.show()
from sklearn.metrics import cohen_kappa_score
y_pred=model.predict(val_generator)
y_pred=np.argmax(y_pred,axis=1)
y_true=val_generator.classes
print(classification_report(y_true,y_pred,digits=4))
print('Kappa:',cohen_kappa_score(y_true,y_pred))
cm=confusion_matrix(y_true,y_pred)
cmap = sns.diverging_palette(220,10,as_cmap=True)
plt.figure(figsize=(8,6)) # 先创建一张8×6英寸白纸
sns.heatmap(cm,annot=True,fmt="d",cmap=cmap,center=0) # 在这张白纸上画混淆矩阵热力图
plt.xlabel('pred_label')
plt.ylabel('real_label')
plt.show()
y_prob = model.predict(val_generator)
y_pred = np.argmax(y_prob, axis=1)
y_true = val_generator.classes
wrong_indices = np.where(y_pred != y_true)[0]
print("Wrong predictions:", len(wrong_indices))
for i in wrong_indices[:20]:
print(
"True:",
y_true[i],
"Predicted:",
y_pred[i],
"Confidence:",
np.max(y_prob[i])
)我修改过学习率、数据集的处理方式、还有各种数值大小,但是不管怎么修改都不对
阅读原文:https://segmentfault.com/q/1010000048218350