@@ -53,6 +53,9 @@ func readMNIST(imagesFile: String, labelsFile: String) -> (images: Tensor<Float>
53
53
54
54
/// A classifier.
55
55
struct Classifier : Layer {
56
+ typealias Input = Tensor < Float >
57
+ typealias Output = Tensor < Float >
58
+
56
59
var conv1a = Conv2D < Float > ( filterShape: ( 3 , 3 , 1 , 32 ) , activation: relu)
57
60
var conv1b = Conv2D < Float > ( filterShape: ( 3 , 3 , 32 , 64 ) , activation: relu)
58
61
var pool1 = MaxPool2D < Float > ( poolSize: ( 2 , 2 ) , strides: ( 2 , 2 ) )
@@ -64,7 +67,7 @@ struct Classifier: Layer {
64
67
var layer1b = Dense < Float > ( inputSize: 128 , outputSize: 10 , activation: softmax)
65
68
66
69
@differentiable
67
- func applied ( to input: Tensor < Float > ) -> Tensor < Float > {
70
+ func call ( _ input: Input ) -> Output {
68
71
let convolved = input. sequenced ( through: conv1a, conv1b, pool1)
69
72
return convolved. sequenced ( through: dropout1a, flatten, layer1a, dropout1b, layer1b)
70
73
}
@@ -83,7 +86,7 @@ let (images, numericLabels) = readMNIST(imagesFile: "train-images-idx3-ubyte",
83
86
let labels = Tensor < Float > ( oneHotAtIndices: numericLabels, depth: 10 )
84
87
85
88
var classifier = Classifier ( )
86
- let optimizer = RMSProp < Classifier , Float > ( )
89
+ let optimizer = RMSProp ( for : classifier )
87
90
88
91
// The training loop.
89
92
for epoch in 1 ... epochCount {
@@ -95,7 +98,7 @@ for epoch in 1...epochCount {
95
98
let y = minibatch ( in: numericLabels, at: i)
96
99
// Compute the gradient with respect to the model.
97
100
let 𝛁model = classifier. gradient { classifier -> Tensor < Float > in
98
- let ŷ = classifier. applied ( to : x)
101
+ let ŷ = classifier ( x)
99
102
let correctPredictions = ŷ. argmax ( squeezingAxis: 1 ) .== y
100
103
correctGuessCount += Int ( Tensor < Int32 > ( correctPredictions) . sum ( ) . scalarized ( ) )
101
104
totalGuessCount += batchSize
0 commit comments