目录

  • 版本更新
  • TPU or GPU detection
  • Configurations
  • Helper Functions
    • 1. Visualization Functions
    • 2. Datasets Functions
    • 3. Model Functions
  • Dataset visualizations
  • Training Model
    • 1. Load Model into TPU
    • 2. Training
    • 3. Confusion matrix
  • Predictions
  • Visual validation

版本更新

以下准确率全都是验证集准确率,和比赛提交以后的准确率有1%-5%的差距,因为算法不一样

V1:官方给出的代码,准确率40%
V2-V8:不断增删层,并调超参数,更换损失函数与优化器 准确率增长到60%就遇到瓶颈了
V9:尝试通过仅在5分钟内训练softmax层来预热,然后再释放所有重量。准确率下降到50%
V10:更多数据扩充 准确率55%
V11:使用LR Scheduler 准确率62%
V12:同时使用训练和验证数据来训练模型。 准确率68%
V13;使用谷歌开源新模型 EfficientNetB7 准确率91%,害怕
V14:训练更长的时间(25个轮次)。准确率82%,下降了,是因为过拟合吧
V15:回到20个轮次; Global Max Pooling instead of Average。(全局最大池而不是平均。) 准确率67%,不适合
V16:回滚到global average pooling (全局平均池) 准确率81%
V18:回滚到V13,并调节部分参数 准确率99.9%,恐怖如斯,我好无敌

!pip install -q efficientnet
import math, re, os
import tensorflow as tf
import numpy as np
from matplotlib import pyplot as plt
from kaggle_datasets import KaggleDatasets
import efficientnet.tfkeras as efn
from sklearn.metrics import f1_score, precision_score, recall_score, confusion_matrixprint("Tensorflow version " + tf.__version__)

TPU or GPU detection

# Detect hardware, return appropriate distribution strategy
# try:
#     tpu = tf.distribute.cluster_resolver.TPUClusterResolver()  # TPU detection. No parameters necessary if TPU_NAME environment variable is set. On Kaggle this is always the case.
#     print('Running on TPU ', tpu.master())
# except ValueError:
#     tpu = None# if tpu:
#     tf.config.experimental_connect_to_cluster(tpu)
#     tf.tpu.experimental.initialize_tpu_system(tpu)
#     strategy = tf.distribute.experimental.TPUStrategy(tpu)
# else:
#     strategy = tf.distribute.get_strategy() # default distribution strategy in Tensorflow. Works on CPU and single GPU.# print("REPLICAS: ", strategy.num_replicas_in_sync)

Configurations

AUTO = tf.data.experimental.AUTOTUNE# Create strategy from tpu
tpu = tf.distribute.cluster_resolver.TPUClusterResolver()
tf.config.experimental_connect_to_cluster(tpu)
tf.tpu.experimental.initialize_tpu_system(tpu)
strategy = tf.distribute.experimental.TPUStrategy(tpu)# Competition data access
# TPUs read data directly from Google Cloud Storage (GCS).
# This Kaggle utility will copy the dataset to a GCS bucket co-located with the TPU.
# If you have multiple datasets attached to the notebook,
# you can pass the name of a specific dataset to the get_gcs_path function.
# The name of the dataset is the name of the directory it is mounted in.
# Use !ls /kaggle/input/ to list attached datasets.
GCS_DS_PATH = KaggleDatasets().get_gcs_path()# Configuration
IMAGE_SIZE = [512, 512]
EPOCHS = 20
BATCH_SIZE = 16 * strategy.num_replicas_in_sync
GCS_PATH_SELECT = { # available image sizes192: GCS_DS_PATH + '/tfrecords-jpeg-192x192',224: GCS_DS_PATH + '/tfrecords-jpeg-224x224',331: GCS_DS_PATH + '/tfrecords-jpeg-331x331',512: GCS_DS_PATH + '/tfrecords-jpeg-512x512'
}
GCS_PATH = GCS_PATH_SELECT[IMAGE_SIZE[0]]TRAINING_FILENAMES = tf.io.gfile.glob(GCS_PATH + '/train/*.tfrec')
VALIDATION_FILENAMES = tf.io.gfile.glob(GCS_PATH + '/val/*.tfrec')
TEST_FILENAMES = tf.io.gfile.glob(GCS_PATH + '/test/*.tfrec') # predictions on this dataset should be submitted for the competition

Unhide to see CLASSES:

CLASSES = ['pink primrose',    'hard-leaved pocket orchid', 'canterbury bells', 'sweet pea',     'wild geranium',     'tiger lily',           'moon orchid',              'bird of paradise', 'monkshood',        'globe thistle',         # 00 - 09'snapdragon',       "colt's foot",               'king protea',      'spear thistle', 'yellow iris',       'globe-flower',         'purple coneflower',        'peruvian lily',    'balloon flower',   'giant white arum lily', # 10 - 19'fire lily',        'pincushion flower',         'fritillary',       'red ginger',    'grape hyacinth',    'corn poppy',           'prince of wales feathers', 'stemless gentian', 'artichoke',        'sweet william',         # 20 - 29'carnation',        'garden phlox',              'love in the mist', 'cosmos',        'alpine sea holly',  'ruby-lipped cattleya', 'cape flower',              'great masterwort', 'siam tulip',       'lenten rose',           # 30 - 39'barberton daisy',  'daffodil',                  'sword lily',       'poinsettia',    'bolero deep blue',  'wallflower',           'marigold',                 'buttercup',        'daisy',            'common dandelion',      # 40 - 49'petunia',          'wild pansy',                'primula',          'sunflower',     'lilac hibiscus',    'bishop of llandaff',   'gaura',                    'geranium',         'orange dahlia',    'pink-yellow dahlia',    # 50 - 59'cautleya spicata', 'japanese anemone',          'black-eyed susan', 'silverbush',    'californian poppy', 'osteospermum',         'spring crocus',            'iris',             'windflower',       'tree poppy',            # 60 - 69'gazania',          'azalea',                    'water lily',       'rose',          'thorn apple',       'morning glory',        'passion flower',           'lotus',            'toad lily',        'anthurium',             # 70 - 79'frangipani',       'clematis',                  'hibiscus',         'columbine',     'desert-rose',       'tree mallow',          'magnolia',                 'cyclamen ',        'watercress',       'canna lily',            # 80 - 89'hippeastrum ',     'bee balm',                  'pink quill',       'foxglove',      'bougainvillea',     'camellia',             'mallow',                   'mexican petunia',  'bromelia',         'blanket flower',        # 90 - 99'trumpet creeper',  'blackberry lily',           'common tulip',     'wild rose']                                                                                                                                               # 100 - 102

Helper Functions

1. Visualization Functions

def display_training_curves(training, validation, title, subplot):if subplot%10==1: # set up the subplots on the first callplt.subplots(figsize=(10,10), facecolor='#F0F0F0')plt.tight_layout()ax = plt.subplot(subplot)ax.set_facecolor('#F8F8F8')ax.plot(training)ax.plot(validation)ax.set_title('model '+ title)ax.set_ylabel(title)#ax.set_ylim(0.28,1.05)ax.set_xlabel('epoch')ax.legend(['train', 'valid.'])
# numpy and matplotlib defaults
np.set_printoptions(threshold=15, linewidth=80)def batch_to_numpy_images_and_labels(data):images, labels = datanumpy_images = images.numpy()numpy_labels = labels.numpy()if numpy_labels.dtype == object: # binary string in this case, these are image ID stringsnumpy_labels = [None for _ in enumerate(numpy_images)]# If no labels, only image IDs, return None for labels (this is the case for test data)return numpy_images, numpy_labelsdef title_from_label_and_target(label, correct_label):if correct_label is None:return CLASSES[label], Truecorrect = (label == correct_label)return "{} [{}{}{}]".format(CLASSES[label], 'OK' if correct else 'NO', u"\u2192" if not correct else '',CLASSES[correct_label] if not correct else ''), correctdef display_one_flower(image, title, subplot, red=False, titlesize=16):plt.subplot(*subplot)plt.axis('off')plt.imshow(image)if len(title) > 0:plt.title(title, fontsize=int(titlesize) if not red else int(titlesize/1.2), color='red' if red else 'black', fontdict={'verticalalignment':'center'}, pad=int(titlesize/1.5))return (subplot[0], subplot[1], subplot[2]+1)def display_batch_of_images(databatch, predictions=None):"""This will work with:display_batch_of_images(images)display_batch_of_images(images, predictions)display_batch_of_images((images, labels))display_batch_of_images((images, labels), predictions)"""# dataimages, labels = batch_to_numpy_images_and_labels(databatch)if labels is None:labels = [None for _ in enumerate(images)]# auto-squaring: this will drop data that does not fit into square or square-ish rectanglerows = int(math.sqrt(len(images)))cols = len(images)//rows# size and spacingFIGSIZE = 13.0SPACING = 0.1subplot=(rows,cols,1)if rows < cols:plt.figure(figsize=(FIGSIZE,FIGSIZE/cols*rows))else:plt.figure(figsize=(FIGSIZE/rows*cols,FIGSIZE))# displayfor i, (image, label) in enumerate(zip(images[:rows*cols], labels[:rows*cols])):title = '' if label is None else CLASSES[label]correct = Trueif predictions is not None:title, correct = title_from_label_and_target(predictions[i], label)dynamic_titlesize = FIGSIZE*SPACING/max(rows,cols)*40+3 # magic formula tested to work from 1x1 to 10x10 imagessubplot = display_one_flower(image, title, subplot, not correct, titlesize=dynamic_titlesize)#layoutplt.tight_layout()if label is None and predictions is None:plt.subplots_adjust(wspace=0, hspace=0)else:plt.subplots_adjust(wspace=SPACING, hspace=SPACING)plt.show()def display_confusion_matrix(cmat, score, precision, recall):plt.figure(figsize=(15,15))ax = plt.gca()ax.matshow(cmat, cmap='Reds')ax.set_xticks(range(len(CLASSES)))ax.set_xticklabels(CLASSES, fontdict={'fontsize': 7})plt.setp(ax.get_xticklabels(), rotation=45, ha="left", rotation_mode="anchor")ax.set_yticks(range(len(CLASSES)))ax.set_yticklabels(CLASSES, fontdict={'fontsize': 7})plt.setp(ax.get_yticklabels(), rotation=45, ha="right", rotation_mode="anchor")titlestring = ""if score is not None:titlestring += 'f1 = {:.3f} '.format(score)if precision is not None:titlestring += '\nprecision = {:.3f} '.format(precision)if recall is not None:titlestring += '\nrecall = {:.3f} '.format(recall)if len(titlestring) > 0:ax.text(101, 1, titlestring, fontdict={'fontsize': 18, 'horizontalalignment':'right', 'verticalalignment':'top', 'color':'#804040'})plt.show()def display_training_curves(training, validation, title, subplot):if subplot%10==1: # set up the subplots on the first callplt.subplots(figsize=(10,10), facecolor='#F0F0F0')plt.tight_layout()ax = plt.subplot(subplot)ax.set_facecolor('#F8F8F8')ax.plot(training)ax.plot(validation)ax.set_title('model '+ title)ax.set_ylabel(title)#ax.set_ylim(0.28,1.05)ax.set_xlabel('epoch')ax.legend(['train', 'valid.'])

2. Datasets Functions

def decode_image(image_data):image = tf.image.decode_jpeg(image_data, channels=3)image = tf.cast(image, tf.float32) / 255.0  # convert image to floats in [0, 1] rangeimage = tf.reshape(image, [*IMAGE_SIZE, 3]) # explicit size needed for TPUreturn imagedef read_labeled_tfrecord(example):LABELED_TFREC_FORMAT = {"image": tf.io.FixedLenFeature([], tf.string), # tf.string means bytestring"class": tf.io.FixedLenFeature([], tf.int64),  # shape [] means single element}example = tf.io.parse_single_example(example, LABELED_TFREC_FORMAT)image = decode_image(example['image'])label = tf.cast(example['class'], tf.int32)return image, label # returns a dataset of (image, label) pairsdef read_unlabeled_tfrecord(example):UNLABELED_TFREC_FORMAT = {"image": tf.io.FixedLenFeature([], tf.string), # tf.string means bytestring"id": tf.io.FixedLenFeature([], tf.string),  # shape [] means single element# class is missing, this competitions's challenge is to predict flower classes for the test dataset}example = tf.io.parse_single_example(example, UNLABELED_TFREC_FORMAT)image = decode_image(example['image'])idnum = example['id']return image, idnum # returns a dataset of image(s)def load_dataset(filenames, labeled=True, ordered=False):# Read from TFRecords. For optimal performance, reading from multiple files at once and# disregarding data order. Order does not matter since we will be shuffling the data anyway.ignore_order = tf.data.Options()if not ordered:ignore_order.experimental_deterministic = False # disable order, increase speeddataset = tf.data.TFRecordDataset(filenames, num_parallel_reads=AUTO) # automatically interleaves reads from multiple filesdataset = dataset.with_options(ignore_order) # uses data as soon as it streams in, rather than in its original orderdataset = dataset.map(read_labeled_tfrecord if labeled else read_unlabeled_tfrecord, num_parallel_calls=AUTO)# returns a dataset of (image, label) pairs if labeled=True or (image, id) pairs if labeled=Falsereturn datasetdef data_augment(image, label, seed=2020):# data augmentation. Thanks to the dataset.prefetch(AUTO) statement in the next function (below),# this happens essentially for free on TPU. Data pipeline code is executed on the "CPU" part# of the TPU while the TPU itself is computing gradients.image = tf.image.random_flip_left_right(image, seed=seed)
#     image = tf.image.random_flip_up_down(image, seed=seed)
#     image = tf.image.random_brightness(image, 0.1, seed=seed)#     image = tf.image.random_jpeg_quality(image, 85, 100, seed=seed)
#     image = tf.image.resize(image, [530, 530])
#     image = tf.image.random_crop(image, [512, 512], seed=seed)#image = tf.image.random_saturation(image, 0, 2)return image, label   def get_training_dataset():dataset = load_dataset(TRAINING_FILENAMES, labeled=True)dataset = dataset.map(data_augment, num_parallel_calls=AUTO)dataset = dataset.repeat() # the training dataset must repeat for several epochsdataset = dataset.shuffle(2048)dataset = dataset.batch(BATCH_SIZE)dataset = dataset.prefetch(AUTO) # prefetch next batch while training (autotune prefetch buffer size)return datasetdef get_validation_dataset(ordered=False):dataset = load_dataset(VALIDATION_FILENAMES, labeled=True, ordered=ordered)dataset = dataset.batch(BATCH_SIZE)dataset = dataset.cache()dataset = dataset.prefetch(AUTO) # prefetch next batch while training (autotune prefetch buffer size)return datasetdef get_train_valid_datasets():dataset = load_dataset(TRAINING_FILENAMES + VALIDATION_FILENAMES, labeled=True)dataset = dataset.map(data_augment, num_parallel_calls=AUTO)dataset = dataset.repeat() # the training dataset must repeat for several epochsdataset = dataset.shuffle(2048)dataset = dataset.batch(BATCH_SIZE)dataset = dataset.prefetch(AUTO) # prefetch next batch while training (autotune prefetch buffer size)return datasetdef get_test_dataset(ordered=False):dataset = load_dataset(TEST_FILENAMES, labeled=False, ordered=ordered)dataset = dataset.batch(BATCH_SIZE)dataset = dataset.prefetch(AUTO) # prefetch next batch while training (autotune prefetch buffer size)return datasetdef count_data_items(filenames):# the number of data items is written in the name of the .tfrec files, i.e. flowers00-230.tfrec = 230 data itemsn = [int(re.compile(r"-([0-9]*)\.").search(filename).group(1)) for filename in filenames]return np.sum(n)

3. Model Functions

def lrfn(epoch):LR_START = 0.00001LR_MAX = 0.00005 * strategy.num_replicas_in_syncLR_MIN = 0.00001LR_RAMPUP_EPOCHS = 5LR_SUSTAIN_EPOCHS = 0LR_EXP_DECAY = .8if epoch < LR_RAMPUP_EPOCHS:lr = (LR_MAX - LR_START) / LR_RAMPUP_EPOCHS * epoch + LR_STARTelif epoch < LR_RAMPUP_EPOCHS + LR_SUSTAIN_EPOCHS:lr = LR_MAXelse:lr = (LR_MAX - LR_MIN) * LR_EXP_DECAY**(epoch - LR_RAMPUP_EPOCHS - LR_SUSTAIN_EPOCHS) + LR_MINreturn lr
def freeze(model):for layer in model.layers:layer.trainable = Falsedef unfreeze(model):for layer in model.layers:layer.trainable = True

Dataset visualizations

# data dump
print("Training data shapes:")
for image, label in get_training_dataset().take(3):print(image.numpy().shape, label.numpy().shape)
print("Training data label examples:", label.numpy())
print("Validation data shapes:")
for image, label in get_validation_dataset().take(3):print(image.numpy().shape, label.numpy().shape)
print("Validation data label examples:", label.numpy())
print("Test data shapes:")
for image, idnum in get_test_dataset().take(3):print(image.numpy().shape, idnum.numpy().shape)
print("Test data IDs:", idnum.numpy().astype('U')) # U=unicode string
# Peek at training data
training_dataset = get_training_dataset()
training_dataset = training_dataset.unbatch().batch(20)
train_batch = iter(training_dataset)
# run this cell again for next set of images
display_batch_of_images(next(train_batch))

# peer at test data
test_dataset = get_test_dataset()
test_dataset = test_dataset.unbatch().batch(20)
test_batch = iter(test_dataset)
# run this cell again for next set of images
display_batch_of_images(next(test_batch))

Training Model

NUM_TRAINING_IMAGES = count_data_items(TRAINING_FILENAMES)
NUM_VALIDATION_IMAGES = count_data_items(VALIDATION_FILENAMES)
NUM_TEST_IMAGES = count_data_items(TEST_FILENAMES)
STEPS_PER_EPOCH = NUM_TRAINING_IMAGES // BATCH_SIZE
print('Dataset: {} training images, {} validation images, {} unlabeled test images'.format(NUM_TRAINING_IMAGES, NUM_VALIDATION_IMAGES, NUM_TEST_IMAGES))

1. Load Model into TPU

# Need this line so Google will recite some incantations
# for Turing to magically load the model onto the TPU
with strategy.scope():enet = efn.EfficientNetB7(input_shape=(512, 512, 3),weights='imagenet',include_top=False)model = tf.keras.Sequential([enet,tf.keras.layers.GlobalAveragePooling2D(),tf.keras.layers.Dense(len(CLASSES), activation='softmax')])model.compile(optimizer=tf.keras.optimizers.Adam(),loss = 'sparse_categorical_crossentropy',metrics=['sparse_categorical_accuracy'])model.summary()

保存全模型

可以对整个模型进行保存,其保存的内容包括:

  1. 该模型的架构
  2. 模型的权重(在训练期间学到的)
  3. 模型的训练配置(你传递给编译的),如果有的话
  4. 优化器及其状态(如果有的话)(这使您可以从中断的地方重新启动训练
model.save('the_save_model.h5') #保存全模型

2. Training

# scheduler = tf.keras.callbacks.ReduceLROnPlateau(patience=3, verbose=1)
lr_schedule = tf.keras.callbacks.LearningRateScheduler(lrfn, verbose=1)history = model.fit(get_train_valid_datasets(), steps_per_epoch=STEPS_PER_EPOCH,epochs=EPOCHS, callbacks=[lr_schedule],validation_data=get_validation_dataset()
)
history.history.keys()
display_training_curves(history.history['loss'], history.history['val_loss'], 'loss', 211)
display_training_curves(history.history['sparse_categorical_accuracy'], history.history['val_sparse_categorical_accuracy'], 'accuracy', 212)
# display_training_curves(history.history['loss'], history.history['loss'], 'loss', 211)
# display_training_curves(history.history['sparse_categorical_accuracy'], history.history['sparse_categorical_accuracy'], 'accuracy', 212)

3. Confusion matrix

cmdataset = get_validation_dataset(ordered=True) # since we are splitting the dataset and iterating separately on images and labels, order matters.
images_ds = cmdataset.map(lambda image, label: image)
labels_ds = cmdataset.map(lambda image, label: label).unbatch()
cm_correct_labels = next(iter(labels_ds.batch(NUM_VALIDATION_IMAGES))).numpy() # get everything as one batch
cm_probabilities = model.predict(images_ds)
cm_predictions = np.argmax(cm_probabilities, axis=-1)
print("Correct   labels: ", cm_correct_labels.shape, cm_correct_labels)
print("Predicted labels: ", cm_predictions.shape, cm_predictions)
cmat = confusion_matrix(cm_correct_labels, cm_predictions, labels=range(len(CLASSES)))
score = f1_score(cm_correct_labels, cm_predictions, labels=range(len(CLASSES)), average='macro')
precision = precision_score(cm_correct_labels, cm_predictions, labels=range(len(CLASSES)), average='macro')
recall = recall_score(cm_correct_labels, cm_predictions, labels=range(len(CLASSES)), average='macro')
cmat = (cmat.T / cmat.sum(axis=1)).T # normalized
display_confusion_matrix(cmat, score, precision, recall)
print('f1 score: {:.3f}, precision: {:.3f}, recall: {:.3f}'.format(score, precision, recall))

Predictions

test_ds = get_test_dataset(ordered=True) # since we are splitting the dataset and iterating separately on images and ids, order matters.print('Computing predictions...')
test_images_ds = test_ds.map(lambda image, idnum: image)
probabilities = model.predict(test_images_ds)
predictions = np.argmax(probabilities, axis=-1)
print(predictions)print('Generating submission.csv file...')
test_ids_ds = test_ds.map(lambda image, idnum: idnum).unbatch()
test_ids = next(iter(test_ids_ds.batch(NUM_TEST_IMAGES))).numpy().astype('U') # all in one batch
# np.savetxt('submission.csv', np.rec.fromarrays([test_ids, predictions]), fmt=['%s', '%d'], delimiter=',', header='id,label', comments='')
import pandas as pd
test = pd.DataFrame({"id":test_ids,"label":predictions})
test.to_csv("submission.csv",index = False)
print(test.head)

Visual validation

dataset = get_validation_dataset()
dataset = dataset.unbatch().batch(20)
batch = iter(dataset)
# run this cell again for next set of images
images, labels = next(batch)
probabilities = model.predict(images)
predictions = np.argmax(probabilities, axis=-1)
display_batch_of_images((images, labels), predictions)

【深度学习TPU+Keras+Tensorflow+EfficientNetB7】kaggle竞赛 使用TPU对104种花朵进行分类 第十八次尝试 99.9%准确率相关推荐

  1. kaggle竞赛 使用TPU对104种花朵进行分类 第二十一次尝试 99.9%准确率 中文注释【深度学习TPU+Keras+Tensorflow+EfficientNetB7】

    目录 排行榜分数 最终排名 比赛过后的一点心得 前言 版本更新情况 源代码 1. 安装efficientnet 2. 导入需要的包 3. 检测TPU和GPU 4. 配置TPU.访问路径等 5. 各种函 ...

  2. 常用深度学习框——Caffe/TensorFlow / Keras/ PyTorch/MXNet

    常用深度学习框--Caffe/TensorFlow / Keras/ PyTorch/MXNet 一.概述 近几年来,深度学习的研究和应用的热潮持续高涨,各种开源深度学习框架层出不穷,包括Tensor ...

  3. 【深度学习】Keras和Tensorflow框架使用区别辨析

    [深度学习]Keras和Tensorflow框架使用区别辨析 文章目录 1 概述 2 Keras简介 3 Tensorflow简介 4 使用tensorflow的几个小例子 5 Keras搭建CNN ...

  4. DL框架之Keras:深度学习框架Keras框架的简介、安装(Python库)、相关概念、Keras模型使用、使用方法之详细攻略

    DL框架之Keras:深度学习框架Keras框架的简介.安装(Python库).相关概念.Keras模型使用.使用方法之详细攻略 目录 Keras的简介 1.Keras的特点 2.Keras四大特性 ...

  5. 深度学习入门笔记(十五):深度学习框架(TensorFlow和Pytorch之争)

    欢迎关注WX公众号:[程序员管小亮] 专栏--深度学习入门笔记 声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献. 2)本文仅供学术交流,非商用.所以每一部分具 ...

  6. 人工智能教程第一课 深度学习和计算机视觉TensorFlow入门

    深度学习 学习目标 知道什么是深度学习 知道深度学习的应用场景 1.什么是深度学习 在介绍深度学习之前,我们先看下人工智能,机器学习和深度学习之间的关系: 机器学习是实现人工智能的一种途径,深度学习是 ...

  7. 深度学习利器: TensorFlow系统架构及高性能程序设计

    2015年11月9日谷歌开源了人工智能平台TensorFlow,同时成为2015年最受关注的开源项目之一.经历了从v0.1到v0.12的12个版本迭代后,谷歌于2017年2月15日发布了TensorF ...

  8. 【深度学习】Keras vs PyTorch vs Caffe:CNN实现对比

    作者 | PRUDHVI VARMA 编译 | VK 来源 | Analytics Indiamag 在当今世界,人工智能已被大多数商业运作所应用,而且由于先进的深度学习框架,它非常容易部署.这些深度 ...

  9. 简易的深度学习框架Keras代码解析与应用

    北京 | 深度学习与人工智能研修12月23-24日 再设经典课程 重温深度学习阅读全文> 正文约12690个字,22张图,预计阅读时间:32分钟. 总体来讲keras这个深度学习框架真的很&qu ...

最新文章

  1. 三十四、动态规划解决01背包问题
  2. 春节添彩 福州花卉市场现“买花潮”
  3. setTimeout setInterval
  4. html文本弹性,HTML5 很有趣的文本蹦床/弹性弯曲动效
  5. python实训内容_Python实验课:Python元组数据及其运算
  6. Python开发——安装requests第三方库
  7. 使用FPM打包工具打rpm包
  8. 己所不欲,勿施于人的意思,这句话出自哪里?
  9. PHP函数库03:PHP生成曲线图函数
  10. dz php表单发送邮件,php 发送邮件
  11. “被”夭折的翻译——《CoffeeScript: Accelerated JavaScript Development》
  12. VMware下CentOS安裝完後認唔到網卡
  13. 记一次axsi2调用 web services 提示 java.net.SocketException: Connection reset 的解决
  14. 斜挎包长度到哪里合适_斜挎包背带一般多长 斜挎包背带太长怎么办
  15. golang 浮点数操作
  16. 网络架构、云平台和微信公众平台开发接入
  17. 【苹果家庭相册群发】CSR邮箱必须与证书所属的AppID相同
  18. drbd+keepalived nfs高可用方案实践
  19. 如何使用AD账号登录腾讯企业邮箱?
  20. 今日科技联播:微软联合创始人之一保罗·艾伦去世;锤子否认分公司解散传闻...

热门文章

  1. 银河麒麟服务器操作系统V10SP2安装搭建OpenVP
  2. STC15F2K60S2实现A/D转换
  3. P2791 幼儿园篮球题
  4. python区域找图_使用Imagemagick查找相似区域
  5. 构建高可用的方式总结
  6. cve-2019-0708漏洞复现
  7. web开发中前端页面是如何跟后端服务器数据交互的
  8. 直接在云端服务器里面修改代码,深夜折腾:实现云端服务器代码与Git库同步
  9. 阿童木录机固态硬盘MOV视频损坏修复
  10. 读取图片文件到剪贴板时的html格式