https://blog.csdn.net/JinbaoSite/article/details/77435558
from PIL import Image
from keras.utils import np_utils
from keras.preprocessing import image
from __future__ import print_function
import keras
from keras.datasets import cifar10
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.callbacks import History
history = History()
batch_size = 32
num_classes = 6
epochs = 100
img_width, img_height = 150, 150
def load_data():
data = np.empty((510,150,150,3),dtype="float32")
label = np.empty((510,))
imgs = os.listdir(r"C:\Users\user\Desktop\birds\train")
#num = len(imgs)
num =510
for i in range(num):
if "egr" in imgs[i]:
img = Image.open("C:/Users/user/Desktop/birds/train/" + imgs[i])
arr = np.asarray(img, dtype="float32")
arr.resize((150,150,3))
data[i, :, :, :] = arr
label[i] = 0
elif "man" in imgs[i]:
img = Image.open("C:/Users/user/Desktop/birds/train/" + imgs[i])
arr = np.asarray(img, dtype="float32")
arr.resize((150,150,3))
data[i, :, :, :] = arr
label[i] = 1
elif "owl" in imgs[i]:
img = Image.open("C:/Users/user/Desktop/birds/train/" + imgs[i])
arr = np.asarray(img, dtype="float32")
arr.resize((150,150,3))
data[i, :, :, :] = arr
label[i] = 2
elif "puf" in imgs[i]:
img = Image.open("C:/Users/user/Desktop/birds/train/" + imgs[i])
arr = np.asarray(img, dtype="float32")
arr.resize((150,150,3))
data[i, :, :, :] = arr
label[i] = 3
elif "tou" in imgs[i]:
img = Image.open("C:/Users/user/Desktop/birds/train/" + imgs[i])
arr = np.asarray(img, dtype="float32")
arr.resize((150,150,3))
data[i, :, :, :] = arr
label[i] = 4
elif "wod" in imgs[i]:
img = Image.open("C:/Users/user/Desktop/birds/train/" + imgs[i])
arr = np.asarray(img, dtype="float32")
arr.resize((150,150,3))
data[i, :, :, :] = arr
label[i] = 5
else:
break
return data,label
train_data,train_labels = load_data()
y_train = keras.utils.to_categorical(train_labels, num_classes)
x_train = train_data.astype('float32')
x_train /= 255
model = Sequential()
model.add(Conv2D(32, (3, 3), padding='same',input_shape=train_data.shape[1:]))
model.add(Activation('relu'))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes))
model.add(Activation('softmax'))
opt = keras.optimizers.rmsprop(lr=0.0001, decay=1e-6)
# Let's train the model using RMSprop
model.compile(loss='categorical_crossentropy',
optimizer="adam",
metrics=['accuracy'])
histroy=modela.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
callbacks=[history],
validation_data=(datatest, y_test),
shuffle=True)
score = modela.evaluate(datatest, y_test, verbose=0)
def load_data1():
data = np.empty((70,150,150,3),dtype="float32")
label = np.empty((70,))
imgs = os.listdir(r"C:\Users\user\Desktop\birds\test1")
num = len(imgs)
num = 70
for i in range(num):
if "egr" in imgs[i]:
img = Image.open("C:/Users/user/Desktop/birds/test1/" + imgs[i])
arr = np.asarray(img, dtype="float32")#test1要再改
arr.resize((150,150,3))
data[i, :, :, :] = arr
label[i] = 0
elif "man" in imgs[i]:
img = Image.open("C:/Users/user/Desktop/birds/test1/" + imgs[i])
arr = np.asarray(img, dtype="float32")
arr.resize((150,150,3))
data[i, :, :, :] = arr
label[i] = 1
elif "owl" in imgs[i]:
img = Image.open("C:/Users/user/Desktop/birds/test1/" + imgs[i])
arr = np.asarray(img, dtype="float32")
arr.resize((150,150,3))
data[i, :, :, :] = arr
label[i] = 2
elif "puf" in imgs[i]:
img = Image.open("C:/Users/user/Desktop/birds/test1/" + imgs[i])
arr = np.asarray(img, dtype="float32")
arr.resize((150,150,3))
data[i, :, :, :] = arr
label[i] = 3
elif "tou" in imgs[i]:
img = Image.open("C:/Users/user/Desktop/birds/test1/" + imgs[i])
arr = np.asarray(img, dtype="float32")
arr.resize((150,150,3))
data[i, :, :, :] = arr
label[i] = 4
elif "wod" in imgs[i]:
img = Image.open("C:/Users/user/Desktop/birds/test1/" + imgs[i])
arr = np.asarray(img, dtype="float32")
arr.resize((150,150,3))
data[i, :, :, :] = arr
label[i] = 5
else:
break
return data,label
datatest,labeltest = load_data1()
datatest=datatest.astype("float32")/255
y_test=np_utils.to_categorical(labeltest,num_classes=6)
predict=model.predict_classes(datatest)
import pandas as d
pd.crosstab(labeltest.reshape(-1),predict,rownames=["label"],colnames=["predict"])
score = model.evaluate(datatest, y_test, verbose=0)
history.loss_plot('epoch')
class LossHistory(keras.callbacks.Callback):
def on_train_begin(self, logs={}):
self.losses = {'batch': [], 'epoch': []}
self.accuracy = {'batch': [], 'epoch': []}
self.val_loss = {'batch': [], 'epoch': []}
self.val_acc = {'batch': [], 'epoch': []}
def on_batch_end(self, batch, logs={}):
self.losses['batch'].append(logs.get('loss'))
self.accuracy['batch'].append(logs.get('acc'))
self.val_loss['batch'].append(logs.get('val_loss'))
self.val_acc['batch'].append(logs.get('val_acc'))
def on_epoch_end(self, batch, logs={}):
self.losses['epoch'].append(logs.get('loss'))
self.accuracy['epoch'].append(logs.get('acc'))
self.val_loss['epoch'].append(logs.get('val_loss'))
self.val_acc['epoch'].append(logs.get('val_acc'))
def loss_plot(self, loss_type):
iters = range(len(self.losses[loss_type]))
#创建一个图
plt.figure()
# acc
plt.plot(iters, self.accuracy[loss_type], 'r', label='train
acc')#plt.plot(x,y),这个将数据画成曲线
# loss
plt.plot(iters, self.losses[loss_type], 'g', label='train loss')
if loss_type == 'epoch':
# val_acc
plt.plot(iters, self.val_acc[loss_type], 'b', label='val acc')
# val_loss
plt.plot(iters, self.val_loss[loss_type], 'k', label='val loss')
plt.grid(True)#设置网格形式
plt.xlabel(loss_type)
plt.ylabel('acc-loss')#给x,y轴加注释
plt.legend(loc="upper right")#设置图例显示位置
plt.show()
history = LossHistory()