करस में "एक-से-कई" और "कई-से-कई" अनुक्रम भविष्यवाणी कैसे लागू करें?


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 वह जगह है जहाँ TimeDistributed को इस तरह लागू किया जाता है:

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? यदि ऐसा है, तो
    यहां RNN का उपयोग करने का क्या मतलब है जब हम
    एन समानांतर "वेनिला" के अनुमानों के साथ कई आउटपुट के साथ एक समान इनपुट का उत्पादन कर सकते हैं ?

  • RNN में टाइमस्टेप की संख्या को कैसे परिभाषित करें? यह किसी तरह
    उत्पादन अनुक्रम लंबाई के साथ सहसंबद्ध है या यह सिर्फ
    धुन करने के लिए एक हाइपरपरेट है?

  • मेरे टाइप 1 उदाहरण का सराय मामला ऊपर
    एलएसटीएम लगाने का क्या मतलब है जब मॉडल केवल एक वर्ग की भविष्यवाणी (संभव
    nb_classes) का उत्सर्जन करता है ? यदि कोई LSTM परत को छोड़ देता है तो क्या होगा?


क्या आप दोनों मॉडलों का सारांश प्रदान कर सकते हैं?
फडी बकौरा

जवाबों:


2

किसी भी आवर्तक परत का उपयोग करने की बात यह है कि आउटपुट केवल अन्य वस्तुओं से स्वतंत्र एक ही वस्तु का परिणाम नहीं है, बल्कि वस्तुओं का एक क्रम है, जैसे कि एक आइटम में परत के संचालन का आउटपुट अनुक्रम में होता है। अनुक्रम में उस आइटम और किसी भी आइटम से पहले दोनों। टाइमस्टेप्स की संख्या परिभाषित करती है कि ऐसा क्रम कितना लंबा है। यही है, कितनी वस्तुओं को एक अनुक्रम में संभाला जाना चाहिए, और एक दूसरे के परिणामी आउटपुट को प्रभावित करना चाहिए।

एक LSTM परत इस तरह से संचालित होती है कि वह फॉर्म नंबर_of_timesteps, आयाम_of_each_item पर इनपुट स्वीकार करती है। यदि पैरामीटर वापसी_ परिणाम गलत पर सेट किया गया है, जो कि यह डिफ़ॉल्ट रूप से है, तो परत एक ही आउटपुट में सभी टाइमस्टेप के इनपुट को "यौगिक" करती है। यदि आप 10 आइटम कहते हैं, तो एक अनुक्रम पर विचार करें, इस क्रम से रिटर्न टू परिणाम के साथ एक LSTM परत इस तरह के एक एकल आउटपुट आइटम का उत्पादन करेगी, और इस एकल आइटम की विशेषताएं सभी आइटम (टाइमस्टेप) के परिणामस्वरूप होंगी अनुक्रम। यह वही है जो आप कई-से-एक डिज़ाइन के मामले में चाहते हैं।

इनपुट क्रम में प्रत्येक आइटम (टाइमस्टेप) के लिए ट्रू विल के लिए सेट की गई रिटर्न_ परिणाम वाली एक एलएसटीएम परत एक आउटपुट का उत्पादन करती है। यह इस तरह से किया जाता है कि किसी भी समय पर, आउटपुट न केवल उस आइटम पर निर्भर करेगा जो वर्तमान में संचालित हो रहा है, बल्कि अनुक्रम में पिछले आइटम भी है। यह वही है जो आप कई-से-कई डिज़ाइन के मामले में चाहते हैं।

LSTM परत इनपुट के रूप में वस्तुओं का अनुक्रम लेती है, आपके मॉडल में LSTM परत से पहले किसी भी परत को आउटपुट के रूप में अनुक्रम का उत्पादन करने की आवश्यकता होगी। आपके टाइप 1 मॉडल के मामले में, पहली कुछ परतें दृश्यों पर काम नहीं करती हैं, बल्कि एक बार में एक ही आइटम। इसलिए यह उन वस्तुओं के अनुक्रम का उत्पादन नहीं करता है जिन पर LSTM संचालित होता है।

TimeDistributed का उपयोग करने से यह संभव हो जाता है कि प्रत्येक आइटम पर एक क्रम में एक परत को एक दूसरे को प्रभावित किए बिना संचालित किया जा सके। टाइमडिस्ट्रिब्यूटेड लेयर्स इस प्रकार वस्तुओं के अनुक्रमों पर काम करती हैं, लेकिन पुनरावृत्ति नहीं होती है।

आपके प्रकार 2 मॉडल के मामले में, पहली परतें 5 सीक्वेंस टाइम लंबे अनुक्रम का उत्पादन करेंगी, और अनुक्रम में प्रत्येक आइटम पर किए गए संचालन एक-दूसरे से स्वतंत्र होंगे, क्योंकि टाइमडिस्ट्रिब्यूटेड में लिपटे परत गैर-आवर्तक हैं। चूंकि LSTM परत डिफ़ॉल्ट सेटिंग्स, रिटर्न_ परिणाम = गलत का उपयोग करती है, इसलिए LSTM परत प्रत्येक 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])))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.