Kerasdagi 3D tensorli ko'mish () ni qanday ishlatish kerak?

Har birida 20 ta muddat mavjud bo'lgan aktsiya bahosi navbatlarining ro'yxati bor. Bu 2D shakli (total_seq, 20). Uni boshqa funktsiyalarga ajratish uchun (total_seq, 20, 1) formatiga o'zgartiraman.

Har bir vaqt uchun 10 so'z bilan yangiliklar sarlavhasi ham bor. Shunday qilib, Tokenizer.texts_to_sequences() va sequence.pad_sequences() dan yangiliklarning belgi qismlarining 3D majmuasi (total_seq, 20, 10) mavjud.

Yangiliklarni qimmatli qog'ozlar narxiga qo'shish va bashorat qilishni xohlayman.

Mening fikrimcha, xabarni joylashtirish shakli tensorini qaytarishi kerak   (total_seq, 20, embed_size) uchun uni birlashtira olaman   shaklning aktsiyalar narxi (total_seq, 20, 1) keyin LSTM qatlamlariga ulanadi.

     

Buni amalga oshirish uchun, men xabarning shakli (total_seq, 20, 10) ni kiritishni o'zgartiraman   (Total_seq, 20, 10, embed_size) Embedding() funksiyasidan foydalangan holda.

     

Lekin Kerasda, embedding() funktsiyasi 3D tsenar o'rniga 2 o'lchamli tensor oladi. Ushbu muammoni qanday echish mumkin?

Embedding() 3D tensorini qabul qilgandan keyin keyin 4D tensorini chiqqandan so'ng qabul qilsangiz, LSTM yordamida oxirgi o'lchamdagi so'zni kiritish uchun 3 o'lchovni olib tashlayman, shuning uchun shakli chiqishi (total_seq, 20, 10, embed_size) aylantiriladi to (total_seq, 20, embed_size)

Lekin yana bir muammo bilan duch kelaman, LSTM 4D emas, balki 3D tsenarini qabul qiladi

     

Qabul qilish va LSTM orqali kirishlarni qabul qilmasdan qanday qilib olaman?

6
Buni qanday qilish kerakligini biroz kulgili, ammo men sizga misolni yozyapman!
qo'shib qo'ydi muallif Adisak, manba
So'zlaringiz va aktsiya bahosiga qo'shilgan qiymatlarni qo'shib, jamg'armalar (total_seq, 20, 10 * embed_size + 1) kiritilgandan keyin men siz istagan narsaga emas, balki sizning muammoingizni hal qila olamanmi?
qo'shib qo'ydi muallif Adisak, manba
Bu juda oson, birlashtirilgan so'zlarni oladigan TimeDistrbuted (Dense (dim)) qo'shing. Siz bu erda konvolyutsiyani yoki RNN dan foydalanishingiz mumkin, lekin men faqatgina 10 ta so'z bilan, menimcha, Sog'lom bo'lishi mumkin. Men sizning namunangizni yangiladim, umid qilamanki, bu siz izlayotgan narsa.
qo'shib qo'ydi muallif Adisak, manba
@JanvanderVegt Iltimos, yana savolimni tekshiring. Men qo'shimcha tafsilotlar qo'shdim! Rahmat.
qo'shib qo'ydi muallif thoughtcrimes, manba
Agar har safar o'zimning xabarlarimni bitta kichik rasmga qo'shishga imkon beradigan bo'lsam, yaxshiroq bo'lar edi.
qo'shib qo'ydi muallif thoughtcrimes, manba

1 javoblar

Men bu eng yaxshi echim ekanligiga ishonchim komil emas, lekin hamma narsani birgalikda tikladim. 10 so'zlik pozitsiyalarning har birining o'zlari kiritadilar, lekin bu juda ko'p muammo emas. Fikrlash, qavatni qo'shish va bir necha marta ishlatishdir. Birinchidan, ba'zi ma'lumotlarni ishlab chiqaramiz:

n_samples = 1000
time_series_length = 50
news_words = 10
news_embedding_dim = 16
word_cardinality = 50

x_time_series = np.random.rand(n_samples, time_series_length, 1)
x_news_words = np.random.choice(np.arange(50), replace=True, size=(n_samples, time_series_length, news_words))
x_news_words = [x_news_words[:, :, i] for i in range(news_words)]
y = np.random.randint(2, size=(n_samples))

Endi qatlamlarni aniqlaymiz:

## Input of normal time series
time_series_input = Input(shape=(50, 1, ), name='time_series')

## For every word we have it's own input
news_word_inputs = [Input(shape=(50, ), name='news_word_' + str(i + 1)) for i in range(news_words)]

## Shared embedding layer
news_word_embedding = Embedding(word_cardinality, news_embedding_dim, input_length=time_series_length)

## Repeat this for every word position
news_words_embeddings = [news_word_embedding(inp) for inp in news_word_inputs]

## Concatenate the time series input and the embedding outputs
concatenated_inputs = concatenate([time_series_input] + news_words_embeddings, axis=-1)

## Feed into LSTM
lstm = LSTM(16)(concatenated_inputs)

## Output, in this case single classification
output = Dense(1, activation='sigmoid')(lstm)

Modelni tuzib bo'lgandan so'ng biz uni quyidagi tarzda moslashtira olamiz:

model.fit([x_time_series] + x_news_words, y)

EDIT:

Izohlarda aytib o'tganingizdan so'ng, siz xulosani o'z ichiga olgan zich qatlamni qo'shishingiz mumkin va bu sizga vaqt seriyasiga qo'shiladi (aktsiya bahosi):

## Summarize the news:
news_words_concat = concatenate(news_words_embeddings, axis=-1)
news_words_transformation = TimeDistributed(Dense(combined_news_embedding))(news_words_concat)

## New concat
concatenated_inputs = concatenate([time_series_input, news_words_transformation], axis=-1)
4
qo'shib qo'ydi
Muvaffaqiyatli :) omad tilaymiz!
qo'shib qo'ydi muallif Adisak, manba
Jozibasi kabi ishlaydi
qo'shib qo'ydi muallif thoughtcrimes, manba
Python
Python
372 ishtirokchilar

Bu guruh python dasturlash tilini muhokama qilish uchun. Iltimos, o'zingizni hurmat qiling va faqat dasturlash bo'yicha yozing. Botlar mavzusini @botlarhaqida guruhida muhokama qling! FAQ: @PyFAQ Offtopic: @python_uz_offtopic

Python offtopic group !
Python offtopic group !
150 ishtirokchilar

@python_uz gruppasining offtop gruppasi. offtop bo'lsa ham reklama mumkin emas ) Boshqa dasturlash tiliga oid gruppalar @languages_programming