基于 CNN,搭建一个苹果分类器(二分类)python
时间: 2024-02-15 22:01:40 浏览: 26
好的,我可以为您提供一个基于CNN的苹果分类器的实现,以下是代码:
首先,我们需要导入必要的库:
```python
import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
import matplotlib.pyplot as plt
```
接下来,我们需要准备数据集。我们可以从Kaggle上下载一个包含苹果和非苹果图片的数据集,然后将其分成训练集和测试集。我们需要将苹果标记为1,非苹果标记为0。
```python
train_dir = "path/to/training/folder"
test_dir = "path/to/testing/folder"
train_apple_dir = os.path.join(train_dir, 'apple')
train_not_apple_dir = os.path.join(train_dir, 'not_apple')
test_apple_dir = os.path.join(test_dir, 'apple')
test_not_apple_dir = os.path.join(test_dir, 'not_apple')
train_apple_files = os.listdir(train_apple_dir)
train_not_apple_files = os.listdir(train_not_apple_dir)
test_apple_files = os.listdir(test_apple_dir)
test_not_apple_files = os.listdir(test_not_apple_dir)
train_images = []
train_labels = []
for file in train_apple_files:
image_path = os.path.join(train_apple_dir, file)
image = keras.preprocessing.image.load_img(image_path, target_size=(150, 150))
image_array = keras.preprocessing.image.img_to_array(image)
train_images.append(image_array)
train_labels.append(1)
for file in train_not_apple_files:
image_path = os.path.join(train_not_apple_dir, file)
image = keras.preprocessing.image.load_img(image_path, target_size=(150, 150))
image_array = keras.preprocessing.image.img_to_array(image)
train_images.append(image_array)
train_labels.append(0)
test_images = []
test_labels = []
for file in test_apple_files:
image_path = os.path.join(test_apple_dir, file)
image = keras.preprocessing.image.load_img(image_path, target_size=(150, 150))
image_array = keras.preprocessing.image.img_to_array(image)
test_images.append(image_array)
test_labels.append(1)
for file in test_not_apple_files:
image_path = os.path.join(test_not_apple_dir, file)
image = keras.preprocessing.image.load_img(image_path, target_size=(150, 150))
image_array = keras.preprocessing.image.img_to_array(image)
test_images.append(image_array)
test_labels.append(0)
train_images = np.array(train_images)
train_labels = np.array(train_labels)
test_images = np.array(test_images)
test_labels = np.array(test_labels)
```
接下来,我们可以定义模型。我们可以使用卷积层和池化层构建模型。在最后添加一个全连接层和输出层。我们使用ReLU激活函数和Sigmoid激活函数。
```python
model = keras.Sequential([
layers.Conv2D(16, 3, padding='same', activation='relu', input_shape=(150, 150 ,3)),
layers.MaxPooling2D(),
layers.Conv2D(32, 3, padding='same', activation='relu'),
layers.MaxPooling2D(),
layers.Conv2D(64, 3, padding='same', activation='relu'),
layers.MaxPooling2D(),
layers.Flatten(),
layers.Dense(128, activation='relu'),
layers.Dense(1, activation='sigmoid')
])
```
接下来,我们可以编译模型,设置损失函数和优化器。
```python
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])
```
训练模型并输出结果。
```python
history = model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels))
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print('\nTest accuracy:', test_acc)
```
最后,我们可以绘制训练和验证准确性的图表。
```python
acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs_range = range(10)
plt.figure(figsize=(8, 8))
plt.subplot(2, 1, 1)
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.subplot(2, 1, 2)
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('epoch')
plt.show()
```
以上就是基于CNN搭建苹果分类器的代码,希望能对您有所帮助。