2017-04-11 408 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