Изменения

Перейти к: навигация, поиск

Сверточные нейронные сети

2743 байта добавлено, 20:38, 17 января 2019
Нет описания правки
=== VGG ===
Семейство архитектур нейронных сетей, которое включает в себя, в частности, VGG-11, VGG-13, VGG-16 и VGG-19. Победитель соревнования ImageNet 2013-ого года (VGG-16), набравший точность 92.7%. Одной из отличительных особенностей является использование ядер свертки небольшого размера (3x3, в отличие от больших ядер размера 7x7 или 11x11).
 
== Примеры кода ==
===Scala===
Пример кода с библиотекой DeepLearning.scala<ref>[https://deeplearning.thoughtworks.school/index.html DeepLearning.scala]</ref>
// Загрузка датасета
val cifar10 = Cifar10.load().blockingAwait
// Определение слоёв
def myNeuralNetwork(input: INDArray): INDArrayLayer = {
val cnnLayer = maxPool(relu(conv2d(input.reshape(input.shape()(0), Cifar10.NumberOfChannels, PixelHeight, PixelWidth), cnnWeight, cnnBias, (KernelHeight, KernelWidth), (Stride, Stride), (Padding, Padding))), (PoolSize, PoolSize))
val affineRuleOfCnnLayer = relu(affine(cnnLayer.reshape(input.shape()(0), NumFilters * (PixelHeight / PoolSize) * (PixelWidth / PoolSize)), affineWeight, affineBias))
val affineOfaffineRuleOfCnnLayer = affine(affineRuleOfCnnLayer.reshape(input.shape()(0), HiddenDim), affineLastWeight, affineLastBias)
val softmaxValue = softmax(affineOfaffineRuleOfCnnLayer)
softmaxValue
}
// Определение функции потерь
def lossFunction(input: INDArray, expectOutput: INDArray): DoubleLayer = {
val probabilities = myNeuralNetwork(input)
-(hyperparameters.log(probabilities) * expectOutput).mean
}
 
class Trainer(batchSize: Int, numberOfEpoches: Int = 5) {
import scalaz.std.anyVal._
import scalaz.syntax.all._
@volatile
private var isShuttingDown: Boolean = false
private val lossBuffer = scala.collection.mutable.Buffer.empty[Double]
def plotLoss(): Unit = Seq(Scatter(lossBuffer.indices, lossBuffer)).plot(title = "loss by time")
def interrupt(): Unit = isShuttingDown = true
def startTrain(): Unit = {
@monadic[Future]
def trainTask: Future[Unit] = {
isShuttingDown = false
var epoch = 0
while (epoch < numberOfEpoches && !isShuttingDown) {
val cifar10 = Cifar10.load().blockingAwait
val iterator = cifar10.epoch(batchSize).zipWithIndex
while (iterator.hasNext && !isShuttingDown) {
val (Cifar10.Batch(labels, batch), i) = iterator.next()
val loss = lossFunction(batch, labels).train.each
lossBuffer += loss
hyperparameters.logger.info(s"epoch=$epoch iteration=$i batchSize=$batchSize loss=$loss")
}
epoch += 1
}
hyperparameters.logger.info("Done")
}
trainTask.onComplete { tryUnit: scala.util.Try[Unit] => tryUnit.get }
}
}
Анонимный участник

Навигация