下面是关于“python神经网络AlexNet分类模型训练猫狗数据集”的完整攻略。
准备工作
在开始训练之前,需要准备好猫狗数据集。可以从Kaggle上下载猫狗数据集。下载地址为:https://www.kaggle.com/c/dogs-vs-cats/data
下载完成后,需要将数据集解压缩,并将猫和狗的图片分别放在两个文件夹中。
AlexNet模型
AlexNet是一种经典的卷积神经网络模型,由Alex Krizhevsky等人在2012年提出。以下是AlexNet模型的代码:
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
model = Sequential()
model.add(Conv2D(96, (11, 11), strides=(4, 4), activation='relu', input_shape=(227, 227, 3)))
model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2)))
model.add(Conv2D(256, (5, 5), activation='relu'))
model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2)))
model.add(Conv2D(384, (3, 3), activation='relu'))
model.add(Conv2D(384, (3, 3), activation='relu'))
model.add(Conv2D(256, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2)))
model.add(Flatten())
model.add(Dense(4096, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(4096, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
model.summary()
在上面的代码中,我们定义了一个名为model的Sequential模型,并添加了多个卷积层、池化层、全连接层和Dropout层。其中,输入图片的大小为227x227x3,输出为1个sigmoid激活函数的神经元,用于二分类。
数据预处理
在训练之前,需要对数据进行预处理。以下是数据预处理的代码:
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(
rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True
)
test_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
'train',
target_size=(227, 227),
batch_size=32,
class_mode='binary'
)
validation_generator = test_datagen.flow_from_directory(
'validation',
target_size=(227, 227),
batch_size=32,
class_mode='binary'
)
在上面的代码中,我们使用Keras中的ImageDataGenerator函数对数据进行预处理。其中,训练数据集和验证数据集的目录分别为train和validation,图片大小为227x227,batch_size为32,class_mode为binary,表示二分类。
模型训练
以下是模型训练的代码:
from keras.optimizers import SGD
model.compile(loss='binary_crossentropy', optimizer=SGD(lr=0.01), metrics=['accuracy'])
model.fit_generator(
train_generator,
steps_per_epoch=2000,
epochs=50,
validation_data=validation_generator,
validation_steps=800
)
model.save_weights('alexnet_weights.h5')
在上面的代码中,我们使用SGD优化器,学习率为0.01,损失函数为binary_crossentropy,评估指标为accuracy。训练50个epoch,每个epoch有2000个步骤,验证集有800个步骤。训练完成后,将模型权重保存到alexnet_weights.h5文件中。
示例1:使用训练好的模型进行预测
以下是使用训练好的模型进行预测的代码:
from keras.preprocessing import image
import numpy as np
img_path = 'test/cat.1.jpg'
img = image.load_img(img_path, target_size=(227, 227))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = x / 255.0
model.load_weights('alexnet_weights.h5')
preds = model.predict(x)
print(preds)
在上面的代码中,我们使用Keras中的image函数加载一张测试图片,并将其转换为模型输入的格式。然后,将模型权重加载到模型中,并使用predict函数进行预测。最后,打印预测结果。
示例2:使用训练好的模型进行特征提取
以下是使用训练好的模型进行特征提取的代码:
from keras.models import Model
model.load_weights('alexnet_weights.h5')
layer_name = 'dense_2'
intermediate_layer_model = Model(inputs=model.input, outputs=model.get_layer(layer_name).output)
img_path = 'test/cat.1.jpg'
img = image.load_img(img_path, target_size=(227, 227))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = x / 255.0
intermediate_output = intermediate_layer_model.predict(x)
print(intermediate_output)
在上面的代码中,我们使用Keras中的Model函数创建一个新的模型,该模型的输入和输出与原模型相同,但输出为指定层的输出。然后,将模型权重加载到模型中,并使用predict函数进行特征提取。最后,打印特征提取结果。
总结
在本攻略中,我们介绍了如何使用Python神经网络AlexNet模型训练猫狗数据集,并提供了两个示例说明。可以使用这些示例来进行模型预测和特征提取。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python神经网络AlexNet分类模型训练猫狗数据集 - Python技术站