कैसे करे में दो परतों को समतल करना है?


96

मेरे पास दो परतों वाले तंत्रिका नेटवर्क का एक उदाहरण है। पहली परत में दो तर्क होते हैं और एक आउटपुट होता है। दूसरे को पहली परत के परिणामस्वरूप एक तर्क और एक अतिरिक्त तर्क लेना चाहिए। यह इस तरह दिखना चाहिए:

x1  x2  x3
 \  /   /
  y1   /
   \  /
    y2

इसलिए, मैंने दो परतों के साथ एक मॉडल बनाया और उन्हें मर्ज करने की कोशिश की, लेकिन यह एक त्रुटि देता है: The first layer in a Sequential model must get an "input_shape" or "batch_input_shape" argument.लाइन पर result.add(merged)

नमूना:

first = Sequential()
first.add(Dense(1, input_shape=(2,), activation='sigmoid'))

second = Sequential()
second.add(Dense(1, input_shape=(1,), activation='sigmoid'))

result = Sequential()
merged = Concatenate([first, second])
ada_grad = Adagrad(lr=0.1, epsilon=1e-08, decay=0.0)
result.add(merged)
result.compile(optimizer=ada_grad, loss=_loss_tensor, metrics=['accuracy'])

जवाबों:


122

आपको त्रुटि मिल रही है क्योंकि इसे resultपरिभाषित किया गया हैSequential() मॉडल के लिए केवल एक कंटेनर के में है और आपने इसके लिए कोई इनपुट परिभाषित नहीं किया है।

यह देखते हुए कि आप resultतीसरा इनपुट लेने के लिए क्या सेट करना चाहते हैं x3

first = Sequential()
first.add(Dense(1, input_shape=(2,), activation='sigmoid'))

second = Sequential()
second.add(Dense(1, input_shape=(1,), activation='sigmoid'))

third = Sequential()
# of course you must provide the input to result with will be your x3
third.add(Dense(1, input_shape=(1,), activation='sigmoid'))

# lets say you add a few more layers to first and second.
# concatenate them
merged = Concatenate([first, second])

# then concatenate the two outputs

result = Concatenate([merged,  third])

ada_grad = Adagrad(lr=0.1, epsilon=1e-08, decay=0.0)

result.compile(optimizer=ada_grad, loss='binary_crossentropy',
               metrics=['accuracy'])

हालाँकि, इस तरह की इनपुट संरचना वाले मॉडल के निर्माण का मेरा पसंदीदा तरीका कार्यात्मक एपीआई का उपयोग करना होगा ।

यहां आपको आरंभ करने के लिए अपनी आवश्यकताओं का कार्यान्वयन है:

from keras.models import Model
from keras.layers import Concatenate, Dense, LSTM, Input, concatenate
from keras.optimizers import Adagrad

first_input = Input(shape=(2, ))
first_dense = Dense(1, )(first_input)

second_input = Input(shape=(2, ))
second_dense = Dense(1, )(second_input)

merge_one = concatenate([first_dense, second_dense])

third_input = Input(shape=(1, ))
merge_two = concatenate([merge_one, third_input])

model = Model(inputs=[first_input, second_input, third_input], outputs=merge_two)
ada_grad = Adagrad(lr=0.1, epsilon=1e-08, decay=0.0)
model.compile(optimizer=ada_grad, loss='binary_crossentropy',
               metrics=['accuracy'])

टिप्पणियों में सवाल का जवाब देने के लिए:

1) परिणाम और विलय कैसे जुड़े हैं? आप मानते हैं कि वे कैसे समाप्‍त होते हैं।

इस तरह से काम करता है:

  a        b         c
a b c   g h i    a b c g h i
d e f   j k l    d e f j k l

यानी पंक्तियाँ अभी शामिल हैं।

2) अब, x1पहले x2पर इनपुट है, दूसरे में इनपुट है और x3तीसरे में इनपुट है।


कैसे कर रहे हैं resultऔर merged(या merged2) परतों एक दूसरे के साथ अपने जवाब के पहले भाग पर जुड़ा हुआ?
15

और दूसरा सवाल। मैं समझता हूँ के रूप में x1और x2के लिए एक इनपुट है first_input, x3के लिए third_input। किस बारे में है second_input?
रेडो

1
second_inputएक Denseपरत के माध्यम से पारित किया है और first_inputएक Denseपरत के माध्यम से पारित किया गया था, जिसके साथ समवर्ती है । third_inputएक घने परत के माध्यम से पारित कर दिया है और पिछले संयोजन का परिणाम साथ concatenated ( merged)
parsethis

2
@putonspectacles कार्यात्मक एपीआई का उपयोग करने का दूसरा तरीका है, हालांकि, सेक्शनल-मॉडल का उपयोग करने का पहला तरीका मेरे लिए केरस 2.0.2 में काम नहीं कर रहा है। मैंने मोटे तौर पर कार्यान्वयन की जाँच की है और "कॉनसैटनेट ([...])" को कॉल नहीं किया है और इसके अलावा, आप इसे एक अनुक्रमिक मॉडल में नहीं जोड़ सकते हैं। मुझे वास्तव में लगता है कि किसी को अभी भी "मर्ज ([...], 'कॉनकट') का उपयोग करने की जरूरत है, जब तक कि वे केर को अपडेट नहीं करते। तुम क्या सोचते हो?
LFish

2
केरस में Concatenate()और concatenate()परतों में क्या अंतर है ?
लीवो

8

उपरोक्त स्वीकृत उत्तर को जोड़ना ताकि यह उन लोगों की मदद करे जो उपयोग कर रहे हैं tensorflow 2.0


import tensorflow as tf

# some data
c1 = tf.constant([[1, 1, 1], [2, 2, 2]], dtype=tf.float32)
c2 = tf.constant([[2, 2, 2], [3, 3, 3]], dtype=tf.float32)
c3 = tf.constant([[3, 3, 3], [4, 4, 4]], dtype=tf.float32)

# bake layers x1, x2, x3
x1 = tf.keras.layers.Dense(10)(c1)
x2 = tf.keras.layers.Dense(10)(c2)
x3 = tf.keras.layers.Dense(10)(c3)

# merged layer y1
y1 = tf.keras.layers.Concatenate(axis=1)([x1, x2])

# merged layer y2
y2 = tf.keras.layers.Concatenate(axis=1)([y1, x3])

# print info
print("-"*30)
print("x1", x1.shape, "x2", x2.shape, "x3", x3.shape)
print("y1", y1.shape)
print("y2", y2.shape)
print("-"*30)

परिणाम:

------------------------------
x1 (2, 10) x2 (2, 10) x3 (2, 10)
y1 (2, 20)
y2 (2, 30)
------------------------------

7

आप के साथ प्रयोग कर सकते हैं model.summary()(concatenate_XX (समसामयिक) परत आकार नोटिस)

# merge samples, two input must be same shape
inp1 = Input(shape=(10,32))
inp2 = Input(shape=(10,32))
cc1 = concatenate([inp1, inp2],axis=0) # Merge data must same row column
output = Dense(30, activation='relu')(cc1)
model = Model(inputs=[inp1, inp2], outputs=output)
model.summary()

# merge row must same column size
inp1 = Input(shape=(20,10))
inp2 = Input(shape=(32,10))
cc1 = concatenate([inp1, inp2],axis=1)
output = Dense(30, activation='relu')(cc1)
model = Model(inputs=[inp1, inp2], outputs=output)
model.summary()

# merge column must same row size
inp1 = Input(shape=(10,20))
inp2 = Input(shape=(10,32))
cc1 = concatenate([inp1, inp2],axis=1)
output = Dense(30, activation='relu')(cc1)
model = Model(inputs=[inp1, inp2], outputs=output)
model.summary()

आप विस्तार से देखने के लिए यहां नोटबुक देख सकते हैं: https://nbviewer.jupyter.org/github/anhhh11/DeepLearning/blob/master/Concanate_two_layer_keras.ipbb


3
केरस में Concatenate()और concatenate()परतों में क्या अंतर है ?
लीवो

1
क्या आपने अंतर का पता लगाया है, एक केरस वर्ग है और दूसरा एक टेंसरफ्लो विधि है
abacusreader
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.