2017-04-11 13 views
1

Reshapeまたはその他の機能を使用して寸法を削除することは可能ですか?kerasのreshapeを使用してディメンションを削除しますか?

私は以下のネットワークを持っています。

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層iは中央軸を除去したいので、出力の次元は(15,36)である終わる寸法(15,1,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

Iは1に等しいすべてのディメンションを削除したかったが、私はコンボリューションでカーネルの入力の大きさや数を変更した場合、自分のコードが破損しないようにReshapeで特定のサイズを指定していません。これはテンソルフローバックエンド上の機能的ケラス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

関連する問題