精华内容
下载资源
问答
  • 氮肥对不同氮效率水稻品种源库特征的影响,范淑秀,杨青川,以3个氮高效和2个氮低效水稻品种为试材,研究氮肥对其源库特征的影响,结果表明,增施氮肥能够提高不同氮效率水稻品种的产量,不�
  • 不同马铃薯品种叶片SPAD值的变化特征以及归一化指标的建立,陈俊辉,秦永林,由于马铃薯叶片SPAD仪读数因品种而异,因此探索一种适于不同马铃薯品种的SPAD仪氮素营养诊断指标非常必要。本文通过2个试验点、7个�
  • 首次研究了在引入条件下生长于乌兹别克斯坦苏尔肯德里亚地区奥尔廷萨伊地区欧亚油橄榄品种欧亚油橄榄叶,叶柄和果实解剖结构。 确定了以下特征性诊断特征:在叶片中-叶肉背叶类型; 表皮厚壁外壁; 正面...
  • 中国部分山羊品种POU1F1基因分子遗传特征分析,李福勇,张瀚元,利用分子群体遗传学方法研究中国部分山羊品种POU1F1 基因DdeI 位点分子遗传 特征。结果表明,内蒙古白绒山羊(IMWC)、西农萨能奶山羊(Sa)�
  • 大豆品种蛋白质和脂肪含量在主茎上空间分布特征,王英,李景文,本文选用有限、亚有限、无限结荚习性及早熟、中熟两个熟期类型大豆品种作为试验材料,分析大豆品种蛋白质、脂肪含量在不同结荚
  • 水稻种子品种的单粒鉴别对于防止制种时的混杂、掺假现象,保证种子纯度具有重要意义。利用高光谱图像技术研究了水稻种子品种的单粒快速鉴别方法。采集了10类水稻种子在400~1000 nm范围内的高光谱反射图像并提取其光谱...
  • 随着人们生活水平提高,...下面惠农网小编就为大家汇总一些常见宠物仓鼠品种,并简单分析下它们外形特征和性格。1、三线仓鼠简介:三线仓鼠又名加卡利亚仓鼠,是仓鼠中最为普遍类型之一。另外其习性也和大...

    随着人们生活水平的提高,越来越多的人都将休闲娱乐的目光都转向于养宠物身上,而呆萌可爱的仓鼠在宠物市场上受到了广大消费者的欢迎。但仓鼠的品种有很多,很多人在挑选时就会陷入困境,最后只能选个漂亮可爱的,这样可能会大大增加饲养的难度。下面惠农网小编就为大家汇总一些常见的宠物仓鼠品种,并简单分析下它们的外形特征和性格。

    fc5ab09f-0625-eb11-8da9-e4434bdf6706.png

    1、三线仓鼠

    简介:三线仓鼠又名加卡利亚仓鼠,是仓鼠中最为普遍的类型之一。另外其习性也和大多数品种的仓鼠一样,喜欢白天休息,晚上活动。

    原产地:西伯利亚。

    外形特征:三线仓鼠最传统的外表是很灰色的,背上有较深色的三条线。成年的三线仓鼠体长约为8~11cm,体重约为30~45g。但也不是所有三线仓鼠都是如此,如银狐仓鼠和布丁仓鼠等等,其特点就是背部只有有一条线甚至无线(淡化)。

    性格:三线仓鼠是最适合新手的种类,其性格主要表现好奇多动,很容易上手。

    fe5ab09f-0625-eb11-8da9-e4434bdf6706.png

    2、公婆仓鼠

    简介:公婆仓鼠又名罗伯罗夫斯基仓鼠,是宠物仓鼠中体形最小,跑得最快,平均年龄最长的,一般不建议新手饲养。

    原产地:俄罗斯、蒙古、新疆等地。

    外形特征:最明显的特征就是体型小,成年公婆仓鼠体长一般约为4~5cm,体重约为15g~30g。

    性格:胆子极小,容易受到惊吓,因此有小孩的家庭要额外注意。

    ff5ab09f-0625-eb11-8da9-e4434bdf6706.png

    3、熊类仓鼠

    简介:熊类仓鼠又名金丝熊仓鼠,体毛多为黄色,且有短毛,长毛,缎毛,曲卷的波浪毛之分。

    原产地:叙利亚、黎巴嫩、以色列等地。

    外形特征:熊类仓鼠脸部较大,眼睛颜色多为粉色、红色、黑色等。另外,熊类仓鼠量是仓鼠中最多的,体形也是最大的。

    性格:性格较为温顺,平时喜欢憨憨的盯着你讨吃的,较为亲人。但由于体型较大,其咬合力也是比其他仓鼠要打很多,因此切勿做过分的动作引它生气。

    015bb09f-0625-eb11-8da9-e4434bdf6706.png

    以上就是一些宠物仓鼠的品种及相关内容介绍,不知道你们喜欢哪种仓鼠呢?

    展开全文
  • 的品种识别实战(tf2.0)

    万次阅读 多人点赞 2019-10-30 13:46:44
      很容易想到,用猫狗识别的网络肯定过于简单了,因为猫和狗的特征区别较大,所以网络层次不用很深也可以实现,但是同样是狗的种类,可能有的品种之间特征区别较小,所以我们需要更深层的网络来进行特征提取。...

      在深度学习之猫VS狗中,学习了猫和狗识别的分类算法,这能很好的区分猫和狗,那如果我们想做猫的品种识别或者狗的品种识别呢?比如给一只狗的图片,我们想知道它属于斗牛犬,还是柯基,还是中华田园犬?
      很容易想到,用猫狗识别的网络肯定过于简单了,因为猫和狗的特征区别较大,所以网络层次不用很深也可以实现,但是同样是狗的种类,可能有的品种之间特征区别较小,所以我们需要更深层的网络来进行特征提取。所以我感觉用resnet50可能效果会比较好,这篇文章中就使用resnet50结合vgg16来做狗的品种识别。这个模型很强大,训练才7轮,训练集的准确率就有99.27了,验证集的精确率也有66

    注意:文章所用框架为tensorflow2.0,这个框架很简单,适合入门。所以建议先百度安装tensorflow2.0。

      先看下自己百度找了几张图来用模型预测的结果:
    在这里插入图片描述在这里插入图片描述在这里插入图片描述
    在这里插入图片描述在这里插入图片描述

      百度图片来测试,测试完了才知道二哈是个雪橇犬,哈哈哈。测试了五张图有四张正确,柴犬预测错误了。

    文章的构架如下:

    1. 数据获取
    2. 数据处理
    3. 模型导入
    4. 训练与预测
    5. 完整代码

    1. 数据获取

      文章中使用kaggle中的数据集,官方下载地址,百度云网盘下载地址,提取码:xj81 。这个数据集中有120个狗的类别。
      数据集有一个训练集,一个测试集,一个训练集的csv文件,csv文件包含图片名与类别的一一对应。
    在这里插入图片描述
      为了简单起见,文章中只用到了训练集,将训练集拆分为训练集与测试集。所以只需要下载train.zip与label.csv即可。

    2.数据处理

      数据的处理是最麻烦,对新手最不友好的部分,耐心看下去一定会有收获的。

    获取数据列表

      在tensorflow2.0中,我比较习惯将数据做成dataset,很方便导入,并且在换框架(pytorch)时,稍加改动即可使用。
      先看代码,读取csv后,取训练集总数的0.9作为训练,其余的数据做验证。这里需要将label从名字改为序列号(代码中的breeds_map与train_label_list)。

    import os
    
    df_train = pd.read_csv("/content/gdrive/My Drive/dogs_breeds/labels.csv")
    # 列举所有种类,这里的set方法可以做集合,使同一个品种只出现一次。
    breeds_map = list(set(df_train['breed']))
    # breeds_map = ['old_english_sheepdog', ...,'norfolk_terrier', 'silky_terrier', 'cardigan', 'otterhound']
    
    # 生成训练集的名字列表
    filename_list = df_train['id']
    # 将label从名字改为序列号
    label_list = [breeds_map.index(label_name) for label_name in df_train['breed']]
    filename_list = ['/content/gdrive/My Drive/dogs_breeds/train/train/{}.jpg'.format(x) for x in filename_list]
    
    weight_path = os.path.join("gdrive", "My Drive", "dogs_breeds", "weights")+"/"+'mymodel.ckpt'
    

    生成dataset

      先定义读数据的函数preprocess_for_trainpreprocess_for_val
      然后用tensorflow的tf.data.Dataset.from_tensor_slices生成图片名字的dataset,这里不做图片数据的dataset是为了节省内存。用map方法作用读数据的函数,用batch方法设置批量。
      先看代码,其中的tf.io.read_file是读取数据,decode_jpeg是将数据转化为可用的格式,最后 /255.0是为了做归一化,这是最基础的处理,还可以给图片做增强,提高精度。

    def preprocess_for_train(image_path, label):
      # 用tf读图,并做resize,以及归一化
      image_string = tf.io.read_file(image_path)
      image_decoded = tf.image.decode_jpeg(image_string)
      image_resized = tf.image.resize(image_decoded, [224, 224]) / 255.0
    
      return image_resized, label
    
    def preprocess_for_val(image_path, label):
      # 用tf读图,并做resize,以及归一化
      image_string = tf.io.read_file(image_path)
      image_decoded = tf.image.decode_jpeg(image_string)
      image_resized = tf.image.resize(image_decoded, [224, 224]) / 255.0
    
      return image_resized, label 
    
    train_num = int(len(filename_list)*0.9)
    train_dataset = tf.data.Dataset.from_tensor_slices((filename_list[:train_num], label_list[:train_num]))
    tf.random.set_seed(1) # 设置随机种子,以后跑的时候固定数据的顺序
    train_dataset = train_dataset.shuffle(len(filename_list[:train_num])).map(preprocess_for_train).batch(batch_size)
    
    val_dataset = tf.data.Dataset.from_tensor_slices((filename_list[train_num:], label_list[train_num:]))
    tf.random.set_seed(2)
    val_dataset = val_dataset.shuffle(len(filename_list[train_num:])).map(preprocess_for_train).batch(batch_size)
    

    查看数据集

      可以选择25个数据来查看一下我们的数据集。

    # 查看25个狗狗的品种,batchsize设置越大,这里读的越慢,所以这一段可以注释掉。
    for image, label in train_dataset.take(1):
      print(image.shape)
      # 若批量设置大于25的话,取这一批的前25个数据。若小于25,则设置为n*n个。
      n=5
      image, label = image[:n*n], label[:n*n]  
      plt.figure(figsize=(10,10))
      for i in range(n*n):
          plt.subplot(n,n,i+1)
          plt.xticks([])
          plt.yticks([])
          plt.grid(False)
          plt.imshow(image[i], cmap=plt.cm.binary)
          plt.xlabel(breeds_map[label[i]])
      plt.show()
    

    在这里插入图片描述

    3.模型导入

    导入resnet50与vgg16

      前面说了,文章中用到的模型是resnet50与vgg16,这个模型可以直接从tf导入,不用自己编写。
      模型导入可以看另一篇博客。这里就不再叙述,直接调包。

    import tensorflow as tf
    from tensorflow.keras.layers import Dropout, Input, concatenate, GlobalAveragePooling2D, Conv2D, BatchNormalization,MaxPooling2D, Activation, Flatten, Dense
    
    vgg16 = tf.keras.applications.vgg16.VGG16(weights='imagenet', include_top=False, input_tensor=Input(
        shape=(image_shape[0], image_shape[1], 3)), classes=n_class)
    res50 = tf.keras.applications.resnet50.ResNet50(weights='imagenet', include_top=False, input_tensor=Input(
        shape=(image_shape[0], image_shape[1], 3)), classes=n_class)
    

    结合两个模型

    class MyModel(tf.keras.Model):
        def __init__(self, n_class=2):
            super().__init__()
            self.vgg16_model = vgg16
            self.res50_model = res50
            self.global_pool = GlobalAveragePooling2D()
            self.conv_vgg = Dense(512/4, use_bias=False, kernel_initializer='uniform')
            self.conv_res = Dense(2048/4, use_bias=False, kernel_initializer='uniform')
            self.batch_normalize = BatchNormalization()
            self.batch_normalize_res = BatchNormalization()
            self.relu = Activation("relu")
            self.concat = concatenate
            self.dropout_1 = Dropout(0.3)
            self.conv_1 = Dense(640, use_bias=False, kernel_initializer='uniform')
            self.batch_normalize_1 = BatchNormalization()
            self.relu_1 = Activation("relu")
            self.dropout_2 = Dropout(0.5)
            self.classify = Dense(n_class, kernel_initializer='uniform', activation="softmax")
    
    def call(self, input):
          x_vgg16 = self.vgg16_model(input)
          x_vgg16 = self.global_pool(x_vgg16)
          x_vgg16 = self.conv_vgg(x_vgg16)
          x_vgg16 = self.batch_normalize(x_vgg16)
          x_vgg16 = self.relu(x_vgg16)
          x_res50 = self.res50_model(input)
          x_res50 = self.global_pool(x_res50)
          x_res50 = self.conv_res(x_res50)
          x_res50 = self.batch_normalize_res(x_res50)
          x_res50 = self.relu(x_res50)
          x = self.concat([x_vgg16, x_res50])
          x = self.dropout_1(x)
          x = self.conv_1(x)
          x = self.batch_normalize_1(x)
          x = self.relu_1(x)
          x = self.dropout_2(x)
          x = self.classify(x)
    
          return x
    

    4.模型训练与预测

      模型的训练没什么好说的,直接上代码。
      模型compile过程中的loss需要特别注意,不同的loss函数对label有不同的需求,loss函数的输入为预测值与label。预测值是统一的为[0.1,0.4,0.1,0.1…]这样的概率列表,列表的长度为模型的类别数量。有的loss需要label为5这样数字(表示第6类,文章中的loss函数为这一类)。有的loss函数需要 label要为[0,1,0,0,0…](表示第2类)这样的列表。

    import tensorflow as tf
    from tensorflow.keras.callbacks import ModelCheckpoint
    
    model = MyModel(n_class)
    # 加载之前训练过的模型可以加快收敛速度,第一次训练要注释掉。
    # model.load_weights(weight_path)
    
    optimizer = tf.keras.optimizers.SGD(learning_rate=learning_rate, decay=decay_rate)
    
    # 生成checkpoint,这个是保存模型参数的工具,在fit的callbacks中调用
    checkpoint_callback = ModelCheckpoint(
        weight_path, monitor='val_accuracy', verbose=1,
        save_best_only=False, save_weights_only=True,
        save_frequency=1)
    
    model.compile(
        optimizer=optimizer,
        loss=tf.keras.losses.sparse_categorical_crossentropy,
        metrics=[tf.metrics.SparseCategoricalAccuracy()]
    )
    model.fit(train_dataset, validation_data=val_dataset,epochs=num_epochs,callbacks=[checkpoint_callback])
    

    5.完整代码

      因为我是在colab上做代码调试,所以没有做成本地的框架,若感兴趣可以自己调整一下框架。

    import matplotlib.pyplot as plt
    import numpy as np
    import pandas as pd
    import time
    from datetime import timedelta
    import math
    import os
    import scipy.misc
    import PIL.Image
    
    # 读csv
    df_train = pd.read_csv("/content/gdrive/My Drive/dogs_breeds/labels.csv")
    # 列举所有种类
    breeds_map = list(set(df_train['breed']))
    
    ######### 加载数据
    #####读数据
    filename_list = df_train['id']
    # 将label从名字改为序列号
    label_list = [breeds_map.index(label_name) for label_name in df_train['breed']]
    filename_list = ['/content/gdrive/My Drive/dogs_breeds/train/train/{}.jpg'.format(x) for x in filename_list]
    
    
    ##### 生成dataset
    def preprocess_for_train(image_path, label):
      # 用tf读图,并做resize,以及归一化
      image_string = tf.io.read_file(image_path)
      image_decoded = tf.image.decode_jpeg(image_string)
      image_resized = tf.image.resize(image_decoded, [224, 224]) / 255.0
    
      return image_resized, label
    
    def preprocess_for_val(image_path, label):
      # 用tf读图,并做resize,以及归一化
      image_string = tf.io.read_file(image_path)
      image_decoded = tf.image.decode_jpeg(image_string)
      image_resized = tf.image.resize(image_decoded, [224, 224]) / 255.0
    
      return image_resized, label 
    
    # 生成dataset
    train_num = int(len(filename_list)*0.9)
    train_dataset = tf.data.Dataset.from_tensor_slices((filename_list[:train_num], label_list[:train_num]))
    tf.random.set_seed(1) # 设置随机种子,以后跑的时候固定数据的顺序
    train_dataset = train_dataset.shuffle(len(filename_list[:train_num])).map(preprocess_for_train).batch(batch_size)
    
    val_dataset = tf.data.Dataset.from_tensor_slices((filename_list[train_num:], label_list[train_num:]))
    tf.random.set_seed(2)
    val_dataset = val_dataset.shuffle(len(filename_list[train_num:])).map(preprocess_for_train).batch(batch_size)
    
    ######### 数据加载完成
    
    ######## 配置训练参数
    import os
    weight_path = os.path.join("gdrive", "My Drive", "dogs_breeds", "weights")+"/mymodel.ckpt"
    
    num_epochs = 10
    learning_rate = 0.01
    decay_rate = 1e-6 # 学习率衰减,每轮减少学习率的值
    image_shape = (224, 224)
    batch_size=40  #一次训练多少张图,越大越快,但是对系统内存要求越高,报内存错误调低这个值,最小可以到1
    n_class = len(breeds_map)
    print("有{}个种类".format(n_class))
    ######## 配置训练参数完成
    
    ########## 数据查看
    # 查看25个狗狗的品种,batchsize设置越大,这里读的越慢,所以这一段可以注释掉。
    for image, label in train_dataset.take(1):
      print(image.shape)
      # 若批量设置大于25的话,取这一批的前25个数据。若小于25,则设置为n*n个。
      n=5
      image, label = image[:n*n], label[:n*n]  
      plt.figure(figsize=(10,10))
      for i in range(n*n):
          plt.subplot(n,n,i+1)
          plt.xticks([])
          plt.yticks([])
          plt.grid(False)
          plt.imshow(image[i], cmap=plt.cm.binary)
          plt.xlabel(breeds_map[label[i]])
      plt.show()
    #########数据查看部分完成
    
    ########模型生成部分
    #### 模型导入
    vgg16 = tf.keras.applications.vgg16.VGG16(weights='imagenet', include_top=False, input_tensor=Input(
        shape=(image_shape[0], image_shape[1], 3)), classes=n_class)
    res50 = tf.keras.applications.resnet50.ResNet50(weights='imagenet', include_top=False, input_tensor=Input(
        shape=(image_shape[0], image_shape[1], 3)), classes=n_class)
    
    #### 模型组合
    class MyModel(tf.keras.Model):
        def __init__(self, n_class=2):
            super().__init__()
            self.vgg16_model = vgg16
            self.res50_model = res50
            self.global_pool = GlobalAveragePooling2D()
            self.conv_vgg = Dense(512/4, use_bias=False, kernel_initializer='uniform')
            self.conv_res = Dense(2048/4, use_bias=False, kernel_initializer='uniform')
            self.batch_normalize = BatchNormalization()
            self.batch_normalize_res = BatchNormalization()
            self.relu = Activation("relu")
            self.concat = concatenate
            self.dropout_1 = Dropout(0.3)
            self.conv_1 = Dense(640, use_bias=False, kernel_initializer='uniform')
            self.batch_normalize_1 = BatchNormalization()
            self.relu_1 = Activation("relu")
            self.dropout_2 = Dropout(0.3)
            self.classify = Dense(n_class, kernel_initializer='uniform', activation="softmax")
    
        def call(self, input):
          x_vgg16 = self.vgg16_model(input)
          x_vgg16 = self.global_pool(x_vgg16)
          x_vgg16 = self.conv_vgg(x_vgg16)
          x_vgg16 = self.batch_normalize(x_vgg16)
          x_vgg16 = self.relu(x_vgg16)
          x_res50 = self.res50_model(input)
          x_res50 = self.global_pool(x_res50)
          x_res50 = self.conv_res(x_res50)
          x_res50 = self.batch_normalize_res(x_res50)
          x_res50 = self.relu(x_res50)
          x = self.concat([x_vgg16, x_res50])
          x = self.dropout_1(x)
          x = self.conv_1(x)
          x = self.batch_normalize_1(x)
          x = self.relu_1(x)
          x = self.dropout_2(x)
          x = self.classify(x)
    
          return x
    
    ########模型导入部分完成
    
    ######### 模型训练部分
    import tensorflow as tf
    from tensorflow.keras.callbacks import ModelCheckpoint
    
    model = MyModel(n_class)
    # 加载之前训练过的模型可以加快收敛速度,第一次训练需要注释掉
    # model.load_weights(weight_path)
    
    optimizer = tf.keras.optimizers.SGD(learning_rate=learning_rate, decay=decay_rate)
    
    checkpoint_callback = ModelCheckpoint(
        weight_path, monitor='val_accuracy', verbose=1,
        save_best_only=False, save_weights_only=True,
        save_frequency=1)
    
    model.compile(
        optimizer=optimizer,
        loss=tf.keras.losses.sparse_categorical_crossentropy,
        metrics=[tf.metrics.SparseCategoricalAccuracy()]
    )
    model.fit(train_dataset, validation_data=val_dataset,epochs=num_epochs,callbacks=[checkpoint_callback])
    
    ######### 模型训练完成
    

    6.训练结果

      这个模型很强大,训练才7轮,训练集的准确率就有99.27了,验证集的精确率也有66。说明模型有一点过拟合,可以减小模型参数再尝试。
    在这里插入图片描述
      模型预测

    import cv2
    model.load_weights(weight_path+'mymodel_20191113.ckpt')
    image_path = "fadou.png" # 输入的图片路径
    
    
    def preprocess_for_train(image_path):
      # 用tf读图,并做resize,以及归一化
      image_string = tf.io.read_file(image_path)
      image_decoded = tf.image.decode_jpeg(image_string)
      image_resized = tf.image.resize(image_decoded, [224, 224]) / 255.0
      image_resized = tf.expand_dims(image_resized, 0)
    
      return image_resized
    
    
    image = preprocess_for_train(image_path)
    pred = model.predict(image)
    pred = np.argmax(pred)
    y_pred = breeds_map[pred]
    print("预测结果为{}".format(y_pred))
    plt.imshow(image[0], cmap=plt.cm.binary)
    plt.xlabel(image_path.split('.')[0])
    plt.show()
    

    预测结果在文章最前面,测试图片如下:
    柴犬
    二哈
    法斗
    吉娃娃
    金毛

    展开全文
  • 提出了一种用可见-近红外透射光谱技术快速鉴别机油品种的新方法, 应用可见-近红外光谱仪测定三种机油的光谱曲线, 然后用主成分分析法对不同品种的机油样本进行聚类分析, 并获取机油可见-近红外光谱的特征信息, 再...
  • 我们将使用深度学习来训练一个识别狗品种的模型,数据集是狗图像与他们的品种信息,通过学习图像的特征来区分狗的品种。数据分析数据集可以从这里下载...

    在这篇文章中,将教大家实现一个网页应用程序,该程序可以接收狗的图片,然后输出其品种,其准确率超过80%!

    e3e815a710b600a5fff13d17de90fe02.png

    我们将使用深度学习来训练一个识别狗品种的模型,数据集是狗图像与他们的品种信息,通过学习图像的特征来区分狗的品种。

    数据分析

    数据集可以从这里下载(https://s3-us-west-1.amazonaws.com/udacity-aind/dog-project/dogImages.zip)。以下是关于数据的一些介绍:

    犬种总数:133

    狗图片总数:8351(训练集:6680,验证集:835,测试集:836)

    最受欢迎的品种:阿拉斯加对应96个样本,博德牧羊犬对应93个样本

    按图片数量排序的前30个品种如下:

    b4dbda9f66b802436ca436092ab48cbe.png

    我们还可以在这里看到一些狗的图片和它们的品种:

    e2ea780133b4935cad235f55281e2379.png

    数据预处理

    我们会把每个图像作为一个numpy数组进行加载,并将它们的大小调整为224x224,这是大多数传统神经网络接受图像的默认大小,另外我们为图像的数量添加为另一个维度。

    from keras.preprocessing import image

    from tqdm import tqdm

    def path_to_tensor(img_path):

    '''将给定路径下的图像转换为张量'''

    img = image.load_img(img_path, target_size=(224, 224))

    x = image.img_to_array(img)

    return np.expand_dims(x, axis=0)

    def paths_to_tensor(img_paths):

    '''将给定路径中的所有图像转换为张量'''

    list_of_tensors = [path_to_tensor(img_path) for img_path in tqdm(img_paths)]

    return np.vstack(list_of_tensors)

    最后,我们使用ImageDataGenerator对图像进行动态缩放和增强

    train_datagen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255,

    horizontal_flip=True,

    vertical_flip=True,

    rotation_range=20)

    valid_datagen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255.)

    test_datagen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255.)

    train_generator = train_datagen.flow(train_tensors, train_targets, batch_size=32)

    valid_generator = train_datagen.flow(valid_tensors, valid_targets, batch_size=32)

    test_generator = train_datagen.flow(test_tensors, test_targets, batch_size=32)

    CNN

    我们将在预处理数据集上从头开始训练卷积神经网络(CNN),如下所示:

    model = tf.keras.models.Sequential([

    tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(224, 224, 3)),

    tf.keras.layers.MaxPooling2D(2, 2),

    tf.keras.layers.Conv2D(32, (3,3), activation='relu'),

    tf.keras.layers.MaxPooling2D(2,2),

    tf.keras.layers.Conv2D(64, (3,3), activation='relu'),

    tf.keras.layers.MaxPooling2D(2,2),

    tf.keras.layers.Conv2D(128, (3,3), activation='relu'),

    tf.keras.layers.MaxPooling2D(2,2),

    tf.keras.layers.Conv2D(256, (3,3), activation='relu'),

    tf.keras.layers.MaxPooling2D(2,2),

    tf.keras.layers.Flatten(),

    tf.keras.layers.Dense(2048, activation='softmax'),

    tf.keras.layers.Dropout(0.5),

    tf.keras.layers.Dense(1024, activation='softmax'),

    tf.keras.layers.Dropout(0.5),

    tf.keras.layers.Dense(133, activation='softmax')

    ])

    model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])

    checkpointer = tf.keras.callbacks.ModelCheckpoint(filepath='../saved_models/weights_best_custom.hdf5',

    verbose=1, save_best_only=True)

    model.fit(train_generator, epochs=5, validation_data=valid_generator, callbacks=[checkpointer])

    我们使用一个ModelCheckpoint的回调来保存验证分数较高的模型。通过测试模型,我们得到的准确率只有1%左右

    **使用迁移学习**

    现在,我们使用迁移学习来实现更高的准确率。首先我们下载ResNet-50,可以通过运行下面的代码来提取相应的训练集、测试和验证集:

    bottleneck_features = np.load('Data/bottleneck_features/DogResnet50Data.npz')

    train_Resnet50 = bottleneck_features['train']

    valid_Resnet50 = bottleneck_features['valid']

    test_Resnet50 = bottleneck_features['test']

    我们现在再次定义模型,并对提取的特征使用GlobalAveragePooling2D,它将一组特征平均为一个值。最后,如果验证损失在两个连续的epoch内没有增加,我们使用额外的回调来降低学习率;如果验证损失在连续的5个epoch内没有增加,可以提前停止训练。

    Resnet50_model = tf.keras.models.Sequential()

    Resnet50_model.add(tf.keras.layers.GlobalAveragePooling2D(input_shape=train_Resnet50.shape[1:]))

    Resnet50_model.add(tf.keras.layers.Dense(1024, activation='relu'))

    Resnet50_model.add(tf.keras.layers.Dense(133, activation='softmax'))

    Resnet50_model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])

    checkpointer = tf.keras.callbacks.ModelCheckpoint(filepath='saved_models/weights_best_Resnet50.hdf5',

    verbose=1, save_best_only=True)

    early_stopping = tf.keras.callbacks.EarlyStopping(patience=5, monitor='val_loss')

    reduce_lr = tf.keras.callbacks.ReduceLROnPlateau(patience=2, monitor='val_loss')

    Resnet50_model.fit(train_Resnet50, train_targets,

    validation_data=(valid_Resnet50, valid_targets),

    epochs=50, batch_size=20, callbacks=[checkpointer, early_stopping, reduce_lr], verbose=1)### 训练模型

    最后在测试集上的准确率为82.65%,这与我们白手起家训练的模型相比,是一个巨大的进步。

    **构建web应用程序**

    对于web应用程序,我们首先编写了一个helper函数,该函数接受图像路径并返回品种。label_to_cat字典将每个数字标签映射到它的狗品种。

    def predict_breed(img_path):

    '''预测给定图像的品种'''

    提取特征

    bottleneck_feature = extract_Resnet50(path_to_tensor(img_path))

    bottleneck_feature = tf.keras.models.Sequential([

    tf.keras.layers.GlobalAveragePooling2D(input_shape=bottleneck_feature.shape[1:])

    ]).predict(bottleneck_feature).reshape(1, 1, 1, 2048)

    # 获得预测向量

    predicted_vector = Resnet50_model.predict(bottleneck_feature)

    # 模型预测的犬种

    return label_to_cat[np.argmax(predicted_vector)]

    对于web应用程序,我们将使用flaskweb框架来帮助我们用最少的代码创建web应用程序。我们定义一个接受图像的路由,并用狗的品种呈现一个输出模板

    @app.route('/upload', methods=['POST','GET'])

    def upload_file():

    if request.method == 'GET':

    return render_template('index.html')

    else:

    file = request.files['image']

    full_name = os.path.join(UPLOAD_FOLDER, file.filename)

    file.save(full_name)

    dog_breed = dog_breed_classifier(full_name)

    return render_template('predict.html', image_file_name = file.filename, label = dog_breed)

    predict.html是分别显示图像及其犬种的模板。

    **结论**

    祝贺你!你已经成功地实现了一个狗品种分类器,并且可以准确地分辨出狗的品种。让我们总结一下我们在这里学到的知识:

    1. 我们对数据集进行了分析和预处理。机器学习算法需要单独的训练集、测试集和验证集来进行置信预测。

    1. 我们从零开始使用CNN,由于未能提取特征,所以表现不佳。

    1. 然后我们使用了迁移学习,准确度大大提高

    1. 最后,我们构建了一个Flask web应用程序来实现我们的项目封装

    我们确实学到了很多东西,但你还可以尝试很多其他的事情。你可以在heroku上部署web应用程序,也可以尝试使用不同的层(如Dropout层)来提高准确性。

    参考链接:https://towardsdatascience.com/dont-know-the-breed-of-your-dog-ml-can-help-6558eb5f7f05

    展开全文
  • 提供好的特征是机器学习任务中最重要的工作,那么何为优秀的机器学习特征?以及如何高效地组合这些特征? 以二分类问题为例,好的特征具有很好的区分性。例如学习任务是区分两种不同类型的狗:灰猎犬(Greyhound)...

    提供好的特征是机器学习任务中最重要的工作,那么何为优秀的机器学习特征?以及如何高效地组合这些特征?

    以二分类问题为例,好的特征具有很好的区分性。例如学习任务是区分两种不同类型的狗:灰猎犬(Greyhound)和拉布拉多犬(Labrador)。假设有身高和眼睛的颜色两种特征。一般而言,灰猎犬的平均身高要比拉布拉多犬要高一些,而狗的眼睛的颜色不取决于够的品种,因此可以认为“身高”这个特征就比“眼睛颜色”这个特征更有用,因为“眼睛颜色”这个特征没有告诉我们任何信息。

    灰猎犬和拉布拉多犬

    虽然灰猎犬的平均身高要比拉布拉多犬要高一些,但并不是说所有灰猎犬的身高都要比拉布拉多犬要高,那么为什么“身高”是一个有用的特征呢?假设在一个数据集D上两种类型的狗的身高分布如下图所示,其中红色表示灰猎犬,蓝色表示比拉布拉多犬。在这个数据集D上灰猎犬和拉布拉多犬各有500值,平均身高分别为28英寸和24英寸。

    身高

    现在我们需要断定在特定的身高每种狗的概率分布。现假设有一批身高为20英寸的狗,我们该如何预测这批狗的品种,使得我们的预测错误率最低呢?根据上面的图,我们判断这批狗中的大部分可能是拉布拉多犬。同样,看图的靠右侧的柱状图,比如35英寸的身高的狗我们有信心认为其是灰猎犬。25英寸高的狗呢?这个时候我们就很难判断其是什么品种了。综上,身高是一个有用的特征,但它并不完美。一般而言,机器学习任务都很难只需要单一的特征。这就是为什么在机器学习任务里我们需要多种特征,否则就不需要机器学习算法,而只需要写if else语句就够了。Features capture different types of information。

    假设一个特征的取值在二分类任务的正例和反例中各占大概一半的比例,那么这样的特征是没有用的,比如上面例子中的狗的眼睛颜色。无用的特征会降低分类器的准确率,特别是在样本数量较少的情况下。

    由于不同类型的特征还应该包含不同类型的信息,这样才能够起到互相补充的作用。也就是说应该避免冗余的特征。比如“单位为英寸的身高”和“单位和厘米的身高”两个特征之间并不是相互独立的,只是同一个属性的2种不同维度的测试数据而已,因此这2个特征只要保留其中一个就可以了。应该删除与已有特征高度密切相关的特征。

    最后,好的特征还应该是易于理解的。比如要预测从一个城市寄一封信去另一个城市需要多长时间可以到达,一个易于理解的特征的例子是这2座城市之间的距离;一个不易于理解的特征组合是这2个城市各种的经纬度信息。因为简单的关系更加易于学习,复杂的关系则需要更多的训练数据,因此更难被学习出来。

    总结

    • 避免无用的特征(avoid useless features)
    • 避免冗余的特征(avoid redundant features)
    • 使用易于理解的简单特征(good features should easy to understand)

    好的特征具有如下的特点:

    • 有区分性(Informative)
    • 特征之间相互独立(Independent)
    • 简单易于理解(Simple)

    转载于:https://www.cnblogs.com/end/p/10795547.html

    展开全文
  • 后代形态特征,例如颜色,叶片数目和长度,与BB#1不同。 与BB#1相比,Spring作物子代抽bolt时间很晚,因此可以在Spring长成。 花粉母细胞在前期基因组原位杂交分析确定了19个二价体,其中10个来自芸苔属,...
  • 使用深度学习识别狗的品种

    千次阅读 多人点赞 2020-09-13 00:45:52
    我们将使用深度学习来训练一个模型的数据集的狗图像与他们的品种,以学习的特征来区分每一个品种。 数据分析 数据集可以从这里下载(https://s3-us-west-1.amazonaws.com/udacity-aind/dog-project/dogImages.zip)...
  • 基于面板数据模型的产业能源消费特征分析,江鹤,崔巍,分析各产业对于不同能源品种的消费特征,从而确定产业结构调整方向,促进能源消费结构转变,以及控制能源消费量。以大连工业产业
  • 基于SVM+HOG花生品种识别

    千次阅读 2015-01-19 21:30:13
    早在大二时,导师做过一个花生品种识别的程序,但当时用于品种识别的特征是自定义特征;而我的当初的本科毕业设计则是基于SVM + HOG的人脸识别;在后来的工作学习中,又用到了HOG特征,想着是不是之前的花生品种的...
  • 基于形貌特征的常规鉴别牡丹花品种方法主观性强且缺乏化学信息,运用傅里叶变换红外光谱(FTIR)技术结合主成分分析(PCA)来鉴别不同品种的牡丹花。各牡丹花品种的红外光谱整体上比较相似,主要由蛋白质、酚类、脂...
  • 为实现对红枣品种的判别,利用高光谱技术并结合机器学习算法对金丝大枣、骏枣和滩枣这三个品种的新疆红枣进行研究。首先,分别利用多元散射校正(MSC)、标准正态变量变换(SNV)、一阶导(1-Der)和Savitzky-Golay(SG)平滑...
  • “渭香一号”的特征特性及栽培技术要点,李鸣雷,梁连友,本文系统介绍了香菇新品种“渭香一号”的形态特征、营养条件以及生长所需要的环境因子,详细论述了在渭北旱原应用“渭香一号”香
  • 在提取激光诱导击穿光谱(LIBS)全部特征峰的基础上, 利用支持向量机建立了有效的茶叶分类模型。... 对同一种类中不同品种的茶叶也实现了较好的识别。研究结果表明, LIBS在茶叶品种快速识别应用中具有较好的前景。
  • 水稻早衰突变体esr1生理特征及精细定位,崔旭昕,黄溪,本研究利用水稻早衰突变体esr1进行水稻叶片衰老过程中生理特征的变化以及基因精细定位研究。esr1突变体为经EMS诱变处理粳稻品种H
  • SOFATT(仅播种,然后稀疏)的方法,该方法是从间隔种植(行间和行内间隔为30±12 cm)的多个品种中取样的多个植物中确定平均穗数的植株1,建议适当评估小麦品种的分till习性。 育种者和研究人员可以使用SOFATT评估...
  • 本文来自玉雕名家官网和田白玉是和田玉众多种类中一个重要品种,在玉石市场上大多数人都偏向于购买和田白玉玉饰品来佩戴,比如和田白玉手镯、吊坠等等。众所周知,和田玉颜色有很多,不同颜色和田玉,其特征...
  • 小麦高矮秆混作对产量和群体特征的影响,纪伟,丁传艳,通过高矮不同小麦品种混作来塑造更为合理冠层结构,设置了三种组合和两种混合比例,分别在春浇一水和春浇两水条件下考察产
  • 两个品种的主要生活史特征均无显着性差异(P> 0.05)。 但是,来自阿尔蒂希玛种子的第一代个体显着更大(男性和女性分别为P = 0.0007和P <0.0001),并且比其他玫瑰茄品种的个体更重(P <0.0001)。 该结果...
  • 本文旨在利用GC(10)脂肪酸特征来表征10个核桃(Juglans regia L.)品种(Bilecik,Chandler,Hartley,Howard,Maras 12,Maras 18,Midland,Pedro,Sen和Serr)。气相色谱法),生育酚及其异构体高效液相...
  • 长期遮荫对小麦籽粒淀粉粒粒级分布特征的影响,张传辉,姜东,研究长期遮荫对小麦胚乳淀粉粒粒度分布特征的影响。选用扬麦11和扬麦158两个冬小麦(Triticum aestivum L.)品种为材料,测定成熟期胚乳�
  • 不同水分条件下高产水稻与节水抗旱稻群体性状特征,万静,王凯,本研究于2011和2012年在湖北武穴以高产水稻品种黄华占、扬两优6号和节水抗旱水稻品种旱优5919、旱优3号以及新育成水稻品种金科优938为�
  • 不同年代小麦籽粒淀粉粒粒度分布演变特征,张传辉,蔡剑,本研究测定了我国50年代到90年代32个普通小麦品种籽粒淀粉粒粒度分布和组分含量,并比较了它们之间差异和相关性。研究表明,淀粉

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 495
精华内容 198
关键字:

品种的特征