mirror of
https://github.com/wassname/keras-contrib.git
synced 2026-06-27 16:10:11 +08:00
181 lines
7.4 KiB
Python
181 lines
7.4 KiB
Python
import pytest
|
|
import numpy as np
|
|
import itertools
|
|
from numpy.testing import assert_allclose
|
|
|
|
from keras_contrib.utils.test_utils import layer_test, keras_test
|
|
from keras.utils.conv_utils import conv_input_length
|
|
from keras import backend as K
|
|
from keras_contrib import backend as KC
|
|
from keras_contrib.layers import convolutional, pooling
|
|
from keras.models import Sequential
|
|
|
|
# TensorFlow does not support full convolution.
|
|
if K.backend() == 'theano':
|
|
_convolution_border_modes = ['valid', 'same']
|
|
else:
|
|
_convolution_border_modes = ['valid', 'same']
|
|
|
|
|
|
@keras_test
|
|
def test_deconvolution_3d():
|
|
num_samples = 6
|
|
num_filter = 4
|
|
stack_size = 2
|
|
kernel_dim1 = 12
|
|
kernel_dim2 = 10
|
|
kernel_dim3 = 8
|
|
|
|
for batch_size in [None, num_samples]:
|
|
for border_mode in _convolution_border_modes:
|
|
for subsample in [(1, 1, 1), (2, 2, 2)]:
|
|
if border_mode == 'same' and subsample != (1, 1, 1):
|
|
continue
|
|
|
|
dim1 = conv_input_length(kernel_dim1, 7,
|
|
border_mode,
|
|
subsample[0])
|
|
dim2 = conv_input_length(kernel_dim2, 5,
|
|
border_mode,
|
|
subsample[1])
|
|
dim3 = conv_input_length(kernel_dim3, 3,
|
|
border_mode,
|
|
subsample[2])
|
|
layer_test(convolutional.Deconvolution3D,
|
|
kwargs={'filters': num_filter,
|
|
'kernel_size': (7, 5, 3),
|
|
'output_shape': (batch_size, num_filter, dim1, dim2, dim3),
|
|
'padding': border_mode,
|
|
'strides': subsample,
|
|
'data_format': 'channels_first'},
|
|
input_shape=(num_samples, stack_size, kernel_dim1, kernel_dim2, kernel_dim3),
|
|
|
|
fixed_batch_size=True, tolerance=None)
|
|
|
|
layer_test(convolutional.Deconvolution3D,
|
|
kwargs={'filters': num_filter,
|
|
'kernel_size': (7, 5, 3),
|
|
'output_shape': (batch_size, num_filter, dim1, dim2, dim3),
|
|
'padding': border_mode,
|
|
'strides': subsample,
|
|
'data_format': 'channels_first',
|
|
'kernel_regularizer': 'l2',
|
|
'bias_regularizer': 'l2',
|
|
'activity_regularizer': 'l2'},
|
|
input_shape=(num_samples, stack_size, kernel_dim1, kernel_dim2, kernel_dim3),
|
|
fixed_batch_size=True, tolerance=None)
|
|
|
|
layer_test(convolutional.Deconvolution3D,
|
|
kwargs={'filters': num_filter,
|
|
'kernel_size': (7, 5, 3),
|
|
'output_shape': (num_filter, dim1, dim2, dim3),
|
|
'padding': border_mode,
|
|
'strides': subsample,
|
|
'data_format': 'channels_first',
|
|
'kernel_regularizer': 'l2',
|
|
'bias_regularizer': 'l2',
|
|
'activity_regularizer': 'l2'},
|
|
input_shape=(num_samples, stack_size, kernel_dim1, kernel_dim2, kernel_dim3), tolerance=None)
|
|
|
|
|
|
@keras_test
|
|
def test_cosineconvolution_2d():
|
|
num_samples = 2
|
|
num_filter = 2
|
|
stack_size = 3
|
|
num_row = 10
|
|
num_col = 6
|
|
|
|
if K.backend() == 'theano':
|
|
data_format = 'channels_first'
|
|
elif K.backend() == 'tensorflow':
|
|
data_format = 'channels_last'
|
|
|
|
for border_mode in _convolution_border_modes:
|
|
for subsample in [(1, 1), (2, 2)]:
|
|
for use_bias_mode in [True, False]:
|
|
if border_mode == 'same' and subsample != (1, 1):
|
|
continue
|
|
|
|
layer_test(convolutional.CosineConvolution2D,
|
|
kwargs={'filters': num_filter,
|
|
'kernel_size': (3, 3),
|
|
'padding': border_mode,
|
|
'strides': subsample,
|
|
'use_bias': use_bias_mode,
|
|
'data_format': data_format},
|
|
input_shape=(num_samples, num_row, num_col, stack_size))
|
|
|
|
layer_test(convolutional.CosineConvolution2D,
|
|
kwargs={'filters': num_filter,
|
|
'kernel_size': (3, 3),
|
|
'padding': border_mode,
|
|
'strides': subsample,
|
|
'use_bias': use_bias_mode,
|
|
'data_format': data_format,
|
|
'kernel_regularizer': 'l2',
|
|
'bias_regularizer': 'l2',
|
|
'activity_regularizer': 'l2'},
|
|
input_shape=(num_samples, num_row, num_col, stack_size))
|
|
|
|
if data_format == 'channels_first':
|
|
X = np.random.randn(1, 3, 5, 5)
|
|
input_dim = (3, 5, 5)
|
|
W0 = X[:, :, ::-1, ::-1]
|
|
elif data_format == 'channels_last':
|
|
X = np.random.randn(1, 5, 5, 3)
|
|
input_dim = (5, 5, 3)
|
|
W0 = X[0, :, :, :, None]
|
|
|
|
model = Sequential()
|
|
model.add(convolutional.CosineConvolution2D(1, (5, 5), use_bias=True,
|
|
input_shape=input_dim,
|
|
data_format=data_format))
|
|
model.compile(loss='mse', optimizer='rmsprop')
|
|
W = model.get_weights()
|
|
W[0] = W0
|
|
W[1] = np.asarray([1.])
|
|
model.set_weights(W)
|
|
out = model.predict(X)
|
|
assert_allclose(out, np.ones((1, 1, 1, 1), dtype=K.floatx()), atol=1e-5)
|
|
|
|
model = Sequential()
|
|
model.add(convolutional.CosineConvolution2D(1, (5, 5), use_bias=False,
|
|
input_shape=input_dim,
|
|
data_format=data_format))
|
|
model.compile(loss='mse', optimizer='rmsprop')
|
|
W = model.get_weights()
|
|
W[0] = -2 * W0
|
|
model.set_weights(W)
|
|
out = model.predict(X)
|
|
assert_allclose(out, -np.ones((1, 1, 1, 1), dtype=K.floatx()), atol=1e-5)
|
|
|
|
|
|
@keras_test
|
|
def test_sub_pixel_upscaling():
|
|
num_samples = 2
|
|
num_row = 16
|
|
num_col = 16
|
|
input_dtype = K.floatx()
|
|
|
|
for scale_factor in [2, 3, 4]:
|
|
input_data = np.random.random((num_samples, 4 * (scale_factor ** 2), num_row, num_col))
|
|
input_data = input_data.astype(input_dtype)
|
|
|
|
if K.image_data_format() == 'channels_last':
|
|
input_data = input_data.transpose((0, 2, 3, 1))
|
|
|
|
input_tensor = K.variable(input_data)
|
|
expected_output = K.eval(KC.depth_to_space(input_tensor,
|
|
scale=scale_factor))
|
|
|
|
layer_test(convolutional.SubPixelUpscaling,
|
|
kwargs={'scale_factor': scale_factor},
|
|
input_data=input_data,
|
|
expected_output=expected_output,
|
|
expected_output_dtype=K.floatx())
|
|
|
|
|
|
if __name__ == '__main__':
|
|
pytest.main([__file__])
|