fluid.layers.grid_sample 梯度计算异常
Created by: kebinC
测试代码: stn.py
import paddle
import paddle.fluid as fluid
import numpy as np
__all__ = ["STN"]
class STN():
def __init__(self, ):
pass
def net(self, input):
x = self.localization(input)
theta = self.fc_loc(x)
grid = fluid.layers.affine_grid(theta, out_shape=input.shape)
out = fluid.layers.grid_sampler(input, grid=grid)
return out
def localization(self, input):
x = self.conv_pool_layer(input, 8, 7, 2, 'conv_loc_0')
x = self.conv_pool_layer(x, 16, 3, 2, 'conv_loc_1')
out = self.conv_pool_layer(x, 24, 3, 2, 'conv_loc_2')
return out
def fc_loc(self, input):
np_array = np.asarray([1, 0, 0, 0, 1, 0], dtype=np.float32)
x = fluid.layers.fc(input=input, size=32, act='relu',
param_attr=fluid.initializer.Constant(value=0),
bias_attr=fluid.initializer.Constant(value=0),
name='fc_loc_0')
x = fluid.layers.fc(input=x, size=6, act=None,
param_attr=fluid.initializer.Constant(value=0),
bias_attr=fluid.initializer.NumpyArrayInitializer(np_array),
name='fc_loc_1')
out = fluid.layers.reshape(x, shape=[-1, 2, 3])
return out
def conv_pool_layer(self,
input,
num_filters,
filter_size,
stride,
name):
conv = fluid.layers.conv2d(
input=input,
num_filters=num_filters,
filter_size=filter_size,
stride=stride,
act=None,
name=name)
pool = fluid.layers.pool2d(
input=conv,
pool_size=2,
pool_stride=2,
pool_type='max')
relu = fluid.layers.relu(pool)
return relu
test.py
import paddle
import paddle.fluid as fluid
import numpy as np
from stn import STN
def test():
input_np = np.random.randn(2, 3, 224, 224).astype(np.float32)
input = fluid.layers.create_global_var(
shape=[2, 3, 224, 224], value=0, dtype='float32', persistable=True)
fluid.layers.assign(input_np, input)
label_np = np.random.randn(2, 3, 224, 224).astype(np.float32)
label = fluid.layers.create_global_var(
shape=[2, 3, 224, 224], value=0, dtype='float32', persistable=True)
fluid.layers.assign(label_np, label)
stn = STN()
output = stn.net(input)
loss = output - label
avg_loss = fluid.layers.mean(x=loss)
optimizer = fluid.optimizer.SGD(learning_rate=0.001)
optimizer.minimize(avg_loss)
place = fluid.CUDAPlace(0)
exe = fluid.Executor(place)
exe.run(fluid.default_startup_program())
train_exe = fluid.ParallelExecutor(use_cuda=True, loss_name=avg_loss.name)
fetch_list_train = [avg_loss.name]
fluid.memory_optimize(fluid.default_main_program(), skip_opt_set=set(fetch_list_train))
for _ in xrange(10):
loss = train_exe.run(fetch_list_train)
print(loss)
test()
错误信息: W0129 16:18:19.649785 91562 device_context.cc:263] Please NOTE: device: 0, CUDA Capability: 35, Driver API Version: 9.0, Runtime API Version: 8.0 W0129 16:18:19.649894 91562 device_context.cc:271] device: 0, cuDNN Version: 5.0. W0129 16:18:19.649914 91562 device_context.cc:295] WARNING: device: 0. The installed Paddle is compiled with CUDNN 5.1, but CUDNN version in your machine is 5.0, which may cause serious incompatible bug. Please recompile or reinstall Paddle with compatible CUDNN version.