- VALID
- без отступов
- удаляет только крайние правые столбцы (или самые нижние строки).
- т.к. нет «придуманных» полей ввода. Слой использует только допустимые входные данные.
- SAME
- с отступом
- пытается равномерно заполнить слева и справа, если количество добавляемых столбцов нечетное, он добавит дополнительный столбец справа, (та же логика применяется по вертикали: может быть дополнительная строка нулей внизу).
- если шаг 1, выходные данные слоя будут иметь те же пространственные размеры, что и его входы.
Example:
import Matrix from './entity/Matrix.mjs'
import MatrixPadding from './entity/MatrixPadding.mjs'
import MatrixPooling from './entity/MatrixPooling.mjs'
import MatrixConvolution from './entity/MatrixConvolution.mjs'
const input = [
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
];
const matrix = new Matrix().create(input, { width: 5, deep: 2 })
/*
const matrix = [
[[1, 1], [1, 1], [1, 1], [1, 1], [1, 1]],
[[1, 1], [1, 1], [1, 1], [1, 1], [1, 1]],
[[1, 1], [1, 1], [1, 1], [1, 1], [1, 1]],
[[1, 1], [1, 1], [1, 1], [1, 1], [1, 1]],
[[1, 1], [1, 1], [1, 1], [1, 1], [1, 1]],
[[1, 1], [1, 1], [1, 1], [1, 1], [1, 1]],
[[1, 1], [1, 1], [1, 1], [1, 1], [1, 1]],
[[1, 1], [1, 1], [1, 1], [1, 1], [1, 1]],
[[1, 1], [1, 1], [1, 1], [1, 1], [1, 1]],
[[1, 1], [1, 1], [1, 1], [1, 1], [1, 1]],
]
*/
const matrixPadding = new MatrixPadding().create(matrix, {
width: 5, deep: 2, top: 1, right: 2, bottom: 1, left: 1
})
/*
const matrixPadding = [
[[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]],
[[0, 0], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [0, 0], [0, 0]],
[[0, 0], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [0, 0], [0, 0]],
[[0, 0], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [0, 0], [0, 0]],
[[0, 0], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [0, 0], [0, 0]],
[[0, 0], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [0, 0], [0, 0]],
[[0, 0], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [0, 0], [0, 0]],
[[0, 0], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [0, 0], [0, 0]],
[[0, 0], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [0, 0], [0, 0]],
[[0, 0], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [0, 0], [0, 0]],
[[0, 0], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [0, 0], [0, 0]],
[[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]],
]
*/
const filter = [
[[-1, -1], [-1, -1], [-1, -1]],
[[-1, -1], [ 8, 8], [-1, -1]],
[[-1, -1], [-1, -1], [-1, -1]],
]
const matrixConvolution = new MatrixConvolution().create(matrixPadding, { filter })
// (-1 * 0 +-1 * 0 + -1 * 0) + (-1 * 0 + 8 * 1 + -1 * 1) + (-1 * 0 + -1 * 1 + -1 * 1) = 5 === matrixConvolution[0][0][0]
// (-1 * 0 +-1 * 0 + -1 * 0) + (-1 * 0 + 8 * 1 + -1 * 1) + (-1 * 0 + -1 * 1 + -1 * 1) = 5 === matrixConvolution[0][0][1]
/*
const expectMatrixConvolution = [
[[5, 5],[3, 3],[3, 3],[3, 3],[5, 5],[-2,-2]],
[[3, 3],[0, 0],[0, 0],[0, 0],[3, 3],[-3,-3]],
[[3, 3],[0, 0],[0, 0],[0, 0],[3, 3],[-3,-3]],
[[3, 3],[0, 0],[0, 0],[0, 0],[3, 3],[-3,-3]],
[[3, 3],[0, 0],[0, 0],[0, 0],[3, 3],[-3,-3]],
[[3, 3],[0, 0],[0, 0],[0, 0],[3, 3],[-3,-3]],
[[3, 3],[0, 0],[0, 0],[0, 0],[3, 3],[-3,-3]],
[[3, 3],[0, 0],[0, 0],[0, 0],[3, 3],[-3,-3]],
[[3, 3],[0, 0],[0, 0],[0, 0],[3, 3],[-3,-3]],
[[5, 5],[3, 3],[3, 3],[3, 3],[5, 5],[-2,-2]],
]
*/
const matrixPooling = new MatrixPooling().create(matrixConvolution, {
type: MatrixPooling.TYPE_MAX, filterX: 2, filterY: 2
})
/*
const expectMatrixPooling = [
[[5,5],[3,3],[5,5]],
[[3,3],[0,0],[3,3]],
[[3,3],[0,0],[3,3]],
[[3,3],[0,0],[3,3]],
[[5,5],[3,3],[5,5]]
]
*/