python - 多次运行,对CNN上图像分类的准确性有影响吗?
问题描述
我是初学者。我通过以下程序在 Jupyter notebook 上使用 MNIST 尝试对 CNN 模型进行图像分类。从“model.fit_generator”连续运行两次(或多次)时,第二次运行的准确性受第一次运行结果的影响?看到显示的结果,我认为第二次运行似乎已经有了更好的准确性。请给我一些建议...
# import library
import keras
import matplotlib.pyplot as plt
import numpy as np
import os
import pandas as pd
import seaborn as sn
import shutil
import tensorflow as tf
from datetime import datetime, timedelta, timezone
from keras import backend as ke
from keras.callbacks import Callback, ModelCheckpoint, EarlyStopping
from keras.datasets import mnist
from keras.layers import Dense, Dropout, Activation, Flatten, Conv2D, MaxPooling2D, BatchNormalization
from keras.models import Sequential
from keras.optimizers import RMSprop
from keras.preprocessing.image import ImageDataGenerator
from keras.utils import np_utils
from sklearn.metrics import confusion_matrix
from sklearn.model_selection import train_test_split
from tqdm import tqdm
# MNIST
mnist=keras.datasets.mnist
(x_train,y_train),(x_test,y_test)=mnist.load_data()
(x_train,y_train),(x_test,y_test)=(x_train[:80],y_train[:80]),(x_test[:20], y_test[:20])
#(x_train,y_train),(x_test,y_test)=(x_train[:160],y_train[:160]),(x_test[:40], y_test[:40])
#(x_train,y_train),(x_test,y_test)=(x_train[:800],y_train[:800]),(x_test[:200], y_test[:200])
#(x_train,y_train),(x_test,y_test)=(x_train[:8000],y_train[:8000]),(x_test[:2000], y_test[:2000])
x_train=x_train.reshape(x_train.shape[0],28,28,1)
x_test=x_test.reshape(x_test.shape[0],28,28,1)
x_train=x_train/255
x_test=x_test/255
print("x_train",x_train.shape)
print("x_test",x_test.shape)
# model
model = Sequential()
model.add(Conv2D(64, (3, 3), input_shape=(28,28,1), padding='same'))
BatchNormalization(axis=-1)
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3), padding='same'))
BatchNormalization(axis=-1)
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.20))
model.add(Conv2D(64, (3, 3), padding='same'))
BatchNormalization(axis=-1)
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3), padding='same'))
BatchNormalization(axis=-1)
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.20))
model.add(Conv2D(128, (3, 3), padding='same'))
BatchNormalization(axis=-1)
model.add(Activation('relu'))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dense(10, activation='softmax'))
model.summary()
# model compile
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# model fit
model.fit(x_train,y_train,epochs=40)
# evoluate for test data
loss,acc=model.evaluate(x_test,y_test,verbose=2)
print('loss:','{:.3f}'.format(loss),'accuracy:','{:.3f}'.format(acc))
# ImageDataGenerator
datagen = ImageDataGenerator(
featurewise_center=False,
samplewise_center=False,
featurewise_std_normalization=False,
samplewise_std_normalization=False,
zca_whitening=False,
rotation_range=10,
width_shift_range=0.1,
height_shift_range=0.1,
zoom_range=[2.0,0.1],
horizontal_flip=False,
vertical_flip=False)
datagen.fit(x_train)
datagent = ImageDataGenerator(
featurewise_center=False,
samplewise_center=False,
featurewise_std_normalization=False,
samplewise_std_normalization=False,
zca_whitening=False,
rotation_range=10,
width_shift_range=0.1,
height_shift_range=0.1,
zoom_range=[2.0,0.1],
horizontal_flip=False,
vertical_flip=False)
datagent.fit(x_test)
# parameter
epochs = 100
iteration_train = 5
iteration_test = 2
batch_size_train = int(x_train.shape[0] / iteration_train)
batch_size_test = int(x_test.shape[0] / iteration_test)
gen_train_flow = datagen.flow(x_train, y_train, batch_size=batch_size_train)
gen_test_flow = datagent.flow(x_test, y_test, batch_size=batch_size_test)
history = model.fit(gen_train_flow,
steps_per_epoch=iteration_train,
epochs=epochs,
validation_data=gen_test_flow,
validation_steps=iteration_test)#,
#callbacks=callbacks)
# evoluate for test data
loss,acc=model.evaluate(x_test,y_test,verbose=2)
print('loss:','{:.3f}'.format(loss),'accuracy:','{:.3f}'.format(acc))
# graph for training
acc=history.history['accuracy']#acc
val_acc=history.history['val_accuracy']#val_acc
epochs=range(1,len(acc)+1)
plt.plot(epochs,acc,'b',label='Training accuracy')
plt.plot(epochs,val_acc,'r',label='Val accuracy')
plt.legend()
plt.show()
解决方案
推荐阅读
- matlab - 将jpg文件名添加到列表框中并选择一个观看 - Matlab
- python - conditional vectorized calculation with numpy arrays without using direct masking
- clojure - 在 Spacemacs 中将依赖项添加到 deps.edn
- typescript - 如何让 Typescript 识别使用 Lit-Element 中的“get properties()”方法创建的属性?
- c# - C# MongoDB.Driver 聚合与项目不返回字段 _id
- python - 无法将 numpy 数组转换为张量
- python - 如何在没有循环的情况下在 Python 中有条件地设置 DataFrame 列值
- javascript - 防止按键进入由键盘事件聚焦的元素
- github - Github 服务连接未使用 Azure Devops 更新
- gnuplot - gnuplot:添加偏移量时 splot pm3d 工件