我在 CrossValidation 上就图像解释提出了类似的问题。我在这里移动我的详细问题以包含一些代码细节。
我所拥有的结果并不完全令人满意所以也许你以前遇到过这个问题,你可以帮我找到它。
完全卷积神经网络"没有完全连接的部分"。
培训部分
首先转换图像以匹配卷积函数。 (的batch_no,img_channels,宽度,高度)
input.transpose(0, 3, 1, 2)
使用学习率优化学习:3e-6,Hu_uniform初始化和nestrove 500个时期直到这个收敛。
后退部分
载入图片
jpgfile = np.array(Image.open(join(testing_folder,img_name)))
重塑为一批
batch = jpgfile.reshape(1, jpgfile.shape[0], jpgfile.shape[1], 3)
运行模型以使用Relu
激活后提取第一个要素图
output = classifier.layer0.output
Test_model = theano.function(
inputs=[x],
outputs=output,
)
layer_Fmaps = Test_model(test_set_x)
应用背景模型,使用唯一激活的图像重建图像 神经元
bch, ch, row, col = layer_Fmaps.shape
output_grad_reshaped = layer_Fmaps.reshape((-1, 1, row, col))
output_grad_reshaped = output_grad_reshaped[0].reshape(1,1,row,col)
input_shape = (1, 3, 226, 226)
W = classifier.layer0.W.get_value()[0].reshape(1,3,7,7)
kernel = theano.shared(W)
inp = T.tensor4('inp')
deconv_out = T.nnet.abstract_conv.conv2d_grad_wrt_inputs(
output_grad = inp,
filters=kernel,
input_shape= input_shape,
filter_shape=(1,3,7,7),
border_mode=(0,0),
subsample=(1,1)
)
f = theano.function(
inputs = [inp],
outputs= deconv_out)
f_out = f(output_grad_reshaped)
deconved_relu = T.nnet.relu(f_out)[0].transpose(1,2,0)
deconved = f_out[0].transpose(1,2,0)
这里我们有两个图像结果,第一个是没有激活的转置图像,第二个是relu,因为内核可能有一些负权重。
从转置的卷积图像可以清楚地看出,该内核学会了检测与该图像相关的一些有用特征。但是重建部分在转置卷积期间打破了图像颜色方案。这可能是因为像素值是小的浮点数。你知道这里的问题在哪里吗?