কেরাসে "এক থেকে বহু" এবং "বহু থেকে বহু" অনুক্রমের পূর্বাভাস কীভাবে প্রয়োগ করা যায়?


13

আমি এক থেকে অনেকের জন্য কেরাস কোডিং পার্থক্য (উদাহরণস্বরূপ একক চিত্রের শ্রেণিবিন্যাস) এবং অনেকগুলি থেকে অনেকগুলি (উদাহরণস্বরূপ চিত্র সিকোয়েন্সের শ্রেণিবিন্যাস) সিক্যুয়েন্স লেবেলিংয়ের ব্যাখ্যা করার জন্য সংগ্রাম করছি। আমি প্রায়শই দুটি ভিন্ন ধরণের কোড দেখতে পাই:

টাইপ 1 এমন কোনও টাইমড্রিস্ট্রিবিউট প্রয়োগ করা হয় না:

model=Sequential()

model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1], border_mode="valid", input_shape=[1, 56,14]))
model.add(Activation("relu"))
model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1]))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=pool_size))

model.add(Reshape((56*14,)))
model.add(Dropout(0.25))
model.add(LSTM(5))
model.add(Dense(50))
model.add(Dense(nb_classes))
model.add(Activation("softmax"))

টাইপ 2 হ'ল টাইমডিস্ট্রিবিউটেড এভাবে প্রয়োগ করা হয়:

model = Sequential()

model.add(InputLayer(input_shape=(5, 224, 224, 3)))
model.add(TimeDistributed(Convolution2D(64, (3, 3))))
model.add(TimeDistributed(MaxPooling2D((2,2), strides=(2,2))))
model.add(LSTM(10))
model.add(Dense(3))

আমার প্রশ্নগুলি হ'ল:

  • আমার ধারণাটি কি সঠিক যে টাইপ 1 টি এক-একাধিক ধরণের এবং টাইপ 2 বহু-থেকে-বহু ধরণের? নাকি TimeDistributedএই দিকটির কোনও মিল নেই?

  • এক থেকে বহু বা বহু-বহু ক্ষেত্রে উভয় ক্ষেত্রেই শেষ ঘন স্তরটি 1 নোড "দীর্ঘ" বলে মনে করা হয় (পরিবর্তে কেবল একটি মান নির্গত হয়) এবং
    পূর্ববর্তী পুনরাবৃত্ত স্তরটি কতগুলি
    1-দীর্ঘ নির্ধারণ করতে দায়বদ্ধ নির্গত মূল্য? অথবা শেষ ঘন স্তরটি এন নোড নিয়ে গঠিত বলে মনে হয় কোথায় N=max sequence length? যদি তাই হয়,
    আমরা যখন
    এন সমান্তরাল "ভ্যানিলা" অনুমানকারীগুলির সাথে একাধিক আউটপুটগুলির সাথে একটি অনুরূপ ইনপুট তৈরি করতে পারি তখন আরএনএন এখানে ব্যবহার করার কী দরকার ?

  • আরএনএন-তে টাইমস্টেপের সংখ্যা কীভাবে সংজ্ঞায়িত করবেন? এটি কি কোনওভাবে
    আউটপুট সিকোয়েন্স দৈর্ঘ্যের সাথে সম্পর্কিত বা এটি
    সুর ​​করার জন্য কেবল একটি হাইপারপ্যারামিটার?

  • আমার উপরে টাইপ 1 উদাহরণের উদাহরণস্বরূপ,
    যখন মডেলটি কেবলমাত্র একটি শ্রেণির পূর্বাভাস (সম্ভাব্য
    nb_classes) প্রেরণ করে তখন এলএসটিএম প্রয়োগের বিষয়টি কী? যদি কেউ এলএসটিএম স্তর বাদ দেয় তবে কী হবে?


আপনি উভয় মডেলের সংক্ষিপ্তসার সরবরাহ করতে পারেন?
ফাদি বাকৌরা

উত্তর:


2

যে কোনও পুনরাবৃত্ত স্তর ব্যবহারের বিন্দুটি হ'ল আউটপুটটি কেবলমাত্র একটি আইটেম অন্য আইটেমের চেয়ে পৃথক নয়, বরং আইটেমগুলির ক্রম হয়, যেমন ক্রমের একটি আইটেমে স্তরটির ক্রিয়াকলাপ ফলাফল হয় ক্রমানুসারে সেই আইটেম এবং কোনও আইটেম উভয়ই। টাইমস্টেপগুলির সংখ্যা নির্ধারণ করে যে এ জাতীয় ক্রমটি কত দীর্ঘ। এটি হ'ল কতগুলি আইটেম যা ক্রমানুসারে পরিচালনা করা উচিত এবং একে অপরের ফলাফলের আউটপুটকে প্রভাবিত করে।

একটি এলএসটিএম স্তর এমনভাবে কাজ করে যে এটি সংখ্যার_আর_পরে টাইমস, মাত্রাগুলি_সামনা_সীম_র আকারের ইনপুট গ্রহণ করে। যদি প্যারামিটার রিটার্ন_সেসকেন্সগুলি মিথ্যাতে সেট করা থাকে যা এটি ডিফল্টরূপে হয় তবে স্তরটি সমস্ত টাইমস্টেপের ইনপুটগুলিকে একক আউটপুটে "সংশ্লেষ করে"। যদি আপনি 10 টি আইটেমের অনুক্রম বিবেচনা করেন, তবে মিথ্যাতে সেট করা রিটার্ন_সেসকেন্সিসহ একটি এলএসটিএম স্তর এই ধরণের ক্রম থেকে একক আউটপুট আইটেম তৈরি করে এবং এই একক আইটেমটির বৈশিষ্ট্যগুলি সমস্ত আইটেমের (টাইমস্টেপ) ফলাফল হবে ক্রম. একাধিক টু ওয়ান ডিজাইনের ক্ষেত্রে আপনি এটি চান।

ইনপুট অনুক্রমের প্রতিটি আইটেমের (টাইমস্টেপ) ট্রু উইলের সাথে সেট করে রিটার্ন_সেসকেন্স সহ একটি এলএসটিএম স্তর একটি আউটপুট উত্পাদন করে। এটি এমনভাবে করা হয় যে কোনও সময়পদ্ধতিতে আউটপুট কেবল বর্তমানে পরিচালিত আইটেমের উপর নির্ভর করে না, তবে ক্রমের আগের আইটেমগুলিতেও নির্ভর করবে। বহু-বহু-বহু নকশার ক্ষেত্রে আপনি এটি চান।

এলএসটিএম স্তর যেমন ইনপুট হিসাবে আইটেমগুলির ক্রম নেয়, আপনার মডেলের এলএসটিএম স্তরটির আগে যে কোনও স্তরকে আউটপুট হিসাবে ক্রম উত্পাদন করতে হবে produce আপনার প্রকার 1 মডেলের ক্ষেত্রে, প্রথম কয়েকটি স্তর সিকোয়েন্সগুলিতে কাজ করে না, বরং একবারে একটি আইটেম। এটি LSTM- এর জন্য পরিচালনা করতে আইটেমগুলির ক্রম তৈরি করে না।

টাইমডিস্ট্রিবিউটেড ব্যবহার করে আইটেমগুলি একে অপরকে প্রভাবিত করে না করে প্রতিটি আইটেমকে ক্রমানুসারে একটি স্তর পরিচালনা করা সম্ভব করে। টাইমড্রিবিউটেড স্তরগুলি এভাবে আইটেমগুলির ক্রমগুলিতে কাজ করে তবে কোনও পুনরাবৃত্তি হয় না।

আপনার টাইপ 2 মডেলের ক্ষেত্রে, প্রথম স্তরগুলি 5 টি বারের মতো দীর্ঘ লম্বা সিক্যুয়েন্স তৈরি করবে এবং সিকোয়েন্সের প্রতিটি আইটেমের উপর করা ক্রিয়াকলাপ একে অপরের থেকে স্বতন্ত্র হবে, যেহেতু টাইমডিস্ট্রিবিউটে মোড়ানো স্তরগুলি পুনরাবৃত্ত নয়। এলএসটিএম স্তরটি ডিফল্ট সেটিংস, রিটার্ন_সেস্কেন্সেস = মিথ্যা ব্যবহার করে, এলএসটিএম স্তরটি প্রতিটি 5 টি আইটেমের ক্রমের জন্য একক আউটপুট তৈরি করে।

আপনার মডেলটিতে আউটপুট নোডের চূড়ান্ত সংখ্যাটি ব্যবহারের ক্ষেত্রে সম্পূর্ণ নির্ভর করে। একটি একক নোড বাইনারি শ্রেণিবদ্ধকরণের মতো বা কোনও ধরণের স্কোর তৈরির জন্য উপযুক্ত।


1

আমি মনে করি আপনি আমার আগের কাজটি ব্যবহার করতে সক্ষম হতে পারেন। এই কোডটিতে আমি সাইন ওয়েভ তৈরি করি (এলোমেলো তরঙ্গদৈর্ঘ্য এবং পর্যায়ক্রমে) এবং একটি এলএসটিএমকে এই সাইন ওয়েভগুলি থেকে পয়েন্টগুলির একটি অনুক্রমের প্রশিক্ষণ দিয়েছি এবং প্রতিটি সাইন ওয়েভ সমাপ্ত 150 পয়েন্টের অনুক্রমকে আউটপুট দিচ্ছি।

এটি মডেল:

    features_num=5 
    latent_dim=40

    ##
    encoder_inputs = Input(shape=(None, features_num))
    encoded = LSTM(latent_dim, return_state=False ,return_sequences=True)(encoder_inputs)
    encoded = LSTM(latent_dim, return_state=False ,return_sequences=True)(encoded)
    encoded = LSTM(latent_dim, return_state=False ,return_sequences=True)(encoded)
    encoded = LSTM(latent_dim, return_state=True)(encoded)

    encoder = Model (input=encoder_inputs, output=encoded)
    ##

    encoder_outputs, state_h, state_c = encoder(encoder_inputs)
    encoder_states = [state_h, state_c]

    decoder_inputs=Input(shape=(1, features_num))
    decoder_lstm_1 = LSTM(latent_dim, return_sequences=True, return_state=True)
    decoder_lstm_2 = LSTM(latent_dim, return_sequences=True, return_state=True)
    decoder_lstm_3 = LSTM(latent_dim, return_sequences=True, return_state=True)
    decoder_lstm_4 = LSTM(latent_dim, return_sequences=True, return_state=True)

    decoder_dense = Dense(features_num)

    all_outputs = []
    inputs = decoder_inputs


    states_1=encoder_states
   # Place holder values:
    states_2=states_1; states_3=states_1; states_4=states_1

    for _ in range(1):
        # Run the decoder on the first timestep
        outputs_1, state_h_1, state_c_1 = decoder_lstm_1(inputs, initial_state=states_1)
        outputs_2, state_h_2, state_c_2 = decoder_lstm_2(outputs_1)
        outputs_3, state_h_3, state_c_3 = decoder_lstm_3(outputs_2)
        outputs_4, state_h_4, state_c_4 = decoder_lstm_4(outputs_3)

        # Store the current prediction (we will concatenate all predictions later)
        outputs = decoder_dense(outputs_4)
        all_outputs.append(outputs)
        # Reinject the outputs as inputs for the next loop iteration
        # as well as update the states
        inputs = outputs
        states_1 = [state_h_1, state_c_1]
        states_2 = [state_h_2, state_c_2]
        states_3 = [state_h_3, state_c_3]
        states_4 = [state_h_4, state_c_4]


    for _ in range(149):
        # Run the decoder on each timestep
        outputs_1, state_h_1, state_c_1 = decoder_lstm_1(inputs, initial_state=states_1)
        outputs_2, state_h_2, state_c_2 = decoder_lstm_2(outputs_1, initial_state=states_2)
        outputs_3, state_h_3, state_c_3 = decoder_lstm_3(outputs_2, initial_state=states_3)
        outputs_4, state_h_4, state_c_4 = decoder_lstm_4(outputs_3, initial_state=states_4)

        # Store the current prediction (we will concatenate all predictions later)
        outputs = decoder_dense(outputs_4)
        all_outputs.append(outputs)
        # Reinject the outputs as inputs for the next loop iteration
        # as well as update the states
        inputs = outputs
        states_1 = [state_h_1, state_c_1]
        states_2 = [state_h_2, state_c_2]
        states_3 = [state_h_3, state_c_3]
        states_4 = [state_h_4, state_c_4]


    # Concatenate all predictions
    decoder_outputs = Lambda(lambda x: K.concatenate(x, axis=1))(all_outputs)   

    model = Model([encoder_inputs, decoder_inputs], decoder_outputs)

    #model = load_model('pre_model.h5')


    print(model.summary())

এবং এটি সম্পূর্ণ লিপি:

from keras.models import Model
from keras.layers import Input, LSTM, Dense, TimeDistributed,Lambda, Dropout, Activation ,RepeatVector
from keras.callbacks import ModelCheckpoint 
import numpy as np

from keras.layers import Lambda
from keras import backend as K

from keras.models import load_model

import os


features_num=5 
latent_dim=40

##
encoder_inputs = Input(shape=(None, features_num))
encoded = LSTM(latent_dim, return_state=False ,return_sequences=True)(encoder_inputs)
encoded = LSTM(latent_dim, return_state=False ,return_sequences=True)(encoded)
encoded = LSTM(latent_dim, return_state=False ,return_sequences=True)(encoded)
encoded = LSTM(latent_dim, return_state=True)(encoded)

encoder = Model (input=encoder_inputs, output=encoded)
##

encoder_outputs, state_h, state_c = encoder(encoder_inputs)
encoder_states = [state_h, state_c]

decoder_inputs=Input(shape=(1, features_num))
decoder_lstm_1 = LSTM(latent_dim, return_sequences=True, return_state=True)
decoder_lstm_2 = LSTM(latent_dim, return_sequences=True, return_state=True)
decoder_lstm_3 = LSTM(latent_dim, return_sequences=True, return_state=True)
decoder_lstm_4 = LSTM(latent_dim, return_sequences=True, return_state=True)

decoder_dense = Dense(features_num)

all_outputs = []
inputs = decoder_inputs

# Place holder values:
states_1=encoder_states
states_2=states_1; states_3=states_1; states_4=states_1

for _ in range(1):
    # Run the decoder on one timestep
    outputs_1, state_h_1, state_c_1 = decoder_lstm_1(inputs, initial_state=states_1)
    outputs_2, state_h_2, state_c_2 = decoder_lstm_2(outputs_1)
    outputs_3, state_h_3, state_c_3 = decoder_lstm_3(outputs_2)
    outputs_4, state_h_4, state_c_4 = decoder_lstm_4(outputs_3)

    # Store the current prediction (we will concatenate all predictions later)
    outputs = decoder_dense(outputs_4)
    all_outputs.append(outputs)
    # Reinject the outputs as inputs for the next loop iteration
    # as well as update the states
    inputs = outputs
    states_1 = [state_h_1, state_c_1]
    states_2 = [state_h_2, state_c_2]
    states_3 = [state_h_3, state_c_3]
    states_4 = [state_h_4, state_c_4]


for _ in range(149):
    # Run the decoder on one timestep
    outputs_1, state_h_1, state_c_1 = decoder_lstm_1(inputs, initial_state=states_1)
    outputs_2, state_h_2, state_c_2 = decoder_lstm_2(outputs_1, initial_state=states_2)
    outputs_3, state_h_3, state_c_3 = decoder_lstm_3(outputs_2, initial_state=states_3)
    outputs_4, state_h_4, state_c_4 = decoder_lstm_4(outputs_3, initial_state=states_4)

    # Store the current prediction (we will concatenate all predictions later)
    outputs = decoder_dense(outputs_4)
    all_outputs.append(outputs)
    # Reinject the outputs as inputs for the next loop iteration
    # as well as update the states
    inputs = outputs
    states_1 = [state_h_1, state_c_1]
    states_2 = [state_h_2, state_c_2]
    states_3 = [state_h_3, state_c_3]
    states_4 = [state_h_4, state_c_4]


# Concatenate all predictions
decoder_outputs = Lambda(lambda x: K.concatenate(x, axis=1))(all_outputs)   

model = Model([encoder_inputs, decoder_inputs], decoder_outputs)

#model = load_model('pre_model.h5')


print(model.summary())


model.compile(loss='mean_squared_error', optimizer='adam')


def create_wavelength(min_wavelength, max_wavelength, fluxes_in_wavelength, category )  :         
#category :: 0 - train ; 2 - validate ; 4- test. 1;3;5 - dead space
    c=(category+np.random.random())/6         
    k = fluxes_in_wavelength
#
    base= (np.trunc(k*np.random.random()*(max_wavelength-min_wavelength))       +k*min_wavelength)  /k
    answer=base+c/k
    return (answer)       

def make_line(length,category):
    shift= np.random.random()
    wavelength = create_wavelength(30,10,1,category)
    a=np.arange(length)
    answer=np.sin(a/wavelength+shift)
    return answer

def make_data(seq_num,seq_len,dim,category):
    data=np.array([]).reshape(0,seq_len,dim)
    for i in range (seq_num):
        mini_data=np.array([]).reshape(0,seq_len)
        for j in range (dim):
            line = make_line(seq_len,category)
            line=line.reshape(1,seq_len)            
            mini_data=np.append(mini_data,line,axis=0)
        mini_data=np.swapaxes(mini_data,1,0)
        mini_data=mini_data.reshape(1,seq_len,dim)      
        data=np.append(data,mini_data,axis=0)
    return (data)


def train_generator():
    while True:
        sequence_length = np.random.randint(150, 300)+150       
        data=make_data(1000,sequence_length,features_num,0) # category=0 in train


    #   decoder_target_data is the same as decoder_input_data but offset by one timestep

        encoder_input_data = data[:,:-150,:] # all but last 150 

        decoder_input_data = data[:,-151,:] # the one before the last 150.
        decoder_input_data=decoder_input_data.reshape((decoder_input_data.shape[0],1,decoder_input_data.shape[1]))


        decoder_target_data = (data[:, -150:, :]) # last 150        
        yield [encoder_input_data, decoder_input_data], decoder_target_data
def val_generator():
    while True:

        sequence_length = np.random.randint(150, 300)+150       
        data=make_data(1000,sequence_length,features_num,2) # category=2 in val

        encoder_input_data = data[:,:-150,:] # all but last 150 

        decoder_input_data = data[:,-151,:] # the one before the last 150.
        decoder_input_data=decoder_input_data.reshape((decoder_input_data.shape[0],1,decoder_input_data.shape[1]))

        decoder_target_data = (data[:, -150:, :]) # last 150        
        yield [encoder_input_data, decoder_input_data], decoder_target_data

filepath_for_w= 'flux_p2p_s2s_model.h5' 
checkpointer=ModelCheckpoint(filepath_for_w, monitor='val_loss', verbose=0, save_best_only=True, mode='auto', period=1)     
model.fit_generator(train_generator(),callbacks=[checkpointer], steps_per_epoch=30, epochs=2000, verbose=1,validation_data=val_generator(),validation_steps=30)
model.save(filepath_for_w)




def predict_wave(input_wave,input_for_decoder):  # input wave= x[n,:,:], ie points except the last 150; each wave has feature_num features. run this function for all such instances (=n)   
    #print (input_wave.shape)
    #print (input_for_decoder.shape)
    pred= model.predict([input_wave,input_for_decoder])

    return pred

def predict_many_waves_from_input(x):   
    x, x2=x # x == encoder_input_data ; x==2 decoder_input_data

    instance_num= x.shape[0]


    multi_predict_collection=np.zeros((x.shape[0],150,x.shape[2]))

    for n in range(instance_num):
        input_wave=x[n,:,:].reshape(1,x.shape[1],x.shape[2])
        input_for_decoder=x2[n,:,:].reshape(1,x2.shape[1],x2.shape[2])
        wave_prediction=predict_wave(input_wave,input_for_decoder)
        multi_predict_collection[n,:,:]=wave_prediction
    return (multi_predict_collection)

def test_maker():
    if True:        
        sequence_length = np.random.randint(150, 300)+150       
        data=make_data(470,sequence_length,features_num,4) # category=4 in test

        encoder_input_data = data[:,:-150,:] # all but last 150 

        decoder_input_data = data[:,-151,:] # the one before the last 150.
        decoder_input_data=decoder_input_data.reshape((decoder_input_data.shape[0],1,decoder_input_data.shape[1]))

        decoder_target_data = (data[:, -150:, :]) # last 150        
        return [encoder_input_data, decoder_input_data],    decoder_target_data

x,y= test_maker()   



a=predict_many_waves_from_input (x) # is that right..?
x=x[0] # keep the wave (generated data except last 150 time points) 
print (x.shape)
print (y.shape)
print (a.shape)

np.save ('a.npy',a)
np.save ('y.npy',y)
np.save ('x.npy',x)



print (np.mean(np.absolute(y[:,:,0]-a[:,:,0])))
print (np.mean(np.absolute(y[:,:,1]-a[:,:,1])))
print (np.mean(np.absolute(y[:,:,2]-a[:,:,2])))
print (np.mean(np.absolute(y[:,:,3]-a[:,:,3])))
print (np.mean(np.absolute(y[:,:,4]-a[:,:,4])))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.