@@ -58,7 +58,7 @@ export type NeuralNetworkActivation =
58
58
export interface IJSONLayer {
59
59
biases : number [ ] ;
60
60
weights : number [ ] [ ] ;
61
- memory : number [ ] [ ] ;
61
+ memory ? : number [ ] [ ] ;
62
62
}
63
63
64
64
export interface INeuralNetworkJSON {
@@ -78,6 +78,7 @@ export interface INeuralNetworkOptions {
78
78
outputSize : number ;
79
79
binaryThresh : number ;
80
80
hiddenLayers ?: number [ ] ;
81
+ memory ?: MemoryFunction ;
81
82
memorySize : number ;
82
83
}
83
84
@@ -193,7 +194,7 @@ export class NeuralNetwork<
193
194
_formatInput : NeuralNetworkFormatter | null = null ;
194
195
_formatOutput : NeuralNetworkFormatter | null = null ;
195
196
196
- _memory : NeuralNetworkMemory ;
197
+ _memory ? : NeuralNetworkMemory ;
197
198
198
199
runInput : ( input : Float32Array ) => Float32Array = ( input : Float32Array ) => {
199
200
this . setActivation ( ) ;
@@ -229,9 +230,23 @@ export class NeuralNetwork<
229
230
this . sizes = [ inputSize ] . concat ( hiddenLayers ?? [ ] ) . concat ( [ outputSize ] ) ;
230
231
}
231
232
233
+ this . _memoryFunction = options . memory ;
232
234
// Initialize memory matrix
233
235
const { memorySize } = this . options ?? 0 ;
234
- this . _memory = this . replaceMemory ( memorySize ) ;
236
+ if ( memorySize ) this . _memory = this . replaceMemory ( memorySize ) ;
237
+ }
238
+
239
+ public get memory ( ) : NeuralNetworkMemory | undefined {
240
+ return this . _memory ;
241
+ }
242
+
243
+ public get memoryFunction ( ) : MemoryFunction | undefined {
244
+ return this . _memoryFunction ;
245
+ }
246
+
247
+ public get memorySize ( ) : number {
248
+ if ( ! this . _memory || ! this . _memory [ 0 ] || ! this . _memory [ 0 ] [ 0 ] ) return 0 ;
249
+ return this . _memory [ 0 ] [ 0 ] . length ;
235
250
}
236
251
237
252
/**
@@ -308,10 +323,6 @@ export class NeuralNetwork<
308
323
return this . sizes . length > 0 ;
309
324
}
310
325
311
- public get memory ( ) : NeuralNetworkMemory {
312
- return this . _memory ;
313
- }
314
-
315
326
run ( input : Partial < InputType > ) : OutputType {
316
327
if ( ! this . isRunnable ) {
317
328
throw new Error ( 'network not runnable' ) ;
@@ -1234,19 +1245,23 @@ export class NeuralNetwork<
1234
1245
const jsonLayerBiases = this . biases . map ( ( layerBiases ) =>
1235
1246
Array . from ( layerBiases )
1236
1247
) ;
1237
- const jsonLayerMemory = this . memory . map ( layerMemory =>
1238
- layerMemory . map (
1239
- nodeMemory => Array . from ( nodeMemory )
1240
- )
1241
- ) ;
1248
+ let jsonLayerMemory ;
1249
+ if ( this . memory ) {
1250
+ jsonLayerMemory = this . memory . map ( layerMemory =>
1251
+ layerMemory . map (
1252
+ nodeMemory => Array . from ( nodeMemory )
1253
+ )
1254
+ ) ;
1255
+ }
1242
1256
const jsonLayers : IJSONLayer [ ] = [ ] ;
1243
1257
const outputLength = this . sizes . length - 1 ;
1244
1258
for ( let i = 0 ; i <= outputLength ; i ++ ) {
1245
- jsonLayers . push ( {
1259
+ const jsonLayer : IJSONLayer = {
1246
1260
weights : jsonLayerWeights [ i ] ?? [ ] ,
1247
- biases : jsonLayerBiases [ i ] ?? [ ] ,
1248
- memory : jsonLayerMemory [ i ] ?? [ ]
1249
- } ) ;
1261
+ biases : jsonLayerBiases [ i ] ?? [ ]
1262
+ } ;
1263
+ if ( jsonLayerMemory ) jsonLayer . memory = jsonLayerMemory [ i ] ?? [ ] ;
1264
+ jsonLayers . push ( jsonLayer ) ;
1250
1265
}
1251
1266
return {
1252
1267
type : 'NeuralNetwork' ,
@@ -1290,15 +1305,18 @@ export class NeuralNetwork<
1290
1305
const layerBiases = this . biases . map ( ( layerBiases , layerIndex ) =>
1291
1306
Float32Array . from ( jsonLayers [ layerIndex ] . biases )
1292
1307
) ;
1293
- const layerMemory = this . memory . map ( ( memory , layerIndex ) =>
1294
- Array . from ( jsonLayers [ layerIndex ] . memory ) . map ( nodeMemory =>
1295
- Float32Array . from ( nodeMemory )
1296
- )
1297
- ) ;
1308
+ let layerMemory ;
1309
+ if ( this . memory ) {
1310
+ layerMemory = this . memory . map ( ( memory , layerIndex ) =>
1311
+ Array . from ( jsonLayers [ layerIndex ] . memory ?? [ ] ) . map ( nodeMemory =>
1312
+ Float32Array . from ( nodeMemory )
1313
+ )
1314
+ ) ;
1315
+ }
1298
1316
for ( let i = 0 ; i <= this . outputLayer ; i ++ ) {
1299
1317
this . weights [ i ] = layerWeights [ i ] || [ ] ;
1300
1318
this . biases [ i ] = layerBiases [ i ] || [ ] ;
1301
- this . memory [ i ] = layerMemory [ i ] || [ ] ;
1319
+ if ( layerMemory && this . memory ) this . memory [ i ] = ( layerMemory && layerMemory [ i ] ) ?? [ ] ;
1302
1320
}
1303
1321
return this ;
1304
1322
}
0 commit comments