2017-04-11 405 views
1

是否可以使用Reshape或任何其他功能删除维度。使用keras中的重塑去除尺寸?

我有以下网络。

import keras 
from keras.layers.merge import Concatenate 
from keras.models import Model 
from keras.layers import Input, Dense 
from keras.layers import Dropout 
from keras.layers.core import Dense, Activation, Lambda, Reshape,Flatten 
from keras.layers import Conv2D, MaxPooling2D, Reshape, ZeroPadding2D 
import numpy as np 


#Number_of_splits = ((input_width-win_dim)+1)/stride_dim 
splits = ((40-5)+1)/1 
print splits 


train_data_1 = np.random.randint(100,size=(100,splits,45,5,3)) 
test_data_1 = np.random.randint(100,size=(10,splits,45,5,3)) 
labels_train_data =np.random.randint(145,size=(100,15)) 
labels_test_data =np.random.randint(145,size=(10,15)) 


list_of_input = [Input(shape = (45,5,3)) for i in range(splits)] 
list_of_conv_output = [] 
list_of_max_out = [] 
for i in range(splits): 
    list_of_conv_output.append(Conv2D(filters = 145 , kernel_size = (15,3))(list_of_input[i])) #output dim: 36x(31,3,145) 
    list_of_max_out.append((MaxPooling2D(pool_size=(2,2))(list_of_conv_output[i]))) #output dim: 36x(15,1,145) 


merge = keras.layers.concatenate(list_of_max_out) #Output dim: (15,1,5220) 
#reshape = Reshape((merge.shape[0],merge.shape[3]))(merge) # expected output dim: (15,145) 


dense1 = Dense(units = 1000, activation = 'relu', name = "dense_1")(merge) 
dense2 = Dense(units = 1000, activation = 'relu', name = "dense_2")(dense1) 
dense3 = Dense(units = 145 , activation = 'softmax', name = "dense_3")(dense2) 






model = Model(inputs = list_of_input , outputs = dense3) 
model.compile(loss="sparse_categorical_crossentropy", optimizer="adam") 


print model.summary() 


raw_input("SDasd") 
hist_current = model.fit(x = [train_input[i] for i in range(100)], 
        y = labels_train_data, 
        shuffle=False, 
        validation_data=([test_input[i] for i in range(10)], labels_test_data), 
        validation_split=0.1, 
        epochs=150000, 
        batch_size = 15, 
        verbose=1) 

的maxpooling层产生具有尺寸(15,1,36),我想移除中间轴的输出,因此,输出尺寸最终被(15,36)..

如果可能的话,我想避免指定外部维度,还是因为我尝试使用之前的图层维度来重新构建它。

#reshape = Reshape((merge.shape[0],merge.shape[3]))(merge) # expected output dim: (15,145) 

我需要我的整个网络的输出尺寸是(15,145),其中中间尺寸导致一些问题。

如何删除中间尺寸?

回答

0
reshape = Reshape((15,145))(merge) # expected output dim: (15,145) 
1

我想删除等于1的所有尺寸,但与Reshape指定特定的尺寸,以便如果我改变内核的输入大小或数量卷积我的代码不破。这适用于tensorflow后端上的功能keras API。

from keras.layers.core import Reshape 

old_layer = Conv2D(#actualArguments) (older_layer) 
#old_layer yields, e.g., a (None, 15,1,36) size tensor, where None is the batch size 

newdim = tuple([x for x in old_layer.shape.as_list() if x != 1 and x is not None]) 
#newdim is now (15, 36). Reshape does not take batch size as an input dimension. 
reshape_layer = Reshape(newdim) (old_layer) 
+0

这个问题几个月前回答了,你的答案带来了什么新的价值? –

+0

@Maciej Jureczko正如我在我的答案中所说的,它允许删除尺寸未知的1尺寸的尺寸,而不必从上一层找出输出张量的尺寸,当您更改模型参数时可以改变尺寸和输入大小。以前的回答意味着未来对你的模型的调整更加困难。 – jeremysprofile