Мастер ведет дверь за 6 шагов, чтобы научить вас запускать программу ИИ!

машинное обучение искусственный интеллект TensorFlow Нейронные сети

Приветствую всех вОблако Tencent + сообщество, получить больше крупной технической практики Tencent по галантерее ~

Эта статья написанаОсновы облачных вычисленийОпубликован вКолонка «Облако + сообщество»

Адрес загрузки исходного кода пожалуйстаЩелкните оригиналПроверять.

Если вы новичок в машинном обучении, напишите статью и отметьте ее, надеясь решить некоторую путаницу для тех, кто войдет в яму. В этой статье представлены некоторые вводные сведения о машинном обучении, начиная с установки среды и заканчивая демонстрацией ознакомительной программы машинного обучения MNIST.

Схема содержания:

  1. Строительство окружающей среды
  2. Понять, как работает Tensorflow
  3. MNIST (распознавание рукописных цифр) линейная регрессия softmax
  4. Глубокая сверточная нейронная сеть MNIST (CNN)
  5. инструменты класс инструментов
  6. CPU & GPU & multi GPU
  7. учебные материалы

1 Настройка среды (Windows)

  • Установить виртуальную средуAnaconda, что удобно для управления пакетами Python и изоляции среды.

Anaconda3 4.2 www.anaconda.com/downloads, поставляется с питоном 3.5.

  • Создайте среду изоляции тензорного потока. Откройте терминал Anaconda Prompt после установки Anaconda и выполните следующую команду.
conda create -n tensorflow python=3.5 #创建名为tensorflow,python版本为3.5的虚拟环境
activate tensorflow #激活这个环境  
deactivate #退出当前虚拟环境。这个不用执行

Версия процессора

pip install tensorflow #通过包管理来安装
pip install whl-file #通过下载 whl 文件安装,tensorflow-cpu安装包:http://mirrors.oa.com/tensorflow/windows/cpu/tensorflow-1.2.1-cp35-cp35m-win_amd64.whl, cp35是指python3.5

** Версия графического процессора. **В моем ноутбуке используется графическая карта NVIDIA, и можно установить cuda.Графический процессор намного быстрее, чем процессор, но графическая память ноутбука невелика, и маленькая модель все еще может работать.Рекомендуется запустить большую модель локально с процессором и обучить ее на платформе Tesla. .

img

注意点:选择正确的 CUDA 和 cuDNN 版本搭配,不要只安装最新版本,tensorflow可能不支持。

В настоящее время Tensorflow поддерживает CUDA 9 и cuDNN 7. До моей установки он поддерживал только CUDA 8 и cuDNN 6, поэтому я использовал:

CUDA8.1 developer.NVIDIA.com/rough-80-karma-2…

cudnn 6 developer.nvidia.com/cudnn, Разархивируйте пакет cudnn, поместите файл в соответствующий каталог установки cuda, C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0, bin соответствует bin, include соответствует include, а затем добавьте bin каталог дляпеременная средыдорожка.

pip install tensorflow-gpu #通过包管理来安装
pip install whl-file #http://mirrors.oa.com/tensorflow/windows/gpu/tensorflow_gpu-1.2.1-cp35-cp35m-win_amd64.whl 
  • Установлены некоторые наборы инструментов Python. Вы можете использовать все, что хотите, установите pip, если нет, просто найдите исходный код для компиляции и установки.
(tensorflow) D:\> pip install opencv-python   #opencv, tensoflow 虚拟环境中
(tensorflow) D:\> pip install scipy    #图片读取写入,scipy.misc.imread
(tensorflow) D:\> pip install Pillow   #PIL/Pillow,这里有个坑,压缩过的PNG图,在1.x版本解析会出现透明通道质量下降,升级

2 Понимание механизма работы Tensorflow

  • код выше.Обратите внимание на примечания
import tensorflow as tf
hello_world = tf.constant('Hello World!', dtype=tf.string) #常量tensor
print(hello_world) #这时hello_world是一个tensor,代表一个运算的输出
#out: Tensor("Const:0", shape=(), dtype=string)
hello = tf.placeholder(dtype=tf.string, shape=[None])#占位符tensor,在sess.run时赋值
world = tf.placeholder(dtype=tf.string, shape=[None])
hello_world2 = hello+world #加法运算tensor
print(hello_world2)
#out: Tensor("add:0", shape=(?,), dtype=string)
#math
x = tf.Variable([1.0, 2.0]) #变量tensor,可变。
y = tf.constant([3.0, 3.0])
mul = tf.multiply(x, y) #点乘运算tensor
#logical
rgb = tf.constant([[[255], [0], [126]]], dtype=tf.float32)
logical = tf.logical_or(tf.greater(rgb,250.), tf.less(rgb, 5.))#逻辑运算,rgb中>250 or <5的位置被标为True,其它False
where = tf.where(logical, tf.fill(tf.shape(rgb),1.), tf.fill(tf.shape(rgb),5.))#True的位置赋值1,False位置赋值5
# 启动默认图.
# sess = tf.Session()
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())#变量初始化
    result = sess.run(hello_world) #Fetch, 获取tensor运算结果
    print(result, result.decode(), hello_world.eval())#`t.eval()` is a shortcut for calling  `tf.get_default_session().run(t)`.
    #out: b'Hello World!' Hello World! b'Hello World!' #前辍'b'表示bytestring格式,decode解成string格式
    print(sess.run(hello, feed_dict={hello: ['Hello']}))
    #out: ['Hello']
    print(sess.run(hello_world2, feed_dict={hello: ['Hello'], world: [' World!']}))#Feed,占位符赋值
    #out: [b'Hello World!']
    print(sess.run(mul))
    #out: [ 3.  6.]
    print(sess.run(logical))
    #out: [[[ True] [ True] [False]]] #rgb中>250 or <5的位置被标为True,其它False
    print(sess.run(where))
    #out: [[[ 1.] [ 1.] [ 5.]]] #True的位置赋值1,False位置赋值5
#sess.close()#sess如果不是用with方式定义,需要close
  • Тензор. Это дескриптор, который представляет результат операции, но не хранит результат вывода операции.Вам необходимо выполнить процесс операции через tf.Session.run(Tensor) или Tensor.eval(), чтобы получить результат вывода . Тензор — это символический дескриптор одного из выходных данных операции. Он не содержит значений выходных данных этой операции, а вместо этого предоставляет средства вычисления этих значений в TensorFlow.
  • Процесс запуска Tensorflow: определить логику расчета, построить график (Graph) => получить данные результата через сеанс (Session). См. ссылку для основного использования.

3 MNIST (распознавание рукописных цифр) линейная регрессия softmax

  • анализировать

MNIST — это набор данных компьютерного зрения начального уровня, который содержит различные изображения рукописных цифр:

img

Он также содержит метку, соответствующую каждому изображению, сообщающую нам, какой это номер. Например, метки четырех изображений выше — 5, 0, 4 и 1 соответственно.

Размер изображения набора данных — 28x28, одноканальное изображение в градациях серого. Стили хранения следующие:

img

Цель распознавания рукописных цифр MNIST состоит в том, чтобы ввести такое изображение 28x28, содержащее рукописные цифры, и предсказать цифры, содержащиеся на изображении.

Линейная регрессия Softmax считает, что число на картинке равно N возможностям, которые определяются каждым пикселем изображения.

img

Указывает номерiВероятность , вычислите вероятность всех чисел (0-9), то есть достоверность всех чисел, а затем используйте число с наибольшей вероятностью в качестве прогнозируемого значения.

Доказательства рассчитываются следующим образом:

img

в

img

представляет вес,

img

представлять числаiсмещение класса,jпредставляет заданное изображениеxИндекс пикселя (0~28x28=784) для суммирования пикселей. То есть сумма весов каждого значения пикселя x изображения плюс смещение b, чтобы получить значение вероятности.

Цель введения softmax — нормализовать значения правдоподобияnormalize, так что сумма всех возможностей равна 1. Это преобразует эти возможности в вероятностиy:

img

img

img

  • приступить к реализации

данные

X размер выборки 28x28 = 784

img

Образец Y, оформленный как

img

img

читать

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True) #total 55000,one_hot方式,图片x格式为1维数组,大小784
batch_xs, batch_ys = mnist.train.next_batch(batch_size) #分batch读取

Построить график (График)

Вывод вывода, процесс вывода от ввода x до вывода прогнозируемого значения y.

img

img

x = tf.placeholder(tf.float32, [None, 784], name="input")#None表示batch size待定
with tf.variable_scope("inference"):#定义作用域,名子inference
    W = tf.Variable(tf.zeros([784, 10])) #初值为0,size 784x10
    b = tf.Variable(tf.zeros([10])) #初值为0 size 10
    y = tf.matmul(x, W) + b #矩阵相乘

Функция потери потерь, перекрестная энтропия обычно используется для классификации, а здесь используется перекрестная энтропия softmax. Перекрестная энтропия используется для измерения разностной информации между двумя распределениями вероятностей.Формула перекрестной энтропии выглядит следующим образом:

img

with tf.variable_scope("loss"):
    loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y), name="loss")
    #softmax交叉熵公式: z * -log(softmax(x)) + (1 - z) * -log(1 - softmax (x)) # x: logits, z: label

Существует много способов расчета потерь, наиболее распространенными из которых являются потери L1, потери L2, сигмовидная перекрестная энтропия, совместные потери, пользовательские потери...

Точность, вероятность того, что прогнозируемое значение совпадает с истинным значением. Выходное значение y матричного умножения представляет собой массив.Функция tf.argmax может найти максимальный нижний индекс элемента из данных.Максимальный нижний индекс прогнозируемого значения и максимальный нижний индекс истинного значения согласуются, что правильно.

with tf.variable_scope("accuracy"):
    accuracy = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1)), tf.float32), name="accuracy")

Тренировочное обучение, цель обучения - приблизить Loss к минимизации, а прогнозируемое значение - к истинному значению Tensorflow реализуется оптимизаторами Optimizers. **В y = Wx+b, W и b будут присвоены начальные значения (случайные или 0) в начале обучения.После того, как Оптимизатор не является краткосрочной оптимизацией, Loss приближается к минимальному значению, так что W и b продолжают приближаться к идеальному значению. **W и b вместе имеют в общей сложности 784x10+10 параметров.

train_step = tf.train.GradientDescentOptimizer(FLAGS.learning_rate).minimize(loss)

Функция минимизации: обновите параметры для минимизации потерь, которая включает в себя два шага: расчет градиентов, обновление параметров.

grad_var = compute_gradients(loss) # return (gradient, variable) pairs
apply_gradients(grad_var) #沿着参数的梯度反方向更新参数,让Loss变小

GradientDescentOptimizer: Оптимизатор алгоритма градиентного спуска, Tensorflow реализует SGD (стохастический градиентный спуск). Недостатком является то, что он зависит от текущей партии и сильно колеблется.

Некоторые другие улучшенные оптимизаторы: справочная ссылка. MomentumOptimizer, AdadeltaOptimizer, AdamOptimizer, RMSPropOptimizer, AdadeltaOptimizer...

Сеанс: Tensorflow должен выполнять операции вывода через сеанс (сеанс).Есть два способа его создания.Разница между ними заключается в том, что InteractiveSession установит себя в качестве сеанса по умолчанию.С сеансом по умолчанию tensor.eval() может быть казнен.

sess = tf.Session()
sess = tf.InteractiveSession()

Вы также можете установить сеанс по умолчанию:

with sess.as_default(): xx.eval()
with tf.Session() as sess: xx.eval()

Настройте параметры сеанса, связанные с GPU:

sess_config = tf.ConfigProto(allow_soft_placement=True, log_device_placement=False)#允许没有gpu或者gpu不足时用软件模拟
sess_config.gpu_options.allow_growth = True #动态申请显存。不加会申请全部,导致其他训练程序不能运行
#sess_config.gpu_options.per_process_gpu_memory_fraction = 0.8 #按比例申请显存
sess = tf.InteractiveSession(config=sess_config)

Процесс обучения сети представляет собой итеративный (прямой + обратный) процесс. Прямой алгоритм вычисляет выходные данные каждого слоя сети от переднего к заднему, а обратный алгоритм вычисляет градиент параметра от заднего к переднему, оптимизирует параметры и уменьшает потери. Процесс показан на рисунке:

img

Примечание. Время от времени выводите потери и точность в сети, чтобы проверить эффект. Время от времени кэшируйте сетевые параметры, чтобы предотвратить внезапные сбои и восстановить их.

Сохранение и восстановление параметров модели:

контрольная точка: метод сохранения по умолчанию.

​ pb: мобильное использование.

npz: метод хранения словаря, {имя: значение}, метод хранения numpy. Сохранение и восстановление параметров по имени. Методы сохранения и восстановления контролируются сами по себе и могут выборочно сохраняться и восстанавливаться. См. соседний код [tools.py] методы save_npz_dict и load_and_assign_npz_dict.

saver = tf.train.Saver(max_to_keep = 3, write_version = 2)
save_path = saver.save(sess, FLAGS.out_model_dir+'/model.ckpt')# check point方式
output_graph_def = tf.graph_util.convert_variables_to_constants(sess, sess.graph_def, output_node_names=['output'])#指定输出节点名称,这个需要在网络中定义
with tf.gfile.FastGFile(FLAGS.out_model_dir+'/mobile-model.pb', mode='wb') as f:
    f.write(output_graph_def.SerializeToString()) #pb方式
tools.save_npz_dict(save_list=tf.global_variables(), name=FLAGS.out_model_dir+'/model.npz', sess=sess) #pnz方式

Восстановление:

#check point
saver = tf.train.Saver(max_to_keep = 3, write_version = 2)
model_file=tf.train.latest_checkpoint(FLAGS.log_dir)
if model_file:
     saver.restore(sess, model_file)
#npz
tools.load_and_assign_npz_dict(name=FLAGS.log_dir+'/model.npz', sess=sess))打印网络中各参数信息:方便查看网络参数是否正确。
def print_all_variables(train_only=False):
    if train_only:
        t_vars = tf.trainable_variables()
        print("  [*] printing trainable variables")
    else:
        t_vars = tf.global_variables()
        print("  [*] printing global variables")
    for idx, v in enumerate(t_vars):
        print("  var {:3}: {:15}   {}".format(idx, str(v.get_shape()), v.name))
  • визуализация. Tensorflow предоставляет инструмент визуализации tensorboard, откройте веб-сервис с помощью команды, просмотрите его в браузере, введите URL-адрес http://localhost:6006.
tensorboard --logdir=your-log-path #path中不要出现中文
# 需要在训练过程指定相应log路径,写入相关信息
# 参考附件【sample.py】中summary、writer相关关键字代码。

Визуализация графика:

img

Визуализация тренировочного процесса:

img

размер пакета = 128, набор для обучения, набор для проверки. Видно, что потери сходятся, а точность улучшается. Поскольку кривая обучающего набора отражает потери и точность текущего пакета, размер пакета относительно мал, а дрожание велико. Проверочный набор — это все изображения для тестирования, и кривая более плавная.

4 MNIST Глубокая сверточная нейронная сеть (CNN)

В сети линейной регрессии Softmax выход y представляет собой линейную комбинацию входных данных x, то есть y = Wx+b, что представляет собой линейную зависимость. Во многих задачах метод решения не может быть дополнен нелинейными отношениями.В глубоком обучении многослойные сверточные нейронные сети могут комбинировать нелинейные функции активации для моделирования более сложных нелинейных отношений, и эффект часто лучше, чем одиночные линейные отношения. Давайте сначала посмотрим на модель прогнозирования MNIST, построенную глубокой сверточной нейронной сетью (CNN, Convolutional Neural Network), а затем представим каждый слой сети один за другим.

  • MNIST CNN Граф логического вывода. Существует несколько сетевых уровней от ввода до вывода: изменение формы, свертка, объединение пулов, полная ссылка fc, отсев. Исходные данные изображения x вводятся снизу вверх и последовательно обрабатываются каждым уровнем, и получается выходной результат прогнозирования вероятности y каждой классификации цифр. Результат Inference переводится в потери для итеративного обучения, как показано на рисунке

img

Видно, что используется оптимизатор AdamOptimizer.

img

  • изменение формы деформации, для изменения логической структуры данных, например с двумерной на четырехмерную: [1, 784] => [1, 28, 28, 1], содержимое хранилища данных не изменилось. Здесь, поскольку рукописное изображение, хранящееся во входных данных, является одномерными данными, оно преобразуется в формат [размер_пакета, высота, ширина, каналы]
    with tf.name_scope('reshape'): #scope
        inputs = tf.reshape(inputs, [-1, 28, 28, 1])
        #[batch_size, height, width, channels], batch size=-1表示由inputs决定,
        #batch_size=inputs_size/(28x28x1)
  • свертка conv2d, ядро ​​свертки (желтое) умножается на элемент Image (зеленый) и накапливается для получения значения выходного элемента (красный). Каждый Канал (канал) Изображения соответствует различному ядру свертки, и параметры ядра свертки внутри Канала являются общими. Все входные каналы умножаются и накапливаются своими ядрами для получения выходного значения канала. Если в выводе несколько каналов, он будет повторяться много раз, и ядро ​​тоже будет другим.Таким образом, будут ядра свертки input_channel_count * output_channel_count.Ядро свертки обучается на сверточном слое.
def conv2d(x, W): #W: filter [kernel[0], kernel[1], in_channels, out_channels]
  return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')

tf.nn.conv2d:

img

img

data_format: Логическая структура входных и выходных данных,NHWC: канал ширины высоты пакета.NCHW: высота канала пакетной обработки ширина. Обычно используется формат NHWC, в некоторых входных данных данные каждого канала хранятся отдельно, что больше подходит для NCHW.

input: Ввод, когда data_format=NHWC, формаbatch, in_height, in_width, in_channels, Тензор.

filter: ядро ​​свертки, форма filter_height, filter_width, in_channels, out_channels, есть ядра свертки in_channels*out_channels filter_height, filter_width, чем больше входных и выходных каналов, тем больше объем вычислений.

strides: Размер шага, форма равна 1, stride_h, stride_w, 1, обычно stride_h и stride_w равны, что указывает на количество шагов, на которые ядро ​​свертки продвигается каждый раз в вертикальном и горизонтальном направлениях. Шаг на картинке выше равен 1.

padding: метод заполнения, когда данные не выровнены во время вычисления свертки,VALID: отбросить лишнее;SAME: Заполните 0 на обоих концах, чтобы можно было вычислить избыточную часть.

img

output: вывод, формаbatch, out_height, out_width, out_channels

output[b, i, j, k] =
    sum_{di, dj, q} input[b, strides[1] * i + di, strides[2] * j + dj, q] *
                    filter[di, dj, q, k]
  • функция активации, используется со сверткой.Функция активации на самом деле не активирует что-либо.В нейронной сети функция функции активации состоит в том, чтобы добавить в нейронную сеть некоторые нелинейные факторы, чтобы нейронная сеть могла лучше решать более сложные задачи.

img

tf.nn.reluТо есть функция активации, которая выполняет нелинейную обработку на выходе свертки, Функция выглядит следующим образом:

img

img

Другие, такие каксигмовидная:

img

img

Тан:

img

img

  • Объединение пулов, есть max pooling и medium pooling, расчет аналогичен расчету свертки, но ядра свертки нет, вычисляется максимальное или среднее значение диапазона, покрываемого ядром, входной канал соответствует выходному каналу, и нет многослойного накопления. Количество входных и выходных каналов одинаково, а выходная высота и ширина зависят от шагов.

img

img

if is_max_pool:
    x = tf.nn.max_pool(x, [1,kernel[0],kernel[1],1], strides=[1,stride[0],stride[1],1], padding=padding, name='pool')
else:
    x = tf.nn.avg_pool(x, [1,kernel[0],kernel[1],1], strides=[1,stride[0],stride[1],1], padding=padding, name='pool')
  • Dropout, удалить некоторые данные случайным образом, чтобы сеть также могла обучать точные результаты на этих удаленных данных, чтобы сеть имела более сильную адаптивность,уменьшить переоснащение.
x = tf.nn.dropout(x, keep_prob) #keep_prob 保留比例,keep_prob=1.0表示无dropout
  • BN (пакетная нормализация), нормализация партии. Не отмечен в Inference, не используется в демо, но это также очень часто используемый слой в сети. BN часто используется перед нелинейным отображением, то есть нормализацией результатов Conv. Общий порядок: свертка -> BN -> функция активации.

Преимущества BN: повысить скорость обучения, ускорить сходимость потерь, повысить адаптивность сети и решить проблему исчезновения и взрыва градиента при обратном распространении с помощью определенной программы. Нажмите, чтобы узнать подробности.

  • FC (Full Connection) полное соединение, ядром является умножение матриц

img

, линейная регрессия softmax представляет собой FC. В CNN полные соединения часто появляются в нескольких последних слоях и используются для взвешивания ранее разработанных функций. Tensorflow предоставляет соответствующую функцию tf.layers.dense.

  • бревно, на рисунке ниже напечатана модель, которую необходимопараметры тренировкиформа иВыход каждого слояФорма данных (когда batch_size=1), вложение [tool.py] имеет соответствующий код. Цель состоит в том, чтобы облегчить понимание того, соответствует ли созданная вами сетевая структура вашим ожиданиям. данные **[1x784]** -reshape->[1x28x28x1](batch_size, height, width, channels) -conv-> [1x28x28x32] -pool-> [1x14x14x32] -conv-> [1x14x14x64] -pool-> [1x7x7x64] -fc-> [1x1024] -fc-> [1x10](вероятность каждого класса чисел)

img

  • Для тренировочного эффекта, пожалуйста, обратитесь к вложению для подробного кода [cnn.py

img

  • Онлайн-демонстрация визуального распознавания рукописного ввода,Провинция Сычуань.Честь и сын.Руб/~Харлей/ви…
  • Семейная классическая сеть CNN, такие как LeNet, AlexNet, VGG-Net, GoogLeNet, ResNet, U-Net, FPN. Они также состоят из базовых элементов сетевого уровня (описанных выше), таких как строительные блоки.

VGG, как показано ниже, является очень известной сетью извлечения и классификации признаков. Он состоит из многоуровневых слоев объединения сверток и, наконец, использует FC для слияния признаков для достижения классификации.Многие сети извлекают признаки на основе первых нескольких слоев слоев объединения сверток, а затем развивают свой собственный бизнес.

img

5 инструмент класс инструмента

tool.py] — это класс инструментов, основанный на вторичной инкапсуляции тензорного потока, расположенный во вложении. Преимущество в том, что в дальнейшем программирование удобнее, а структура кода лучше. В Интернете также есть готовые библиотеки с открытым исходным кодом, такие какTensorLayer, Керас, Tflearn, цель самоинкапсуляции лучше понять tensorflow API, да и управляемость самоделки сильнее.Если контроль то обучаются ли параметры, и печатается лог.

На следующем рисунке показана сеть MNIST CNN.InferenceКод рассуждения:

img

6 CPU & GPU & multi GPU

  • CPU, Tensorflow по умолчанию устанавливает для всех процессоров значение /cpu:0, которое по умолчанию занимает все процессоры.Вы можете указать число занятости с помощью кода.
sess_config = tf.ConfigProto(device_count={"CPU": 14}, allow_soft_placement=True, log_device_placement=False)
sess_config.intra_op_parallelism_threads = 56
sess_config.inter_op_parallelism_threads = 56
sess = tf.InteractiveSession(config=sess_config)
  • GPU, Tensorflow по умолчанию занимает /gpu:0, вы можете определить, на каком GPU работает код, указав устройство. под
with tf.device('/device:GPU:2'):
   a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
   b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
   c = tf.matmul(a, b)
#下面的代码配置可以避免GPU被占满,用多少内存占多少
sess_config = tf.ConfigProto(allow_soft_placement=True, log_device_placement=False)
sess_config.gpu_options.allow_growth = True
sess_config.gpu_options.per_process_gpu_memory_fraction = 0.8
sess = tf.InteractiveSession(config=sess_config)

При наличии нескольких графических процессоров вы можете контролировать, какие графические процессоры использует программа, установив видимый блок графического процессора CUDA, выполнив следующую команду в терминале.

export CUDA_VISIBLE_DEVICES=2,3
  • Использование нескольких графических процессоров, Multi-GPU программировать в Tensorflow неудобно, данные лучше, а код писать сложнее, что не так хорошо, как в Caffe.

В Tensorflow вам нужно написать собственный код для управления комбинацией потерь и градиента нескольких графических процессоров.Пожалуйста, нажмите здесь, чтобы увидеть официальный пример. Я сам написал слишком много проектов для GPU, приложенный код [tmp-main-gpus-unavailable.py] для справки, но недоступно здесь, из других проектов.

img

7 Учебные материалы

Я собрал некоторые материалы, связанные с машинным обучением, и поделился ими. Я сам видел только малую часть, и я все еще учусь...

вопросы и ответы

Как использовать искусственный интеллект для синтеза человеческого голоса?

Связанное Чтение

Практика посадки ИИ в нескольких сценариях

AI Academy | Обзор основ искусственного интеллекта

Искусственный интеллект, ангел или дьявол

Облачная академия · Рекомендация курса | Руководитель группы специальных технических испытаний Tencent в сочетании с 8-летним опытом объяснит вам принцип разделения горячего и холодного

Эта статья была разрешена автором для публикации в сообществе Tencent Cloud + Для получения дополнительных оригинальных текстов, пожалуйстанажмите

Найдите и подпишитесь на общедоступную учетную запись «Сообщество Yunjia», получите технические галантереи как можно скорее и ответьте на 1024, обратив внимание, чтобы отправить вам подарочный пакет технических курсов!

Огромный технический практический опыт, все вСообщество Юнцзя!