具体看下面的实现,实现对多个句子进行一维卷积,并使用dandelion实现时间维度上的maxpooling。
# 学习使用lasagne 结合dandelion 进行卷积,并在时间维度上进行max pooling
import lasagne
import theano
import numpy as np
from dandelion.functional import *
def conv1d(input_length = 4,feature_size=8,num_filters = 8,filter_size=3,pad='valid',stride=1):
x = theano.tensor.tensor3(dtype=theano.config.floatX)
l_in = lasagne.layers.InputLayer(shape=(None,input_length,feature_size), #(B,T,D)
input_var=x)
l_out = lasagne.layers.DimshuffleLayer(l_in, (0,2,1))#(B,D,T)
c = lasagne.layers.Conv1DLayer(l_out, num_filters=num_filters, filter_size=filter_size, stride=stride, pad=pad)
t = lasagne.layers.DimshuffleLayer(c, (0,2,1)) #(B,new_T,num_filters)
y = lasagne.layers.get_output(t)
s = lasagne.layers.get_output_shape(t)
y = pool_1d(y, ws=s[1], mode='max', axis=-2) #(B,1,num_filters)
return theano.function([x], [y])
v3 = np.asarray([[[1, 2,4,10, 2,4,10,10], [5, 2,4,10, 2,4,10,10],[7, 6,4,10, 2,4,10,10],[7, 2,8,10, 2,4,10,10]],
[[1, 2,4,10, 2,4,10,10], [5, 2,4,10, 2,4,10,10],[7, 6,4,10, 2,4,10,10],[7, 2,8,10, 2,4,10,10]],
[[1, 2,4,10, 2,4,10,10], [5, 2,4,10, 2,4,10,10],[7, 6,4,10, 2,4,10,10],[7, 2,8,10, 2,4,10,10]],
[[4, 2,6,10, 2,4,10,10], [7, 2,4,10, 2,4,10,10],[9, 2,4,10, 2,4,10,10],[112, 2,4,10, 2,4,10,10]],
[[0, 3,4,10, 2,4,10,10], [2, 6,4,10, 2,4,10,10],[7, 2,7,15, 2,4,10,10],[23, 2,3,3, 2,4,10,10]]], dtype=np.float32)
v4 = np.asarray([7, 3,3,11], dtype=np.float32)
conv1d_fn = conv1d()
z = conv1d_fn(v3)
print(v3.shape)
print(z[0].shape)
print(z[0])