基于Tensorflow使用CNN进行图像分类

其他地方看见这个代码,他本身有一些问题,经过修改已经可以运行,对于新手可以参考,练练手。
数据集下载地址:http://download.tensorflow.org/example_images/flower_photos.tgz
五类花。
如果要使用自己的数据集修改path即可。
如果报错说分母出现0,则是数据集数量太小,比例划分后少的地方可能分不到图片。可以通过一些旋转,裁剪等方法扩大数据集。或者修改比例划分系数ratio。

# -*- coding: utf-8 -*-

from skimage import io, transform
import glob
import os
import tensorflow as tf
import numpy as np
import time
#Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2 报错忽略
import os
os.environ["TF_CPP_MIN_LOG_LEVEL"]='2' # 只显示 warning 和 Error

#图片位置
path = 'F:\\flower_photos\\'

# 将所有的图片resize成100*100
w = 100
h = 100
c = 3


# 读取图片
def read_img(path):
    cate = [path +'/'+ x for x in os.listdir(path) if os.path.isdir(path +'/'+ x)]
    imgs = []
    labels = []
    for idx, folder in enumerate(cate):
        for im in glob.glob(folder + '/*.jpg'):
            print('reading the images:%s' % (im))
            img = io.imread(im)
            img = transform.resize(img, (w, h))
            imgs.append(img)
            labels.append(idx)
    return np.asarray(imgs, np.float32), np.asarray(labels, np.int32)


data, label = read_img(path)

# 打乱顺序
num_example = data.shape[0]
arr = np.arange(num_example)
np.random.shuffle(arr)
data = data[arr]
label = label[arr]

# 将所有数据分为训练集和验证集
ratio = 0.8
s = np.int(num_example * ratio)
x_train = data[:s]
y_train = label[:s]
x_val = data[s:]
y_val = label[s:]

# -----------------构建网络----------------------
# 占位符
x = tf.placeholder(tf.float32, shape=[None, w, h, c], name='x')
y_ = tf.placeholder(tf.int32, shape=[None, ], name='y_')

# 第一个卷积层(100——>50)
conv1 = tf.layers.conv2d(
    inputs=x,
    filters=32,
    kernel_size=[5, 5],
    padding="same",
    activation=tf.nn.relu,
    kernel_initializer=tf.truncated_normal_initializer(stddev=0.01))
pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)

# 第二个卷积层(50->25)
conv2 = tf.layers.conv2d(
    inputs=pool1,
    filters=64,
    kernel_size=[5, 5],
    padding="same",
    activation=tf.nn.relu,
    kernel_initializer=tf.truncated_normal_initializer(stddev=0.01))
pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2)

# 第三个卷积层(25->12)
conv3 = tf.layers.conv2d(
    inputs=pool2,
    filters=128,
    kernel_size=[3, 3],
    padding="same",
    activation=tf.nn.relu,
    kernel_initializer=tf.truncated_normal_initializer(stddev=0.01))
pool3 = tf.layers.max_pooling2d(inputs=conv3, pool_size=[2, 2], strides=2)

# 第四个卷积层(12->6)
conv4 = tf.layers.conv2d(
    inputs=pool3,
    filters=128,
    kernel_size=[3, 3],
    padding="same",
    activation=tf.nn.relu,
    kernel_initializer=tf.truncated_normal_initializer(stddev=0.01))
pool4 = tf.layers.max_pooling2d(inputs=conv4, pool_size=[2, 2], strides=2)

re1 = tf.reshape(pool4, [-1, 6 * 6 * 128])

# 全连接层
dense1 = tf.layers.dense(inputs=re1,
                         units=1024,
                         activation=tf.nn.relu,
                         kernel_initializer=tf.truncated_normal_initializer(stddev=0.01),
                         kernel_regularizer=tf.contrib.layers.l2_regularizer(0.003))
dense2 = tf.layers.dense(inputs=dense1,
                         units=512,
                         activation=tf.nn.relu,
                         kernel_initializer=tf.truncated_normal_initializer(stddev=0.01),
                         kernel_regularizer=tf.contrib.layers.l2_regularizer(0.003))
logits = tf.layers.dense(inputs=dense2,
                         units=5,
                         activation=None,
                         kernel_initializer=tf.truncated_normal_initializer(stddev=0.01),
                         kernel_regularizer=tf.contrib.layers.l2_regularizer(0.003))
# ---------------------------网络结束---------------------------

loss = tf.losses.sparse_softmax_cross_entropy(labels=y_, logits=logits)
train_op = tf.train.AdamOptimizer(learning_rate=0.001).minimize(loss)
correct_prediction = tf.equal(tf.cast(tf.argmax(logits, 1), tf.int32), y_)
acc = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))


# 定义一个函数,按批次取数据
def minibatches(inputs=None, targets=None, batch_size=None, shuffle=False):
    assert len(inputs) == len(targets)
    if shuffle:
        indices = np.arange(len(inputs))
        np.random.shuffle(indices)
    for start_idx in range(0, len(inputs) - batch_size + 1, batch_size):
        if shuffle:
            excerpt = indices[start_idx:start_idx + batch_size]
        else:
            excerpt = slice(start_idx, start_idx + batch_size)
        yield inputs[excerpt], targets[excerpt]


# 训练和测试数据,可将n_epoch设置更大一些

n_epoch = 10
batch_size = 64
sess = tf.InteractiveSession()
sess.run(tf.global_variables_initializer())
for epoch in range(n_epoch):
    start_time = time.time()

    # training
    train_loss, train_acc, n_batch = 0, 0, 0
    for x_train_a, y_train_a in minibatches(x_train, y_train, batch_size, shuffle=True):
        _, err, ac = sess.run([train_op, loss, acc], feed_dict={x: x_train_a, y_: y_train_a})
        train_loss += err
        train_acc += ac
        n_batch += 1
    print("   train loss: %f" % (train_loss / n_batch))
    print("   train acc: %f" % (train_acc / n_batch))

    # validation
    val_loss, val_acc, n_batch = 0, 0, 0
    for x_val_a, y_val_a in minibatches(x_val, y_val, batch_size, shuffle=False):
        err, ac = sess.run([loss, acc], feed_dict={x: x_val_a, y_: y_val_a})
        val_loss += err
        val_acc += ac
        n_batch += 1
    print("   validation loss: %f" % (val_loss / n_batch))
    print("   validation acc: %f" % (val_acc / n_batch))

sess.close()
  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: 基于TensorFlow的卷积神经网络(CNN)病虫害识别系统是利用深度学习技术进行病虫害识别和分类的一种方法。该系统可以对农作物受到的病虫害进行自动化识别和分类,帮助农民及时发现病虫害的存在并采取相应措施。 首先,该系统需要收集大量的病虫害图像作为训练样本。这些样本应该包含不同种类的病虫害及其对应的正常农作物图像,以便让系统学习到不同病虫害的特征。接着,使用TensorFlow等深度学习框架构建卷积神经网络模型。 CNN模型在不同层次上提取图像的特征,将其转化为高维向量表示。对于每个输入图像,模型通过多个卷积和池化层提取不同层次的特征,并通过全连接层进行分类。 在训练模型时,使用带有标签的图像数据集进行有监督学习。通过大量样本的迭代训练,模型可以逐渐学习到病虫害图像的特征和模式,以准确地进行分类。在测试阶段,将未知病虫害图像输入到模型中,通过计算输出的概率分布来确定其所属的病虫害类别。 为了提高模型的准确性,可以采取一些技术手段和优化策略,如数据增强、正则化方法、调整模型架构等。此外,也可以使用迁移学习来将已经训练好的模型参数应用于新的病虫害数据集上,提高模型的泛化能力。 总之,基于TensorFlowCNN病虫害识别系统可以帮助农民及时识别和防治病虫害,提高农作物产量和质量。这一技术的发展将为农业行业的智能化发展做出贡献。 ### 回答2: 基于TensorFlowCNN(卷积神经网络)可以用于检测病虫害。 病虫害是农作物种植过程中常见的问题,通过早期检测和识别可以帮助农民及时采取控制措施,减少损失。卷积神经网络是一种深度学习模型,在图像处理领域有很好的应用,能够自动从图像中提取特征,并进行分类。 基于TensorFlowCNN病虫害检测系统包括以下步骤: 1. 数据采集和标注:首先需要收集大量的病虫害样本图片,并进行标注。标注可以是人工标注或者通过其他的自动化方式进行。 2. 数据预处理:对采集到的图片进行预处理,包括调整大小、裁剪、增加亮度对比度等操作,以便提高训练效果。 3. 模型训练:使用TensorFlow搭建CNN模型,并将标注好的数据集分为训练集和验证集。通过多次迭代,不断调整模型参数,使其逐渐优化。 4. 模型评估和调整:使用验证集评估训练好的模型的准确性和性能。如果模型表现不佳,可以通过调整网络架构、增加数据集大小或者使用其他技巧进行改进。 5. 病虫害检测:将未知的病虫害图像输入训练好的模型,利用模型的分类能力进行病虫害的检测。模型可以输出概率或者类别标签,帮助农民判断是否存在病虫害并及时采取控制措施。 基于TensorFlowCNN病虫害检测系统可以为农民提供一个快速、准确的病虫害识别工具,帮助他们在种植过程中有效管理和控制病虫害,从而提高农作物产量和质量。 ### 回答3: 基于TensorFlowCNN病虫害识别系统是一个使用卷积神经网络(Convolutional Neural Network,CNN)来自动识别和分类植物病虫害的应用程序。 首先,我们需要收集一组病虫害样本图片作为训练集。这些图片应涵盖不同类型的病虫害,例如叶子褪色、斑点、腐烂等等。每张图片都应有相应的标签,用于指示该图片属于哪一类病虫害。 接着,我们需要使用TensorFlow来构建一个CNN模型。CNN模型由多个卷积层、池化层和全连接层组成。卷积层与池化层可以提取图像的特征,全连接层可以将这些特征用于分类。 在训练过程中,我们将使用训练集中的图片和标签来训练CNN模型。训练过程中,模型将会根据输入的图片逐渐优化其参数,以提高对不同病虫害的识别能力。 完成训练后,我们可以使用测试集来评估模型的准确性。通过输入测试集中的图片,模型将会输出其对应的病虫害分类。我们可以与测试集中的真实病虫害标签进行比较,以确定模型的准确性。 一旦模型训练完成,我们就可以使用它来对未知病虫害进行分类。通过输入未知病虫害图片,模型将会输出其对应的分类结果。这样,我们可以快速准确地识别出植物受到的病虫害,并采取相应的防治措施。 基于TensorFlowCNN病虫害识别系统可以大大提高病虫害的识别效率和准确性,为植物保护工作提供有力的支持。同时,可以通过不断扩充训练集和优化模型参数,进一步提高系统的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值