কেরাসে দুটি স্তরকে কীভাবে সংযুক্ত করতে হয়?


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'])

উত্তর:


123

আপনি ত্রুটিটি পাচ্ছেন কারণ এটি 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 which 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

অর্থাৎ সারি সবেমাত্র যুক্ত হয়েছে।

  1. এখন, x1প্রথম x2ইনপুট হয়, দ্বিতীয় এবং x3ইনপুট তৃতীয়।

আপনার উত্তরের প্রথম অংশে কীভাবে resultএবং merged(বা merged2) স্তরগুলি একে অপরের সাথে সংযুক্ত রয়েছে?
rdo

এবং দ্বিতীয় প্রশ্ন। আমি বুঝতে হিসাবে x1এবং x2জন্য একটি ইনপুট হয় first_input, x3জন্য third_input। কি সম্পর্কে second_input?
rdo

4
second_inputএকটি Denseস্তর মাধ্যমে পাস করা হয় এবং সংলগ্ন হয় first_inputযা দিয়ে একটি Denseস্তর দিয়েও গেছে । third_inputএকটি ঘন স্তর মাধ্যমে পাস করা হয় এবং পূর্ববর্তী merged
কনটেনটেশন

4
@putonspectorses ক্রিয়ামূলক API ব্যবহারের দ্বিতীয় উপায়টি অবশ্য সিক্যুয়াল-মডেল ব্যবহারের প্রথম উপায়টি আমার জন্য কেরাস ২.০.২ এ কাজ করছে না। আমি প্রায় বাস্তবায়ন পরীক্ষা করে দেখেছি এবং "কনক্যাটেনেট ([...])" কল করলে খুব বেশি কিছু হয় না এবং তদ্ব্যতীত, আপনি এটিকে অনুক্রমের মডেলটিতে যোগ করতে পারবেন না। আমি প্রকৃতপক্ষে মনে করি যে কেরাকে আপডেট না করা পর্যন্ত কারও এখনও বর্নিত পদ্ধতি "মার্জ ([...], 'কনক্যাট')" ব্যবহার করা দরকার। আপনি কি মনে করেন?
এলফিশ

4
কেরাসে Concatenate()এবং concatenate()স্তরগুলির মধ্যে পার্থক্য কী ?
লিভো

9

উপরোক্ত-স্বীকৃত উত্তরে যুক্ত করা যাতে এটি যারা ব্যবহার করছেন তাদের সহায়তা করে 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()(কনক্যাটেনেট_ এক্সএক্স (কনক্যাটেনেট) স্তর আকারটি লক্ষ্য করুন)

# 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/DipLearning/blob/master/Cancanate_two_layer_keras.ipynb


4
কেরাসে Concatenate()এবং concatenate()স্তরগুলির মধ্যে পার্থক্য কী ?
লিভো

4
আপনি কি পার্থক্যটি বুঝতে পেরেছেন, একটি কেরাস শ্রেণি এবং অন্যটি সেন্সরফ্লো পদ্ধতি
অ্যাবাকাস্রেডার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.