Upload folder using huggingface_hub
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- .gitattributes +11 -0
- cache/models--facebook--musicgen-small/blobs/1bdc99d43eb6c775967df24b65b0a9f847c0907e95664698d93b5a1c35f5090d +3 -0
- cache/models--facebook--musicgen-small/blobs/45e996eaadd56e1cdaab46cb5e97d295541d40a3 +10 -0
- cache/models--facebook--musicgen-small/blobs/9664ce3a7ca28d1084f10413971b54481198589a +298 -0
- cache/models--facebook--musicgen-small/refs/main +1 -0
- cache/models--facebook--musicgen-small/snapshots/51027f0bee8489c1750a7b8a4806894ab2e7dc4d/config.json +298 -0
- cache/models--facebook--musicgen-small/snapshots/51027f0bee8489c1750a7b8a4806894ab2e7dc4d/generation_config.json +10 -0
- cache/models--facebook--musicgen-small/snapshots/51027f0bee8489c1750a7b8a4806894ab2e7dc4d/model.safetensors +3 -0
- data/encodec32khz_testing_embeds_sorted.npy +3 -0
- data/encodec32khz_training_embeds_sorted.npy +3 -0
- data/encodec_test_embeds.npy +3 -0
- data/encodec_testing_embeds_sorted.npy +3 -0
- data/encodec_training_embeds.npy +3 -0
- data/encodec_training_embeds_sorted.npy +3 -0
- data/sub-001_Resp_Test.npy +3 -0
- data/sub-001_Resp_Test_Mean.npy +3 -0
- data/sub-001_Resp_Training.npy +3 -0
- src/.ipynb_checkpoints/Copy_of_MusicGen-checkpoint.ipynb +0 -0
- src/.ipynb_checkpoints/MLP-model copy-checkpoint.ipynb +582 -0
- src/.ipynb_checkpoints/MLP-model-checkpoint.ipynb +449 -0
- src/.ipynb_checkpoints/MLPencoder-checkpoint.ipynb +0 -0
- src/.ipynb_checkpoints/mlpdummy-checkpoint.py +146 -0
- src/.ipynb_checkpoints/musicgen_test copy-checkpoint.ipynb +0 -0
- src/Copy_of_MusicGen.ipynb +0 -0
- src/MLP-model copy.ipynb +581 -0
- src/MLP-model.ipynb +448 -0
- src/MLPencoder.ipynb +0 -0
- src/b2m-ckpt1 +0 -0
- src/b2m-ckpt1.pt +3 -0
- src/mlpdummy.py +146 -0
- src/musicgen_test copy.ipynb +0 -0
- src/musicgen_test.ipynb +0 -0
- src/outputs_train0.pt +3 -0
- src/outputs_train1.pt +3 -0
- src/outputs_train10.pt +3 -0
- src/outputs_train11.pt +3 -0
- src/outputs_train12.pt +3 -0
- src/outputs_train13.pt +3 -0
- src/outputs_train14.pt +3 -0
- src/outputs_train15.pt +3 -0
- src/outputs_train16.pt +3 -0
- src/outputs_train17.pt +3 -0
- src/outputs_train18.pt +3 -0
- src/outputs_train19.pt +3 -0
- src/outputs_train2.pt +3 -0
- src/outputs_train20.pt +3 -0
- src/outputs_train21.pt +3 -0
- src/outputs_train22.pt +3 -0
- src/outputs_train23.pt +3 -0
- src/outputs_train24.pt +3 -0
.gitattributes
CHANGED
@@ -33,3 +33,14 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
36 |
+
cache/models--facebook--musicgen-small/blobs/1bdc99d43eb6c775967df24b65b0a9f847c0907e95664698d93b5a1c35f5090d filter=lfs diff=lfs merge=lfs -text
|
37 |
+
src/playground.ipynb filter=lfs diff=lfs merge=lfs -text
|
38 |
+
src/wandb/latest-run/run-jggbeix7.wandb filter=lfs diff=lfs merge=lfs -text
|
39 |
+
src/wandb/run-20230831_163543-sqaecwr8/run-sqaecwr8.wandb filter=lfs diff=lfs merge=lfs -text
|
40 |
+
src/wandb/run-20230831_165224-f6iksuh9/run-f6iksuh9.wandb filter=lfs diff=lfs merge=lfs -text
|
41 |
+
src/wandb/run-20230831_200743-4bm6v8ps/run-4bm6v8ps.wandb filter=lfs diff=lfs merge=lfs -text
|
42 |
+
src/wandb/run-20230831_203013-sdb63g4i/run-sdb63g4i.wandb filter=lfs diff=lfs merge=lfs -text
|
43 |
+
src/wandb/run-20230831_220330-mf53e4vk/run-mf53e4vk.wandb filter=lfs diff=lfs merge=lfs -text
|
44 |
+
src/wandb/run-20230901_003519-kxdc1ebl/run-kxdc1ebl.wandb filter=lfs diff=lfs merge=lfs -text
|
45 |
+
src/wandb/run-20230901_011334-pej3kex1/run-pej3kex1.wandb filter=lfs diff=lfs merge=lfs -text
|
46 |
+
src/wandb/run-20230908_042527-jggbeix7/run-jggbeix7.wandb filter=lfs diff=lfs merge=lfs -text
|
cache/models--facebook--musicgen-small/blobs/1bdc99d43eb6c775967df24b65b0a9f847c0907e95664698d93b5a1c35f5090d
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:1bdc99d43eb6c775967df24b65b0a9f847c0907e95664698d93b5a1c35f5090d
|
3 |
+
size 2364427288
|
cache/models--facebook--musicgen-small/blobs/45e996eaadd56e1cdaab46cb5e97d295541d40a3
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"_from_model_config": true,
|
3 |
+
"bos_token_id": 2048,
|
4 |
+
"decoder_start_token_id": 2048,
|
5 |
+
"do_sample": true,
|
6 |
+
"guidance_scale": 3.0,
|
7 |
+
"max_length": 1500,
|
8 |
+
"pad_token_id": 2048,
|
9 |
+
"transformers_version": "4.31.0.dev0"
|
10 |
+
}
|
cache/models--facebook--musicgen-small/blobs/9664ce3a7ca28d1084f10413971b54481198589a
ADDED
@@ -0,0 +1,298 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"_commit_hash": null,
|
3 |
+
"architectures": [
|
4 |
+
"MusicgenForConditionalGeneration"
|
5 |
+
],
|
6 |
+
"audio_encoder": {
|
7 |
+
"_name_or_path": "facebook/encodec_32khz",
|
8 |
+
"add_cross_attention": false,
|
9 |
+
"architectures": [
|
10 |
+
"EncodecModel"
|
11 |
+
],
|
12 |
+
"audio_channels": 1,
|
13 |
+
"bad_words_ids": null,
|
14 |
+
"begin_suppress_tokens": null,
|
15 |
+
"bos_token_id": null,
|
16 |
+
"chunk_length_s": null,
|
17 |
+
"chunk_size_feed_forward": 0,
|
18 |
+
"codebook_dim": 128,
|
19 |
+
"codebook_size": 2048,
|
20 |
+
"compress": 2,
|
21 |
+
"cross_attention_hidden_size": null,
|
22 |
+
"decoder_start_token_id": null,
|
23 |
+
"dilation_growth_rate": 2,
|
24 |
+
"diversity_penalty": 0.0,
|
25 |
+
"do_sample": false,
|
26 |
+
"early_stopping": false,
|
27 |
+
"encoder_no_repeat_ngram_size": 0,
|
28 |
+
"eos_token_id": null,
|
29 |
+
"exponential_decay_length_penalty": null,
|
30 |
+
"finetuning_task": null,
|
31 |
+
"forced_bos_token_id": null,
|
32 |
+
"forced_eos_token_id": null,
|
33 |
+
"hidden_size": 128,
|
34 |
+
"id2label": {
|
35 |
+
"0": "LABEL_0",
|
36 |
+
"1": "LABEL_1"
|
37 |
+
},
|
38 |
+
"is_decoder": false,
|
39 |
+
"is_encoder_decoder": false,
|
40 |
+
"kernel_size": 7,
|
41 |
+
"label2id": {
|
42 |
+
"LABEL_0": 0,
|
43 |
+
"LABEL_1": 1
|
44 |
+
},
|
45 |
+
"last_kernel_size": 7,
|
46 |
+
"length_penalty": 1.0,
|
47 |
+
"max_length": 20,
|
48 |
+
"min_length": 0,
|
49 |
+
"model_type": "encodec",
|
50 |
+
"no_repeat_ngram_size": 0,
|
51 |
+
"norm_type": "weight_norm",
|
52 |
+
"normalize": false,
|
53 |
+
"num_beam_groups": 1,
|
54 |
+
"num_beams": 1,
|
55 |
+
"num_filters": 64,
|
56 |
+
"num_lstm_layers": 2,
|
57 |
+
"num_residual_layers": 1,
|
58 |
+
"num_return_sequences": 1,
|
59 |
+
"output_attentions": false,
|
60 |
+
"output_hidden_states": false,
|
61 |
+
"output_scores": false,
|
62 |
+
"overlap": null,
|
63 |
+
"pad_mode": "reflect",
|
64 |
+
"pad_token_id": null,
|
65 |
+
"prefix": null,
|
66 |
+
"problem_type": null,
|
67 |
+
"pruned_heads": {},
|
68 |
+
"remove_invalid_values": false,
|
69 |
+
"repetition_penalty": 1.0,
|
70 |
+
"residual_kernel_size": 3,
|
71 |
+
"return_dict": true,
|
72 |
+
"return_dict_in_generate": false,
|
73 |
+
"sampling_rate": 32000,
|
74 |
+
"sep_token_id": null,
|
75 |
+
"suppress_tokens": null,
|
76 |
+
"target_bandwidths": [
|
77 |
+
2.2
|
78 |
+
],
|
79 |
+
"task_specific_params": null,
|
80 |
+
"temperature": 1.0,
|
81 |
+
"tf_legacy_loss": false,
|
82 |
+
"tie_encoder_decoder": false,
|
83 |
+
"tie_word_embeddings": true,
|
84 |
+
"tokenizer_class": null,
|
85 |
+
"top_k": 50,
|
86 |
+
"top_p": 1.0,
|
87 |
+
"torch_dtype": "float32",
|
88 |
+
"torchscript": false,
|
89 |
+
"transformers_version": "4.31.0.dev0",
|
90 |
+
"trim_right_ratio": 1.0,
|
91 |
+
"typical_p": 1.0,
|
92 |
+
"upsampling_ratios": [
|
93 |
+
8,
|
94 |
+
5,
|
95 |
+
4,
|
96 |
+
4
|
97 |
+
],
|
98 |
+
"use_bfloat16": false,
|
99 |
+
"use_causal_conv": false,
|
100 |
+
"use_conv_shortcut": false
|
101 |
+
},
|
102 |
+
"decoder": {
|
103 |
+
"_name_or_path": "",
|
104 |
+
"activation_dropout": 0.0,
|
105 |
+
"activation_function": "gelu",
|
106 |
+
"add_cross_attention": false,
|
107 |
+
"architectures": null,
|
108 |
+
"attention_dropout": 0.0,
|
109 |
+
"bad_words_ids": null,
|
110 |
+
"begin_suppress_tokens": null,
|
111 |
+
"bos_token_id": 2048,
|
112 |
+
"chunk_size_feed_forward": 0,
|
113 |
+
"classifier_dropout": 0.0,
|
114 |
+
"cross_attention_hidden_size": null,
|
115 |
+
"decoder_start_token_id": null,
|
116 |
+
"diversity_penalty": 0.0,
|
117 |
+
"do_sample": false,
|
118 |
+
"dropout": 0.1,
|
119 |
+
"early_stopping": false,
|
120 |
+
"encoder_no_repeat_ngram_size": 0,
|
121 |
+
"eos_token_id": null,
|
122 |
+
"exponential_decay_length_penalty": null,
|
123 |
+
"ffn_dim": 4096,
|
124 |
+
"finetuning_task": null,
|
125 |
+
"forced_bos_token_id": null,
|
126 |
+
"forced_eos_token_id": null,
|
127 |
+
"hidden_size": 1024,
|
128 |
+
"id2label": {
|
129 |
+
"0": "LABEL_0",
|
130 |
+
"1": "LABEL_1"
|
131 |
+
},
|
132 |
+
"initializer_factor": 0.02,
|
133 |
+
"is_decoder": false,
|
134 |
+
"is_encoder_decoder": false,
|
135 |
+
"label2id": {
|
136 |
+
"LABEL_0": 0,
|
137 |
+
"LABEL_1": 1
|
138 |
+
},
|
139 |
+
"layerdrop": 0.0,
|
140 |
+
"length_penalty": 1.0,
|
141 |
+
"max_length": 20,
|
142 |
+
"max_position_embeddings": 2048,
|
143 |
+
"min_length": 0,
|
144 |
+
"model_type": "musicgen_decoder",
|
145 |
+
"no_repeat_ngram_size": 0,
|
146 |
+
"num_attention_heads": 16,
|
147 |
+
"num_beam_groups": 1,
|
148 |
+
"num_beams": 1,
|
149 |
+
"num_codebooks": 4,
|
150 |
+
"num_hidden_layers": 24,
|
151 |
+
"num_return_sequences": 1,
|
152 |
+
"output_attentions": false,
|
153 |
+
"output_hidden_states": false,
|
154 |
+
"output_scores": false,
|
155 |
+
"pad_token_id": 2048,
|
156 |
+
"prefix": null,
|
157 |
+
"problem_type": null,
|
158 |
+
"pruned_heads": {},
|
159 |
+
"remove_invalid_values": false,
|
160 |
+
"repetition_penalty": 1.0,
|
161 |
+
"return_dict": true,
|
162 |
+
"return_dict_in_generate": false,
|
163 |
+
"scale_embedding": false,
|
164 |
+
"sep_token_id": null,
|
165 |
+
"suppress_tokens": null,
|
166 |
+
"task_specific_params": null,
|
167 |
+
"temperature": 1.0,
|
168 |
+
"tf_legacy_loss": false,
|
169 |
+
"tie_encoder_decoder": false,
|
170 |
+
"tie_word_embeddings": false,
|
171 |
+
"tokenizer_class": null,
|
172 |
+
"top_k": 50,
|
173 |
+
"top_p": 1.0,
|
174 |
+
"torch_dtype": null,
|
175 |
+
"torchscript": false,
|
176 |
+
"transformers_version": "4.31.0.dev0",
|
177 |
+
"typical_p": 1.0,
|
178 |
+
"use_bfloat16": false,
|
179 |
+
"use_cache": true,
|
180 |
+
"vocab_size": 2048
|
181 |
+
},
|
182 |
+
"is_encoder_decoder": true,
|
183 |
+
"model_type": "musicgen",
|
184 |
+
"text_encoder": {
|
185 |
+
"_name_or_path": "t5-base",
|
186 |
+
"add_cross_attention": false,
|
187 |
+
"architectures": [
|
188 |
+
"T5ForConditionalGeneration"
|
189 |
+
],
|
190 |
+
"bad_words_ids": null,
|
191 |
+
"begin_suppress_tokens": null,
|
192 |
+
"bos_token_id": null,
|
193 |
+
"chunk_size_feed_forward": 0,
|
194 |
+
"cross_attention_hidden_size": null,
|
195 |
+
"d_ff": 3072,
|
196 |
+
"d_kv": 64,
|
197 |
+
"d_model": 768,
|
198 |
+
"decoder_start_token_id": 0,
|
199 |
+
"dense_act_fn": "relu",
|
200 |
+
"diversity_penalty": 0.0,
|
201 |
+
"do_sample": false,
|
202 |
+
"dropout_rate": 0.1,
|
203 |
+
"early_stopping": false,
|
204 |
+
"encoder_no_repeat_ngram_size": 0,
|
205 |
+
"eos_token_id": 1,
|
206 |
+
"exponential_decay_length_penalty": null,
|
207 |
+
"feed_forward_proj": "relu",
|
208 |
+
"finetuning_task": null,
|
209 |
+
"forced_bos_token_id": null,
|
210 |
+
"forced_eos_token_id": null,
|
211 |
+
"id2label": {
|
212 |
+
"0": "LABEL_0",
|
213 |
+
"1": "LABEL_1"
|
214 |
+
},
|
215 |
+
"initializer_factor": 1.0,
|
216 |
+
"is_decoder": false,
|
217 |
+
"is_encoder_decoder": true,
|
218 |
+
"is_gated_act": false,
|
219 |
+
"label2id": {
|
220 |
+
"LABEL_0": 0,
|
221 |
+
"LABEL_1": 1
|
222 |
+
},
|
223 |
+
"layer_norm_epsilon": 1e-06,
|
224 |
+
"length_penalty": 1.0,
|
225 |
+
"max_length": 20,
|
226 |
+
"min_length": 0,
|
227 |
+
"model_type": "t5",
|
228 |
+
"n_positions": 512,
|
229 |
+
"no_repeat_ngram_size": 0,
|
230 |
+
"num_beam_groups": 1,
|
231 |
+
"num_beams": 1,
|
232 |
+
"num_decoder_layers": 12,
|
233 |
+
"num_heads": 12,
|
234 |
+
"num_layers": 12,
|
235 |
+
"num_return_sequences": 1,
|
236 |
+
"output_attentions": false,
|
237 |
+
"output_hidden_states": false,
|
238 |
+
"output_past": true,
|
239 |
+
"output_scores": false,
|
240 |
+
"pad_token_id": 0,
|
241 |
+
"prefix": null,
|
242 |
+
"problem_type": null,
|
243 |
+
"pruned_heads": {},
|
244 |
+
"relative_attention_max_distance": 128,
|
245 |
+
"relative_attention_num_buckets": 32,
|
246 |
+
"remove_invalid_values": false,
|
247 |
+
"repetition_penalty": 1.0,
|
248 |
+
"return_dict": true,
|
249 |
+
"return_dict_in_generate": false,
|
250 |
+
"sep_token_id": null,
|
251 |
+
"suppress_tokens": null,
|
252 |
+
"task_specific_params": {
|
253 |
+
"summarization": {
|
254 |
+
"early_stopping": true,
|
255 |
+
"length_penalty": 2.0,
|
256 |
+
"max_length": 200,
|
257 |
+
"min_length": 30,
|
258 |
+
"no_repeat_ngram_size": 3,
|
259 |
+
"num_beams": 4,
|
260 |
+
"prefix": "summarize: "
|
261 |
+
},
|
262 |
+
"translation_en_to_de": {
|
263 |
+
"early_stopping": true,
|
264 |
+
"max_length": 300,
|
265 |
+
"num_beams": 4,
|
266 |
+
"prefix": "translate English to German: "
|
267 |
+
},
|
268 |
+
"translation_en_to_fr": {
|
269 |
+
"early_stopping": true,
|
270 |
+
"max_length": 300,
|
271 |
+
"num_beams": 4,
|
272 |
+
"prefix": "translate English to French: "
|
273 |
+
},
|
274 |
+
"translation_en_to_ro": {
|
275 |
+
"early_stopping": true,
|
276 |
+
"max_length": 300,
|
277 |
+
"num_beams": 4,
|
278 |
+
"prefix": "translate English to Romanian: "
|
279 |
+
}
|
280 |
+
},
|
281 |
+
"temperature": 1.0,
|
282 |
+
"tf_legacy_loss": false,
|
283 |
+
"tie_encoder_decoder": false,
|
284 |
+
"tie_word_embeddings": true,
|
285 |
+
"tokenizer_class": null,
|
286 |
+
"top_k": 50,
|
287 |
+
"top_p": 1.0,
|
288 |
+
"torch_dtype": null,
|
289 |
+
"torchscript": false,
|
290 |
+
"transformers_version": "4.31.0.dev0",
|
291 |
+
"typical_p": 1.0,
|
292 |
+
"use_bfloat16": false,
|
293 |
+
"use_cache": true,
|
294 |
+
"vocab_size": 32128
|
295 |
+
},
|
296 |
+
"torch_dtype": "float32",
|
297 |
+
"transformers_version": null
|
298 |
+
}
|
cache/models--facebook--musicgen-small/refs/main
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
51027f0bee8489c1750a7b8a4806894ab2e7dc4d
|
cache/models--facebook--musicgen-small/snapshots/51027f0bee8489c1750a7b8a4806894ab2e7dc4d/config.json
ADDED
@@ -0,0 +1,298 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"_commit_hash": null,
|
3 |
+
"architectures": [
|
4 |
+
"MusicgenForConditionalGeneration"
|
5 |
+
],
|
6 |
+
"audio_encoder": {
|
7 |
+
"_name_or_path": "facebook/encodec_32khz",
|
8 |
+
"add_cross_attention": false,
|
9 |
+
"architectures": [
|
10 |
+
"EncodecModel"
|
11 |
+
],
|
12 |
+
"audio_channels": 1,
|
13 |
+
"bad_words_ids": null,
|
14 |
+
"begin_suppress_tokens": null,
|
15 |
+
"bos_token_id": null,
|
16 |
+
"chunk_length_s": null,
|
17 |
+
"chunk_size_feed_forward": 0,
|
18 |
+
"codebook_dim": 128,
|
19 |
+
"codebook_size": 2048,
|
20 |
+
"compress": 2,
|
21 |
+
"cross_attention_hidden_size": null,
|
22 |
+
"decoder_start_token_id": null,
|
23 |
+
"dilation_growth_rate": 2,
|
24 |
+
"diversity_penalty": 0.0,
|
25 |
+
"do_sample": false,
|
26 |
+
"early_stopping": false,
|
27 |
+
"encoder_no_repeat_ngram_size": 0,
|
28 |
+
"eos_token_id": null,
|
29 |
+
"exponential_decay_length_penalty": null,
|
30 |
+
"finetuning_task": null,
|
31 |
+
"forced_bos_token_id": null,
|
32 |
+
"forced_eos_token_id": null,
|
33 |
+
"hidden_size": 128,
|
34 |
+
"id2label": {
|
35 |
+
"0": "LABEL_0",
|
36 |
+
"1": "LABEL_1"
|
37 |
+
},
|
38 |
+
"is_decoder": false,
|
39 |
+
"is_encoder_decoder": false,
|
40 |
+
"kernel_size": 7,
|
41 |
+
"label2id": {
|
42 |
+
"LABEL_0": 0,
|
43 |
+
"LABEL_1": 1
|
44 |
+
},
|
45 |
+
"last_kernel_size": 7,
|
46 |
+
"length_penalty": 1.0,
|
47 |
+
"max_length": 20,
|
48 |
+
"min_length": 0,
|
49 |
+
"model_type": "encodec",
|
50 |
+
"no_repeat_ngram_size": 0,
|
51 |
+
"norm_type": "weight_norm",
|
52 |
+
"normalize": false,
|
53 |
+
"num_beam_groups": 1,
|
54 |
+
"num_beams": 1,
|
55 |
+
"num_filters": 64,
|
56 |
+
"num_lstm_layers": 2,
|
57 |
+
"num_residual_layers": 1,
|
58 |
+
"num_return_sequences": 1,
|
59 |
+
"output_attentions": false,
|
60 |
+
"output_hidden_states": false,
|
61 |
+
"output_scores": false,
|
62 |
+
"overlap": null,
|
63 |
+
"pad_mode": "reflect",
|
64 |
+
"pad_token_id": null,
|
65 |
+
"prefix": null,
|
66 |
+
"problem_type": null,
|
67 |
+
"pruned_heads": {},
|
68 |
+
"remove_invalid_values": false,
|
69 |
+
"repetition_penalty": 1.0,
|
70 |
+
"residual_kernel_size": 3,
|
71 |
+
"return_dict": true,
|
72 |
+
"return_dict_in_generate": false,
|
73 |
+
"sampling_rate": 32000,
|
74 |
+
"sep_token_id": null,
|
75 |
+
"suppress_tokens": null,
|
76 |
+
"target_bandwidths": [
|
77 |
+
2.2
|
78 |
+
],
|
79 |
+
"task_specific_params": null,
|
80 |
+
"temperature": 1.0,
|
81 |
+
"tf_legacy_loss": false,
|
82 |
+
"tie_encoder_decoder": false,
|
83 |
+
"tie_word_embeddings": true,
|
84 |
+
"tokenizer_class": null,
|
85 |
+
"top_k": 50,
|
86 |
+
"top_p": 1.0,
|
87 |
+
"torch_dtype": "float32",
|
88 |
+
"torchscript": false,
|
89 |
+
"transformers_version": "4.31.0.dev0",
|
90 |
+
"trim_right_ratio": 1.0,
|
91 |
+
"typical_p": 1.0,
|
92 |
+
"upsampling_ratios": [
|
93 |
+
8,
|
94 |
+
5,
|
95 |
+
4,
|
96 |
+
4
|
97 |
+
],
|
98 |
+
"use_bfloat16": false,
|
99 |
+
"use_causal_conv": false,
|
100 |
+
"use_conv_shortcut": false
|
101 |
+
},
|
102 |
+
"decoder": {
|
103 |
+
"_name_or_path": "",
|
104 |
+
"activation_dropout": 0.0,
|
105 |
+
"activation_function": "gelu",
|
106 |
+
"add_cross_attention": false,
|
107 |
+
"architectures": null,
|
108 |
+
"attention_dropout": 0.0,
|
109 |
+
"bad_words_ids": null,
|
110 |
+
"begin_suppress_tokens": null,
|
111 |
+
"bos_token_id": 2048,
|
112 |
+
"chunk_size_feed_forward": 0,
|
113 |
+
"classifier_dropout": 0.0,
|
114 |
+
"cross_attention_hidden_size": null,
|
115 |
+
"decoder_start_token_id": null,
|
116 |
+
"diversity_penalty": 0.0,
|
117 |
+
"do_sample": false,
|
118 |
+
"dropout": 0.1,
|
119 |
+
"early_stopping": false,
|
120 |
+
"encoder_no_repeat_ngram_size": 0,
|
121 |
+
"eos_token_id": null,
|
122 |
+
"exponential_decay_length_penalty": null,
|
123 |
+
"ffn_dim": 4096,
|
124 |
+
"finetuning_task": null,
|
125 |
+
"forced_bos_token_id": null,
|
126 |
+
"forced_eos_token_id": null,
|
127 |
+
"hidden_size": 1024,
|
128 |
+
"id2label": {
|
129 |
+
"0": "LABEL_0",
|
130 |
+
"1": "LABEL_1"
|
131 |
+
},
|
132 |
+
"initializer_factor": 0.02,
|
133 |
+
"is_decoder": false,
|
134 |
+
"is_encoder_decoder": false,
|
135 |
+
"label2id": {
|
136 |
+
"LABEL_0": 0,
|
137 |
+
"LABEL_1": 1
|
138 |
+
},
|
139 |
+
"layerdrop": 0.0,
|
140 |
+
"length_penalty": 1.0,
|
141 |
+
"max_length": 20,
|
142 |
+
"max_position_embeddings": 2048,
|
143 |
+
"min_length": 0,
|
144 |
+
"model_type": "musicgen_decoder",
|
145 |
+
"no_repeat_ngram_size": 0,
|
146 |
+
"num_attention_heads": 16,
|
147 |
+
"num_beam_groups": 1,
|
148 |
+
"num_beams": 1,
|
149 |
+
"num_codebooks": 4,
|
150 |
+
"num_hidden_layers": 24,
|
151 |
+
"num_return_sequences": 1,
|
152 |
+
"output_attentions": false,
|
153 |
+
"output_hidden_states": false,
|
154 |
+
"output_scores": false,
|
155 |
+
"pad_token_id": 2048,
|
156 |
+
"prefix": null,
|
157 |
+
"problem_type": null,
|
158 |
+
"pruned_heads": {},
|
159 |
+
"remove_invalid_values": false,
|
160 |
+
"repetition_penalty": 1.0,
|
161 |
+
"return_dict": true,
|
162 |
+
"return_dict_in_generate": false,
|
163 |
+
"scale_embedding": false,
|
164 |
+
"sep_token_id": null,
|
165 |
+
"suppress_tokens": null,
|
166 |
+
"task_specific_params": null,
|
167 |
+
"temperature": 1.0,
|
168 |
+
"tf_legacy_loss": false,
|
169 |
+
"tie_encoder_decoder": false,
|
170 |
+
"tie_word_embeddings": false,
|
171 |
+
"tokenizer_class": null,
|
172 |
+
"top_k": 50,
|
173 |
+
"top_p": 1.0,
|
174 |
+
"torch_dtype": null,
|
175 |
+
"torchscript": false,
|
176 |
+
"transformers_version": "4.31.0.dev0",
|
177 |
+
"typical_p": 1.0,
|
178 |
+
"use_bfloat16": false,
|
179 |
+
"use_cache": true,
|
180 |
+
"vocab_size": 2048
|
181 |
+
},
|
182 |
+
"is_encoder_decoder": true,
|
183 |
+
"model_type": "musicgen",
|
184 |
+
"text_encoder": {
|
185 |
+
"_name_or_path": "t5-base",
|
186 |
+
"add_cross_attention": false,
|
187 |
+
"architectures": [
|
188 |
+
"T5ForConditionalGeneration"
|
189 |
+
],
|
190 |
+
"bad_words_ids": null,
|
191 |
+
"begin_suppress_tokens": null,
|
192 |
+
"bos_token_id": null,
|
193 |
+
"chunk_size_feed_forward": 0,
|
194 |
+
"cross_attention_hidden_size": null,
|
195 |
+
"d_ff": 3072,
|
196 |
+
"d_kv": 64,
|
197 |
+
"d_model": 768,
|
198 |
+
"decoder_start_token_id": 0,
|
199 |
+
"dense_act_fn": "relu",
|
200 |
+
"diversity_penalty": 0.0,
|
201 |
+
"do_sample": false,
|
202 |
+
"dropout_rate": 0.1,
|
203 |
+
"early_stopping": false,
|
204 |
+
"encoder_no_repeat_ngram_size": 0,
|
205 |
+
"eos_token_id": 1,
|
206 |
+
"exponential_decay_length_penalty": null,
|
207 |
+
"feed_forward_proj": "relu",
|
208 |
+
"finetuning_task": null,
|
209 |
+
"forced_bos_token_id": null,
|
210 |
+
"forced_eos_token_id": null,
|
211 |
+
"id2label": {
|
212 |
+
"0": "LABEL_0",
|
213 |
+
"1": "LABEL_1"
|
214 |
+
},
|
215 |
+
"initializer_factor": 1.0,
|
216 |
+
"is_decoder": false,
|
217 |
+
"is_encoder_decoder": true,
|
218 |
+
"is_gated_act": false,
|
219 |
+
"label2id": {
|
220 |
+
"LABEL_0": 0,
|
221 |
+
"LABEL_1": 1
|
222 |
+
},
|
223 |
+
"layer_norm_epsilon": 1e-06,
|
224 |
+
"length_penalty": 1.0,
|
225 |
+
"max_length": 20,
|
226 |
+
"min_length": 0,
|
227 |
+
"model_type": "t5",
|
228 |
+
"n_positions": 512,
|
229 |
+
"no_repeat_ngram_size": 0,
|
230 |
+
"num_beam_groups": 1,
|
231 |
+
"num_beams": 1,
|
232 |
+
"num_decoder_layers": 12,
|
233 |
+
"num_heads": 12,
|
234 |
+
"num_layers": 12,
|
235 |
+
"num_return_sequences": 1,
|
236 |
+
"output_attentions": false,
|
237 |
+
"output_hidden_states": false,
|
238 |
+
"output_past": true,
|
239 |
+
"output_scores": false,
|
240 |
+
"pad_token_id": 0,
|
241 |
+
"prefix": null,
|
242 |
+
"problem_type": null,
|
243 |
+
"pruned_heads": {},
|
244 |
+
"relative_attention_max_distance": 128,
|
245 |
+
"relative_attention_num_buckets": 32,
|
246 |
+
"remove_invalid_values": false,
|
247 |
+
"repetition_penalty": 1.0,
|
248 |
+
"return_dict": true,
|
249 |
+
"return_dict_in_generate": false,
|
250 |
+
"sep_token_id": null,
|
251 |
+
"suppress_tokens": null,
|
252 |
+
"task_specific_params": {
|
253 |
+
"summarization": {
|
254 |
+
"early_stopping": true,
|
255 |
+
"length_penalty": 2.0,
|
256 |
+
"max_length": 200,
|
257 |
+
"min_length": 30,
|
258 |
+
"no_repeat_ngram_size": 3,
|
259 |
+
"num_beams": 4,
|
260 |
+
"prefix": "summarize: "
|
261 |
+
},
|
262 |
+
"translation_en_to_de": {
|
263 |
+
"early_stopping": true,
|
264 |
+
"max_length": 300,
|
265 |
+
"num_beams": 4,
|
266 |
+
"prefix": "translate English to German: "
|
267 |
+
},
|
268 |
+
"translation_en_to_fr": {
|
269 |
+
"early_stopping": true,
|
270 |
+
"max_length": 300,
|
271 |
+
"num_beams": 4,
|
272 |
+
"prefix": "translate English to French: "
|
273 |
+
},
|
274 |
+
"translation_en_to_ro": {
|
275 |
+
"early_stopping": true,
|
276 |
+
"max_length": 300,
|
277 |
+
"num_beams": 4,
|
278 |
+
"prefix": "translate English to Romanian: "
|
279 |
+
}
|
280 |
+
},
|
281 |
+
"temperature": 1.0,
|
282 |
+
"tf_legacy_loss": false,
|
283 |
+
"tie_encoder_decoder": false,
|
284 |
+
"tie_word_embeddings": true,
|
285 |
+
"tokenizer_class": null,
|
286 |
+
"top_k": 50,
|
287 |
+
"top_p": 1.0,
|
288 |
+
"torch_dtype": null,
|
289 |
+
"torchscript": false,
|
290 |
+
"transformers_version": "4.31.0.dev0",
|
291 |
+
"typical_p": 1.0,
|
292 |
+
"use_bfloat16": false,
|
293 |
+
"use_cache": true,
|
294 |
+
"vocab_size": 32128
|
295 |
+
},
|
296 |
+
"torch_dtype": "float32",
|
297 |
+
"transformers_version": null
|
298 |
+
}
|
cache/models--facebook--musicgen-small/snapshots/51027f0bee8489c1750a7b8a4806894ab2e7dc4d/generation_config.json
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"_from_model_config": true,
|
3 |
+
"bos_token_id": 2048,
|
4 |
+
"decoder_start_token_id": 2048,
|
5 |
+
"do_sample": true,
|
6 |
+
"guidance_scale": 3.0,
|
7 |
+
"max_length": 1500,
|
8 |
+
"pad_token_id": 2048,
|
9 |
+
"transformers_version": "4.31.0.dev0"
|
10 |
+
}
|
cache/models--facebook--musicgen-small/snapshots/51027f0bee8489c1750a7b8a4806894ab2e7dc4d/model.safetensors
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:1bdc99d43eb6c775967df24b65b0a9f847c0907e95664698d93b5a1c35f5090d
|
3 |
+
size 2364427288
|
data/encodec32khz_testing_embeds_sorted.npy
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:365ada4922d3328895b978df9127c44a35a807732157839ae862c23acb174719
|
3 |
+
size 2880128
|
data/encodec32khz_training_embeds_sorted.npy
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:b26b9d0e279143f1cad0c7e3b3879afb0c10fc2ba774c1f35521ac04efde67f4
|
3 |
+
size 5760128
|
data/encodec_test_embeds.npy
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:2ba64ae0cc073640c9104ee24814b480bab5fedbefc3e1fc82f7435243090875
|
3 |
+
size 2160128
|
data/encodec_testing_embeds_sorted.npy
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:691527ea72cbec7b67821d15ce2a179648d25b08b488afec7bcc3580fee2b4d3
|
3 |
+
size 2160128
|
data/encodec_training_embeds.npy
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:733ea631bafb622c61b325435f3beaa6d92d8cbe1756ea2eab40ce1ca9f14170
|
3 |
+
size 4320128
|
data/encodec_training_embeds_sorted.npy
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:2da1180e4324c6fa148c531160aa179c8f00dd677de076555bf632ccc5f9e09c
|
3 |
+
size 4320128
|
data/sub-001_Resp_Test.npy
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:1f38bf483013229e1e2d56111fd041743e0948f649aa041ddb0aa0bfbfe0f7e3
|
3 |
+
size 583526528
|
data/sub-001_Resp_Test_Mean.npy
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:abc68b4d0b8974b6d3a720d463beb52ee464860a3d324c1c8e696109248a76c7
|
3 |
+
size 145881728
|
data/sub-001_Resp_Training.npy
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:66aaaf44e962c1f3121e7f06b8a07fc9140d10be48cc71e0e3d7a1feaa6b130b
|
3 |
+
size 1167052928
|
src/.ipynb_checkpoints/Copy_of_MusicGen-checkpoint.ipynb
ADDED
The diff for this file is too large to render.
See raw diff
|
|
src/.ipynb_checkpoints/MLP-model copy-checkpoint.ipynb
ADDED
@@ -0,0 +1,582 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"cells": [
|
3 |
+
{
|
4 |
+
"cell_type": "code",
|
5 |
+
"execution_count": 1,
|
6 |
+
"metadata": {},
|
7 |
+
"outputs": [
|
8 |
+
{
|
9 |
+
"name": "stderr",
|
10 |
+
"output_type": "stream",
|
11 |
+
"text": [
|
12 |
+
"/home/ckadirt/miniconda3/envs/b2m/lib/python3.11/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
|
13 |
+
" from .autonotebook import tqdm as notebook_tqdm\n"
|
14 |
+
]
|
15 |
+
}
|
16 |
+
],
|
17 |
+
"source": [
|
18 |
+
"import os, torch, torch.nn as nn, torch.utils.data as data, torchvision as tv\n",
|
19 |
+
"import lightning as L\n",
|
20 |
+
"import numpy as np, pandas as pd, matplotlib.pyplot as plt\n",
|
21 |
+
"from pytorch_lightning.loggers import WandbLogger"
|
22 |
+
]
|
23 |
+
},
|
24 |
+
{
|
25 |
+
"cell_type": "code",
|
26 |
+
"execution_count": 5,
|
27 |
+
"metadata": {},
|
28 |
+
"outputs": [],
|
29 |
+
"source": [
|
30 |
+
"# create the datasets and dataloaders\n",
|
31 |
+
"train_voxels_path = '/home/ckadirt/brain2music/dataset/preproc/sub-001_Resp_Training.npy' # path to training voxels 65000 * 4800 \n",
|
32 |
+
"test_voxels_path = '/home/ckadirt/brain2music/dataset/preproc/sub-001_Resp_Test_Mean.npy' # path to test voxels 65000 * 600\n",
|
33 |
+
"\n",
|
34 |
+
"train_embeddings_path = '/home/ckadirt/brain2music/encodec_training_embeds_150.npy' # path to training embeddings 480 * 2 * 1125\n",
|
35 |
+
"test_embeddings_path = '/home/ckadirt/brain2music/encodec_test_embeds_150.npy' # path to test embeddings 600 * 2 * 1125\n",
|
36 |
+
"\n",
|
37 |
+
"class VoxelsDataset(data.Dataset):\n",
|
38 |
+
" def __init__(self, voxels_path, embeddings_path):\n",
|
39 |
+
" # transpose the two dimensions of the voxels data to match the embeddings data\n",
|
40 |
+
" self.voxels = torch.from_numpy(np.load(voxels_path)).float().transpose(0, 1)\n",
|
41 |
+
" self.embeddings = torch.from_numpy(np.load(embeddings_path))\n",
|
42 |
+
" # as each stimulus has been exposed for 15 seconds and the fMRI data is sampled every 1.5 seconds, we take 10 samples per stimulus\n",
|
43 |
+
" self.len = len(self.voxels) // 10\n",
|
44 |
+
" print(\"The len is \", self.len )\n",
|
45 |
+
"\n",
|
46 |
+
" def __getitem__(self, index):\n",
|
47 |
+
" # as each stimulus has been exposed for 15 seconds and the fMRI data is sampled every 1.5 seconds, we take 10 samples per stimulus\n",
|
48 |
+
" voxels = self.voxels[index*10:(index+1)*10]\n",
|
49 |
+
" embeddings = self.embeddings[index]\n",
|
50 |
+
" return voxels, embeddings\n",
|
51 |
+
"\n",
|
52 |
+
" def __len__(self):\n",
|
53 |
+
" return self.len\n",
|
54 |
+
" \n",
|
55 |
+
"class VoxelsEmbeddinsEncodecDataModule(L.LightningDataModule):\n",
|
56 |
+
" def __init__(self, train_voxels_path, train_embeddings_path, test_voxels_path, test_embeddings_path, batch_size=4):\n",
|
57 |
+
" super().__init__()\n",
|
58 |
+
" self.train_voxels_path = train_voxels_path\n",
|
59 |
+
" self.train_embeddings_path = train_embeddings_path\n",
|
60 |
+
" self.test_voxels_path = test_voxels_path\n",
|
61 |
+
" self.test_embeddings_path = test_embeddings_path\n",
|
62 |
+
" self.batch_size = batch_size\n",
|
63 |
+
"\n",
|
64 |
+
" def setup(self, stage=None):\n",
|
65 |
+
" self.train_dataset = VoxelsDataset(self.train_voxels_path, self.train_embeddings_path)\n",
|
66 |
+
" self.test_dataset = VoxelsDataset(self.test_voxels_path, self.test_embeddings_path)\n",
|
67 |
+
"\n",
|
68 |
+
" def train_dataloader(self):\n",
|
69 |
+
" return data.DataLoader(self.train_dataset, batch_size=self.batch_size, shuffle=True)\n",
|
70 |
+
"\n",
|
71 |
+
" def val_dataloader(self):\n",
|
72 |
+
" return data.DataLoader(self.test_dataset, batch_size=self.batch_size, shuffle=False)\n",
|
73 |
+
"\n",
|
74 |
+
"\n"
|
75 |
+
]
|
76 |
+
},
|
77 |
+
{
|
78 |
+
"cell_type": "code",
|
79 |
+
"execution_count": 33,
|
80 |
+
"metadata": {},
|
81 |
+
"outputs": [],
|
82 |
+
"source": [
|
83 |
+
"data_module_example = VoxelsEmbeddinsEncodecDataModule(train_voxels_path, train_embeddings_path, test_voxels_path, test_embeddings_path, batch_size=4)"
|
84 |
+
]
|
85 |
+
},
|
86 |
+
{
|
87 |
+
"cell_type": "code",
|
88 |
+
"execution_count": 34,
|
89 |
+
"metadata": {},
|
90 |
+
"outputs": [],
|
91 |
+
"source": [
|
92 |
+
"data_module_example.setup()\n",
|
93 |
+
"train_dataloader = data_module_example.train_dataloader()\n",
|
94 |
+
"val_dataset = data_module_example.val_dataloader()"
|
95 |
+
]
|
96 |
+
},
|
97 |
+
{
|
98 |
+
"cell_type": "code",
|
99 |
+
"execution_count": 38,
|
100 |
+
"metadata": {},
|
101 |
+
"outputs": [
|
102 |
+
{
|
103 |
+
"data": {
|
104 |
+
"text/plain": [
|
105 |
+
"(tensor([], size=(0, 60784)),\n",
|
106 |
+
" tensor([[ 302., 244., 660., 854., 660., 480., 854., 618., 618., 854.,\n",
|
107 |
+
" 790., 750., 659., 59., 891., 891., 536., 167., 343., 536.,\n",
|
108 |
+
" 715., 758., 758., 758., 480., 498., 854., 4., 4., 308.,\n",
|
109 |
+
" 270., 342., 342., 660., 342., 854., 342., 435., 549., 150.,\n",
|
110 |
+
" 631., 485., 844., 366., 266., 35., 847., 667., 862., 109.,\n",
|
111 |
+
" 573., 379., 226., 573., 603., 513., 178., 302., 715., 631.,\n",
|
112 |
+
" 342., 258., 244., 302., 715., 854., 854., 294., 366., 660.,\n",
|
113 |
+
" 361., 302., 729., 962., 790., 711., 660., 243., 294., 802.,\n",
|
114 |
+
" 329., 513., 962., 342., 711., 244., 243., 549., 802., 854.,\n",
|
115 |
+
" 750., 81., 342., 381., 854., 603., 790., 109., 294., 513.,\n",
|
116 |
+
" 419., 485., 504., 660., 361., 790., 790., 167., 802., 246.,\n",
|
117 |
+
" 485., 246., 81., 1023., 149., 81., 943., 504., 755., 414.,\n",
|
118 |
+
" 246., 972., 715., 1023., 790., 692., 790., 572., 504., 302.,\n",
|
119 |
+
" 308., 853., 631., 657., 790., 361., 660., 715., 686., 213.,\n",
|
120 |
+
" 226., 187., 586., 361., 485., 790., 729., 951., 962., 485.],\n",
|
121 |
+
" [ 963., 645., 645., 326., 138., 1013., 680., 525., 411., 102.,\n",
|
122 |
+
" 462., 466., 698., 409., 289., 923., 878., 415., 386., 604.,\n",
|
123 |
+
" 975., 162., 603., 284., 233., 75., 244., 1016., 1016., 242.,\n",
|
124 |
+
" 67., 194., 122., 492., 856., 997., 997., 221., 243., 814.,\n",
|
125 |
+
" 386., 598., 317., 166., 583., 439., 654., 430., 201., 160.,\n",
|
126 |
+
" 813., 716., 312., 664., 204., 462., 375., 451., 67., 535.,\n",
|
127 |
+
" 854., 209., 548., 812., 657., 827., 408., 411., 422., 352.,\n",
|
128 |
+
" 99., 711., 664., 239., 890., 529., 617., 186., 536., 178.,\n",
|
129 |
+
" 29., 930., 187., 973., 354., 450., 468., 273., 995., 653.,\n",
|
130 |
+
" 935., 335., 973., 812., 348., 664., 575., 184., 299., 782.,\n",
|
131 |
+
" 36., 29., 641., 653., 105., 958., 653., 828., 981., 218.,\n",
|
132 |
+
" 1021., 381., 356., 35., 416., 675., 45., 839., 690., 331.,\n",
|
133 |
+
" 634., 610., 317., 745., 673., 331., 575., 57., 100., 564.,\n",
|
134 |
+
" 590., 492., 902., 53., 73., 332., 1005., 395., 679., 781.,\n",
|
135 |
+
" 174., 74., 121., 667., 265., 479., 583., 655., 163., 81.]]))"
|
136 |
+
]
|
137 |
+
},
|
138 |
+
"execution_count": 38,
|
139 |
+
"metadata": {},
|
140 |
+
"output_type": "execute_result"
|
141 |
+
}
|
142 |
+
],
|
143 |
+
"source": [
|
144 |
+
"val_dataset.dataset[239]"
|
145 |
+
]
|
146 |
+
},
|
147 |
+
{
|
148 |
+
"cell_type": "code",
|
149 |
+
"execution_count": null,
|
150 |
+
"metadata": {},
|
151 |
+
"outputs": [],
|
152 |
+
"source": [
|
153 |
+
"class MLP(L.LightningModule):\n",
|
154 |
+
" def __init__(self, sizes, residual_conections, dropout):\n",
|
155 |
+
" # sizes is a list of the sizes of the layers ej: [4800, 1000, 1000, 1000, 1000, 1000, 1000, 600]\n",
|
156 |
+
" # residual_conections is a list with the same length as sizes, each element is a list of the indexes of the layers that will recieve the output of the layer as input, 0 means that the layer will recieve the x inputs ej. [[0], [1], [2,1], [3], [4,3], [5], [6,5], [7]]\n",
|
157 |
+
" # dropout is a list with the same length as sizes, each element is the dropout probability of the layer ej. [0.5, 0.5, 0.5, 0.5, 0.5, 0.5]\n",
|
158 |
+
" super().__init__()\n",
|
159 |
+
" self.sizes = sizes\n",
|
160 |
+
" self.residual_conections = residual_conections\n",
|
161 |
+
" self.dropout = dropout\n",
|
162 |
+
" self.layers = nn.Sequential()\n",
|
163 |
+
" for i in range(len(sizes)-1):\n",
|
164 |
+
" self.layers.add_module('linear'+str(i), nn.Linear(sizes[i], sizes[i+1]))\n",
|
165 |
+
" self.layers.add_module('relu'+str(i), nn.ReLU())\n",
|
166 |
+
" self.layers.add_module('dropout'+str(i), nn.Dropout(dropout[i]))\n",
|
167 |
+
"\n",
|
168 |
+
" self.loss = nn.CrossEntropyLoss()\n",
|
169 |
+
" self.test_outptus = []\n",
|
170 |
+
" self.train_outptus = []\n",
|
171 |
+
"\n",
|
172 |
+
" def forward(self, x):\n",
|
173 |
+
" return self.layers(x)\n",
|
174 |
+
" \n",
|
175 |
+
" def training_step(self, batch, batch_idx):\n",
|
176 |
+
" voxels, embeddings = batch # the sizes are [batch_size, 10, 65000] and [batch_size, 2, 1125]\n",
|
177 |
+
" # flatten the voxels to [batch_size, rest of the dimensions]\n",
|
178 |
+
" embeddings = embeddings.flatten(start_dim=1).long() # the size is [batch_size, 2250] \n",
|
179 |
+
" #take just the first 200 embeddings\n",
|
180 |
+
" embeddings = embeddings[:, :200]\n",
|
181 |
+
" # take the mean of the second dimension of the voxels to get the mean of the 10 samples per stimulus\n",
|
182 |
+
" voxels = voxels[:, 0:2, :]\n",
|
183 |
+
" voxels = voxels.mean(dim=1)\n",
|
184 |
+
" voxels = voxels.flatten(start_dim=1) # the size is [batch_size, 65000]\n",
|
185 |
+
" outputs = self(voxels)\n",
|
186 |
+
" # the outputs are [batch_size, 200*1024], we need to reshape them to [batch_size, 200, 1024]\n",
|
187 |
+
" outputs = outputs.reshape(-1, 1024, 200)\n",
|
188 |
+
" loss = self.loss(outputs, embeddings)\n",
|
189 |
+
" acuracy = self.tokens_accuracy(outputs, embeddings)\n",
|
190 |
+
" self.log('train_loss', loss, sync_dist=True)\n",
|
191 |
+
" self.log('train_accuracy', acuracy, sync_dist=True)\n",
|
192 |
+
" discrete_outputs = outputs.argmax(dim=1)\n",
|
193 |
+
" self.train_outptus.append(discrete_outputs)\n",
|
194 |
+
" return loss\n",
|
195 |
+
" \n",
|
196 |
+
" def tokens_accuracy(self, outputs, embeddings):\n",
|
197 |
+
" # outputs is [batch_size, 1024, 200]\n",
|
198 |
+
" # embeddings is [batch_size, 200]\n",
|
199 |
+
" # we need to get the index of the maximum value of each token\n",
|
200 |
+
" outputs = outputs.argmax(dim=1)\n",
|
201 |
+
" # now we need to compare the outputs with the embeddings\n",
|
202 |
+
" return (outputs == embeddings).float().mean()\n",
|
203 |
+
" \n",
|
204 |
+
" def on_train_epoch_end(self):\n",
|
205 |
+
" self.train_outptus = torch.cat(self.train_outptus)\n",
|
206 |
+
" # save the outputs with the current epoch name\n",
|
207 |
+
" torch.save(self.train_outptus, 'outputs_train'+str(self.current_epoch)+'.pt')\n",
|
208 |
+
" self.train_outptus = []\n",
|
209 |
+
" \n",
|
210 |
+
" def on_validation_epoch_end(self):\n",
|
211 |
+
" self.test_outptus = torch.cat(self.test_outptus)\n",
|
212 |
+
" # save the outputs with the current epoch name\n",
|
213 |
+
" torch.save(self.test_outptus, 'outputs_validation'+str(self.current_epoch)+'.pt')\n",
|
214 |
+
" self.test_outptus = []\n",
|
215 |
+
"\n",
|
216 |
+
" \n",
|
217 |
+
" def validation_step(self, batch, batch_idx):\n",
|
218 |
+
" voxels, embeddings = batch\n",
|
219 |
+
" embeddings = embeddings.flatten(start_dim=1).long()\n",
|
220 |
+
" embeddings = embeddings[:, :200]\n",
|
221 |
+
" voxels = voxels[:, 0:2, :]\n",
|
222 |
+
" voxels = voxels.mean(dim=1)\n",
|
223 |
+
" voxels = voxels.flatten(start_dim=1)\n",
|
224 |
+
" outputs = self(voxels)\n",
|
225 |
+
" outputs = outputs.reshape(-1, 1024, 200)\n",
|
226 |
+
" loss = self.loss(outputs, embeddings)\n",
|
227 |
+
" accuracy = self.tokens_accuracy(outputs, embeddings)\n",
|
228 |
+
" self.log('val_loss', loss, sync_dist=True)\n",
|
229 |
+
" self.log('val_accuracy', accuracy, sync_dist=True)\n",
|
230 |
+
" discrete_outputs = outputs.argmax(dim=1)\n",
|
231 |
+
" self.test_outptus.append(discrete_outputs)\n",
|
232 |
+
" return loss\n",
|
233 |
+
" \n",
|
234 |
+
" \n",
|
235 |
+
" def configure_optimizers(self):\n",
|
236 |
+
" return torch.optim.Adam(self.parameters(), lr=1e-6)\n",
|
237 |
+
" \n",
|
238 |
+
"\n",
|
239 |
+
"# create the model\n",
|
240 |
+
"sizes = [60784, 500, 500, 150*1024]\n",
|
241 |
+
"residual_conections = [[0], [1], [2], [3]]\n",
|
242 |
+
"dropout = [0.3, 0.3, 0.3, 0.3]\n",
|
243 |
+
"model = MLP(sizes, residual_conections, dropout)\n",
|
244 |
+
"\n",
|
245 |
+
"# create the data module\n",
|
246 |
+
"data_module = VoxelsEmbeddinsEncodecDataModule(train_voxels_path, train_embeddings_path, test_voxels_path, test_embeddings_path, batch_size=4)\n",
|
247 |
+
"\n",
|
248 |
+
"wandb.finish()\n",
|
249 |
+
"\n",
|
250 |
+
"wandb_logger = WandbLogger(project='brain2music', entity='ckadirt')\n",
|
251 |
+
"\n",
|
252 |
+
"# define the trainer\n",
|
253 |
+
"trainer = L.Trainer(devices=2, accelerator=\"gpu\", max_epochs=400, logger=wandb_logger, precision='16-mixed', log_every_n_steps=10)\n",
|
254 |
+
"\n",
|
255 |
+
"# train the model\n",
|
256 |
+
"trainer.fit(model, datamodule=data_module)\n"
|
257 |
+
]
|
258 |
+
},
|
259 |
+
{
|
260 |
+
"cell_type": "code",
|
261 |
+
"execution_count": null,
|
262 |
+
"metadata": {},
|
263 |
+
"outputs": [],
|
264 |
+
"source": [
|
265 |
+
"class MLP(L.LightningModule):\n",
|
266 |
+
" def __init__(self, sizes, residual_conections, dropout):\n",
|
267 |
+
" # sizes is a list of the sizes of the layers ej: [4800, 1000, 1000, 1000, 1000, 1000, 1000, 600]\n",
|
268 |
+
" # residual_conections is a list with the same length as sizes, each element is a list of the indexes of the layers that will recieve the output of the layer as input, 0 means that the layer will recieve the x inputs ej. [[0], [1], [2,1], [3], [4,3], [5], [6,5], [7]]\n",
|
269 |
+
" # dropout is a list with the same length as sizes, each element is the dropout probability of the layer ej. [0.5, 0.5, 0.5, 0.5, 0.5, 0.5]\n",
|
270 |
+
" super().__init__()\n",
|
271 |
+
" self.sizes = sizes\n",
|
272 |
+
" self.residual_conections = residual_conections\n",
|
273 |
+
" self.dropout = dropout\n",
|
274 |
+
" self.layers = nn.Sequential()\n",
|
275 |
+
" for i in range(len(sizes)-1):\n",
|
276 |
+
" self.layers.add_module('linear'+str(i), nn.Linear(sizes[i], sizes[i+1]))\n",
|
277 |
+
" self.layers.add_module('relu'+str(i), nn.ReLU())\n",
|
278 |
+
" self.layers.add_module('dropout'+str(i), nn.Dropout(dropout[i]))\n",
|
279 |
+
"\n",
|
280 |
+
" self.loss = nn.MSELoss()\n",
|
281 |
+
" self.test_outptus = []\n",
|
282 |
+
" self.train_outptus = []\n",
|
283 |
+
"\n",
|
284 |
+
" def forward(self, x):\n",
|
285 |
+
" return self.layers(x)\n",
|
286 |
+
" \n",
|
287 |
+
" def training_step(self, batch, batch_idx):\n",
|
288 |
+
" voxels, embeddings = batch # the sizes are [batch_size, 10, 65000] and [batch_size, 2, 1125]\n",
|
289 |
+
" # flatten the voxels to [batch_size, rest of the dimensions]\n",
|
290 |
+
" embeddings = embeddings.flatten(start_dim=1) # the size is [batch_size, 2250]\n",
|
291 |
+
" # take the mean of the second dimension of the voxels to get the mean of the 10 samples per stimulus\n",
|
292 |
+
" voxels = voxels.mean(dim=1)\n",
|
293 |
+
" voxels = voxels.flatten(start_dim=1) # the size is [batch_size, 65000]\n",
|
294 |
+
" outputs = self(voxels)\n",
|
295 |
+
" loss = self.loss(outputs, embeddings)\n",
|
296 |
+
" self.log('train_loss', loss)\n",
|
297 |
+
" discrete_outputs = outputs.argmax(dim=1)\n",
|
298 |
+
" self.train_outptus.append(discrete_outputs)\n",
|
299 |
+
" return loss\n",
|
300 |
+
" \n",
|
301 |
+
" def on_train_epoch_end(self):\n",
|
302 |
+
" self.train_outptus = torch.cat(self.train_outptus)\n",
|
303 |
+
" # save the outputs with the current epoch name\n",
|
304 |
+
" torch.save(self.train_outptus, 'outputs_train'+str(self.current_epoch)+'.pt')\n",
|
305 |
+
" self.train_outptus = []\n",
|
306 |
+
" \n",
|
307 |
+
" def on_validation_epoch_end(self):\n",
|
308 |
+
" self.test_outptus = torch.cat(self.test_outptus)\n",
|
309 |
+
" # save the outputs with the current epoch name\n",
|
310 |
+
" torch.save(self.test_outptus, 'outputs_validation'+str(self.current_epoch)+'.pt')\n",
|
311 |
+
" self.test_outptus = []\n",
|
312 |
+
"\n",
|
313 |
+
" def validation_step(self, batch, batch_idx):\n",
|
314 |
+
" voxels, embeddings = batch\n",
|
315 |
+
" embeddings = embeddings.flatten(start_dim=1)\n",
|
316 |
+
" voxels = voxels.mean(dim=1)\n",
|
317 |
+
" voxels = voxels.flatten(start_dim=1)\n",
|
318 |
+
" outputs = self(voxels)\n",
|
319 |
+
" loss = self.loss(outputs, embeddings)\n",
|
320 |
+
" self.log('val_loss', loss)\n",
|
321 |
+
" discrete_outputs = outputs.argmax(dim=1)\n",
|
322 |
+
" self.test_outptus.append(discrete_outputs)\n",
|
323 |
+
" return loss\n",
|
324 |
+
" \n",
|
325 |
+
" \n",
|
326 |
+
" def configure_optimizers(self):\n",
|
327 |
+
" return torch.optim.Adam(self.parameters(), lr=1e-5)\n",
|
328 |
+
" \n",
|
329 |
+
"\n",
|
330 |
+
"# create the model\n",
|
331 |
+
"sizes = [60784, 1000, 1000, 150*2*1024]\n",
|
332 |
+
"residual_conections = [[0], [1], [2], [3]]\n",
|
333 |
+
"dropout = [0.5, 0.5, 0.5, 0.5]\n",
|
334 |
+
"model = MLP(sizes, residual_conections, dropout)\n",
|
335 |
+
"\n",
|
336 |
+
"# create the data module\n",
|
337 |
+
"data_module = VoxelsEmbeddinsEncodecDataModule(train_voxels_path, train_embeddings_path, test_voxels_path, test_embeddings_path, batch_size=32)\n",
|
338 |
+
"\n",
|
339 |
+
"\n",
|
340 |
+
"wandb_logger = WandbLogger(project='brain2music', entity='ckadirt')\n",
|
341 |
+
"\n",
|
342 |
+
"# define the trainer\n",
|
343 |
+
"trainer = L.Trainer(devices=2, accelerator=\"gpu\", max_epochs=400, logger=wandb_logger, precision='16-mixed', log_every_n_steps=10)\n",
|
344 |
+
"\n",
|
345 |
+
"# train the model\n",
|
346 |
+
"trainer.fit(model, datamodule=data_module)\n"
|
347 |
+
]
|
348 |
+
},
|
349 |
+
{
|
350 |
+
"cell_type": "code",
|
351 |
+
"execution_count": null,
|
352 |
+
"metadata": {},
|
353 |
+
"outputs": [],
|
354 |
+
"source": [
|
355 |
+
"class MLP(L.LightningModule):\n",
|
356 |
+
" def __init__(self, sizes, residual_conections, dropout):\n",
|
357 |
+
" # sizes is a list of the sizes of the layers ej: [4800, 1000, 1000, 1000, 1000, 1000, 1000, 600]\n",
|
358 |
+
" # residual_conections is a list with the same length as sizes, each element is a list of the indexes of the layers that will recieve the output of the layer as input, 0 means that the layer will recieve the x inputs ej. [[0], [1], [2,1], [3], [4,3], [5], [6,5], [7]]\n",
|
359 |
+
" # dropout is a list with the same length as sizes, each element is the dropout probability of the layer ej. [0.5, 0.5, 0.5, 0.5, 0.5, 0.5]\n",
|
360 |
+
" super().__init__()\n",
|
361 |
+
" self.sizes = sizes\n",
|
362 |
+
" self.residual_conections = residual_conections\n",
|
363 |
+
" self.dropout = dropout\n",
|
364 |
+
" self.layers = nn.Sequential()\n",
|
365 |
+
" for i in range(len(sizes)-1):\n",
|
366 |
+
" self.layers.add_module('linear'+str(i), nn.Linear(sizes[i], sizes[i+1]))\n",
|
367 |
+
" self.layers.add_module('relu'+str(i), nn.ReLU())\n",
|
368 |
+
" self.layers.add_module('dropout'+str(i), nn.Dropout(dropout[i]))\n",
|
369 |
+
"\n",
|
370 |
+
" self.loss = nn.CrossEntropyLoss()\n",
|
371 |
+
"\n",
|
372 |
+
" def forward(self, x):\n",
|
373 |
+
" return self.layers(x)\n",
|
374 |
+
" \n",
|
375 |
+
" def training_step(self, batch, batch_idx):\n",
|
376 |
+
" voxels, embeddings = batch # the sizes are [batch_size, 10, 65000] and [batch_size, 2, 1125]\n",
|
377 |
+
" # flatten the voxels to [batch_size, rest of the dimensions]\n",
|
378 |
+
" embeddings = embeddings.flatten(start_dim=1).long() # the size is [batch_size, 2250] \n",
|
379 |
+
" #take just the first 200 embeddings\n",
|
380 |
+
" embeddings = embeddings[:, :200]\n",
|
381 |
+
" # take the mean of the second dimension of the voxels to get the mean of the 10 samples per stimulus\n",
|
382 |
+
" voxels = voxels.mean(dim=1)\n",
|
383 |
+
" voxels = voxels.flatten(start_dim=1) # the size is [batch_size, 65000]\n",
|
384 |
+
" outputs = self(voxels)\n",
|
385 |
+
" # the outputs are [batch_size, 200*1024], we need to reshape them to [batch_size, 200, 1024]\n",
|
386 |
+
" outputs = outputs.reshape(-1, 1024, 200)\n",
|
387 |
+
" loss = self.loss(outputs, embeddings)\n",
|
388 |
+
" acuracy = self.tokens_accuracy(outputs, embeddings)\n",
|
389 |
+
" self.log('train_loss', loss)\n",
|
390 |
+
" self.log('train_accuracy', acuracy)\n",
|
391 |
+
" return loss\n",
|
392 |
+
" \n",
|
393 |
+
" def tokens_accuracy(self, outputs, embeddings):\n",
|
394 |
+
" # outputs is [batch_size, 1024, 200]\n",
|
395 |
+
" # embeddings is [batch_size, 200]\n",
|
396 |
+
" # we need to get the index of the maximum value of each token\n",
|
397 |
+
" outputs = outputs.argmax(dim=1)\n",
|
398 |
+
" # now we need to compare the outputs with the embeddings\n",
|
399 |
+
" return (outputs == embeddings).float().mean()\n",
|
400 |
+
"\n",
|
401 |
+
" \n",
|
402 |
+
" def validation_step(self, batch, batch_idx):\n",
|
403 |
+
" voxels, embeddings = batch\n",
|
404 |
+
" embeddings = embeddings.flatten(start_dim=1).long()\n",
|
405 |
+
" embeddings = embeddings[:, :200]\n",
|
406 |
+
" voxels = voxels.mean(dim=1)\n",
|
407 |
+
" voxels = voxels.flatten(start_dim=1)\n",
|
408 |
+
" outputs = self(voxels)\n",
|
409 |
+
" outputs = outputs.reshape(-1, 1024, 200)\n",
|
410 |
+
" loss = self.loss(outputs, embeddings)\n",
|
411 |
+
" accuracy = self.tokens_accuracy(outputs, embeddings)\n",
|
412 |
+
" self.log('val_loss', loss)\n",
|
413 |
+
" self.log('val_accuracy', accuracy)\n",
|
414 |
+
" return loss\n",
|
415 |
+
" \n",
|
416 |
+
" \n",
|
417 |
+
" def configure_optimizers(self):\n",
|
418 |
+
" return torch.optim.Adam(self.parameters(), lr=1e-5)\n",
|
419 |
+
" \n",
|
420 |
+
"\n",
|
421 |
+
"# create the model\n",
|
422 |
+
"sizes = [60784, 1000, 1000, 200*1024]\n",
|
423 |
+
"residual_conections = [[0], [1], [2], [3]]\n",
|
424 |
+
"dropout = [0.5, 0.5, 0.5, 0.5]\n",
|
425 |
+
"model = MLP(sizes, residual_conections, dropout)\n",
|
426 |
+
"\n",
|
427 |
+
"# create the data module\n",
|
428 |
+
"data_module = VoxelsEmbeddinsEncodecDataModule(train_voxels_path, train_embeddings_path, test_voxels_path, test_embeddings_path, batch_size=2)\n",
|
429 |
+
"\n",
|
430 |
+
"wandb.finish()\n",
|
431 |
+
"\n",
|
432 |
+
"wandb_logger = WandbLogger(project='brain2music', entity='ckadirt')\n",
|
433 |
+
"\n",
|
434 |
+
"# define the trainer\n",
|
435 |
+
"trainer = L.Trainer(devices=2, accelerator=\"gpu\", max_epochs=400, logger=wandb_logger, precision='16-mixed', log_every_n_steps=10)\n",
|
436 |
+
"\n",
|
437 |
+
"# train the model\n",
|
438 |
+
"trainer.fit(model, datamodule=data_module)\n"
|
439 |
+
]
|
440 |
+
},
|
441 |
+
{
|
442 |
+
"cell_type": "code",
|
443 |
+
"execution_count": null,
|
444 |
+
"metadata": {},
|
445 |
+
"outputs": [],
|
446 |
+
"source": [
|
447 |
+
"class MLP(L.LightningModule):\n",
|
448 |
+
" def __init__(self, sizes, residual_conections, dropout):\n",
|
449 |
+
" # sizes is a list of the sizes of the layers ej: [4800, 1000, 1000, 1000, 1000, 1000, 1000, 600]\n",
|
450 |
+
" # residual_conections is a list with the same length as sizes, each element is a list of the indexes of the layers that will recieve the output of the layer as input, 0 means that the layer will recieve the x inputs ej. [[0], [1], [2,1], [3], [4,3], [5], [6,5], [7]]\n",
|
451 |
+
" # dropout is a list with the same length as sizes, each element is the dropout probability of the layer ej. [0.5, 0.5, 0.5, 0.5, 0.5, 0.5]\n",
|
452 |
+
" super().__init__()\n",
|
453 |
+
" self.sizes = sizes\n",
|
454 |
+
" self.residual_conections = residual_conections\n",
|
455 |
+
" self.dropout = dropout\n",
|
456 |
+
" self.layers = nn.Sequential()\n",
|
457 |
+
" for i in range(len(sizes)-1):\n",
|
458 |
+
" self.layers.add_module('linear'+str(i), nn.Linear(sizes[i], sizes[i+1]))\n",
|
459 |
+
" self.layers.add_module('relu'+str(i), nn.ReLU())\n",
|
460 |
+
" self.layers.add_module('dropout'+str(i), nn.Dropout(dropout[i]))\n",
|
461 |
+
"\n",
|
462 |
+
" self.loss = nn.CrossEntropyLoss()\n",
|
463 |
+
"\n",
|
464 |
+
" def forward(self, x):\n",
|
465 |
+
" return self.layers(x)\n",
|
466 |
+
" \n",
|
467 |
+
" def training_step(self, batch, batch_idx):\n",
|
468 |
+
" voxels, embeddings = batch # the sizes are [batch_size, 10, 65000] and [batch_size, 2, 1125]\n",
|
469 |
+
" # flatten the voxels to [batch_size, rest of the dimensions]\n",
|
470 |
+
" embeddings = embeddings.flatten(start_dim=1).long() # the size is [batch_size, 2250] \n",
|
471 |
+
" #take just the first 200 embeddings\n",
|
472 |
+
" embeddings = embeddings[:, :200]\n",
|
473 |
+
" # take the mean of the second dimension of the voxels to get the mean of the 10 samples per stimulus\n",
|
474 |
+
" voxels = voxels[:, 1, :]\n",
|
475 |
+
" voxels = voxels.flatten(start_dim=1) # the size is [batch_size, 65000]\n",
|
476 |
+
" outputs = self(voxels)\n",
|
477 |
+
" # the outputs are [batch_size, 200*1024], we need to reshape them to [batch_size, 200, 1024]\n",
|
478 |
+
" outputs = outputs.reshape(-1, 1024, 200)\n",
|
479 |
+
" loss = self.loss(outputs, embeddings)\n",
|
480 |
+
" acuracy = self.tokens_accuracy(outputs, embeddings)\n",
|
481 |
+
" self.log('train_loss', loss)\n",
|
482 |
+
" self.log('train_accuracy', acuracy)\n",
|
483 |
+
" return loss\n",
|
484 |
+
" \n",
|
485 |
+
" def tokens_accuracy(self, outputs, embeddings):\n",
|
486 |
+
" # outputs is [batch_size, 1024, 200]\n",
|
487 |
+
" # embeddings is [batch_size, 200]\n",
|
488 |
+
" # we need to get the index of the maximum value of each token\n",
|
489 |
+
" outputs = outputs.argmax(dim=1)\n",
|
490 |
+
" # now we need to compare the outputs with the embeddings\n",
|
491 |
+
" return (outputs == embeddings).float().mean()\n",
|
492 |
+
"\n",
|
493 |
+
" \n",
|
494 |
+
" def validation_step(self, batch, batch_idx):\n",
|
495 |
+
" voxels, embeddings = batch\n",
|
496 |
+
" embeddings = embeddings.flatten(start_dim=1).long()\n",
|
497 |
+
" embeddings = embeddings[:, :200]\n",
|
498 |
+
" voxels = voxels[:, 1, :]\n",
|
499 |
+
" voxels = voxels.flatten(start_dim=1)\n",
|
500 |
+
" outputs = self(voxels)\n",
|
501 |
+
" outputs = outputs.reshape(-1, 1024, 200)\n",
|
502 |
+
" loss = self.loss(outputs, embeddings)\n",
|
503 |
+
" accuracy = self.tokens_accuracy(outputs, embeddings)\n",
|
504 |
+
" self.log('val_loss', loss)\n",
|
505 |
+
" self.log('val_accuracy', accuracy)\n",
|
506 |
+
" return loss\n",
|
507 |
+
" \n",
|
508 |
+
" \n",
|
509 |
+
" def configure_optimizers(self):\n",
|
510 |
+
" return torch.optim.Adam(self.parameters(), lr=1e-6)\n",
|
511 |
+
" \n",
|
512 |
+
"\n",
|
513 |
+
"# create the model\n",
|
514 |
+
"sizes = [60784, 1000, 1000, 200*1024]\n",
|
515 |
+
"residual_conections = [[0], [1], [2], [3]]\n",
|
516 |
+
"dropout = [0.2, 0.2, 0.2, 0.2]\n",
|
517 |
+
"model = MLP(sizes, residual_conections, dropout)\n",
|
518 |
+
"\n",
|
519 |
+
"# create the data module\n",
|
520 |
+
"data_module = VoxelsEmbeddinsEncodecDataModule(train_voxels_path, train_embeddings_path, test_voxels_path, test_embeddings_path, batch_size=4)\n",
|
521 |
+
"\n",
|
522 |
+
"wandb.finish()\n",
|
523 |
+
"\n",
|
524 |
+
"wandb_logger = WandbLogger(project='brain2music', entity='ckadirt')\n",
|
525 |
+
"\n",
|
526 |
+
"# define the trainer\n",
|
527 |
+
"trainer = L.Trainer(devices=2, accelerator=\"gpu\", max_epochs=400, logger=wandb_logger, precision='16-mixed', log_every_n_steps=10)\n",
|
528 |
+
"\n",
|
529 |
+
"# train the model\n",
|
530 |
+
"trainer.fit(model, datamodule=data_module)\n"
|
531 |
+
]
|
532 |
+
},
|
533 |
+
{
|
534 |
+
"cell_type": "code",
|
535 |
+
"execution_count": null,
|
536 |
+
"metadata": {},
|
537 |
+
"outputs": [],
|
538 |
+
"source": [
|
539 |
+
"model3.eval()\n",
|
540 |
+
"outputs = torch.Tensor((480,200))\n",
|
541 |
+
"with torch.no_grad():\n",
|
542 |
+
" test_dataset = VoxelsDataset(test_voxels_path, test_embeddings_path)\n",
|
543 |
+
" dataloader = data.DataLoader(test_dataset, batch_size = 2)\n",
|
544 |
+
" for i, (voxels, embeddings) in enumerate(dataloader):\n",
|
545 |
+
" voxels = voxels[:, 1, :]\n",
|
546 |
+
" voxels = voxels.flatten(start_dim=1) # the size is [batch_size, 65000]\n",
|
547 |
+
" bout = model3(voxels)\n",
|
548 |
+
" bout = bout.reshape(-1, 1024, 200)\n",
|
549 |
+
" # the 1024 dimension is the number of tokens, we need to get the index of the maximum value of each token\n",
|
550 |
+
" bout = bout.argmax(dim=1)\n",
|
551 |
+
" # now we need to add the outputs to the outputs tensor\n",
|
552 |
+
" outputs[i*2:(i+1)*2] = bout\n",
|
553 |
+
" \n",
|
554 |
+
" \n",
|
555 |
+
"# save the predicted outputs on the current directory\n",
|
556 |
+
"torch.save(outputs, 'outputs.pt')"
|
557 |
+
]
|
558 |
+
}
|
559 |
+
],
|
560 |
+
"metadata": {
|
561 |
+
"kernelspec": {
|
562 |
+
"display_name": "b2m",
|
563 |
+
"language": "python",
|
564 |
+
"name": "python3"
|
565 |
+
},
|
566 |
+
"language_info": {
|
567 |
+
"codemirror_mode": {
|
568 |
+
"name": "ipython",
|
569 |
+
"version": 3
|
570 |
+
},
|
571 |
+
"file_extension": ".py",
|
572 |
+
"mimetype": "text/x-python",
|
573 |
+
"name": "python",
|
574 |
+
"nbconvert_exporter": "python",
|
575 |
+
"pygments_lexer": "ipython3",
|
576 |
+
"version": "3.11.4"
|
577 |
+
},
|
578 |
+
"orig_nbformat": 4
|
579 |
+
},
|
580 |
+
"nbformat": 4,
|
581 |
+
"nbformat_minor": 2
|
582 |
+
}
|
src/.ipynb_checkpoints/MLP-model-checkpoint.ipynb
ADDED
@@ -0,0 +1,449 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"cells": [
|
3 |
+
{
|
4 |
+
"cell_type": "code",
|
5 |
+
"execution_count": 2,
|
6 |
+
"metadata": {},
|
7 |
+
"outputs": [],
|
8 |
+
"source": [
|
9 |
+
"import os, torch, torch.nn as nn, torch.utils.data as data, torchvision as tv\n",
|
10 |
+
"import lightning as L\n",
|
11 |
+
"import numpy as np, pandas as pd, matplotlib.pyplot as plt\n",
|
12 |
+
"from pytorch_lightning.loggers import WandbLogger"
|
13 |
+
]
|
14 |
+
},
|
15 |
+
{
|
16 |
+
"cell_type": "code",
|
17 |
+
"execution_count": null,
|
18 |
+
"metadata": {},
|
19 |
+
"outputs": [],
|
20 |
+
"source": [
|
21 |
+
"# create the datasets and dataloaders\n",
|
22 |
+
"train_voxels_path = '/home/ckadirt/brain2music/dataset/preproc/sub-001_Resp_Training.npy' # path to training voxels 65000 * 4800 \n",
|
23 |
+
"test_voxels_path = '/home/ckadirt/brain2music/dataset/preproc/sub-001_Resp_Test_Mean.npy' # path to test voxels 65000 * 600\n",
|
24 |
+
"\n",
|
25 |
+
"train_embeddings_path = '/home/ckadirt/brain2music/dataset/Gtanz/audios/sub-001/encodec_embeddings_train.pt' # path to training embeddings 480 * 2 * 1125\n",
|
26 |
+
"test_embeddings_path = '/home/ckadirt/brain2music/dataset/Gtanz/audios/sub-001/encodec_embeddings_test.pt' # path to test embeddings 600 * 2 * 1125\n",
|
27 |
+
"\n",
|
28 |
+
"class VoxelsDataset(data.Dataset):\n",
|
29 |
+
" def __init__(self, voxels_path, embeddings_path):\n",
|
30 |
+
" # transpose the two dimensions of the voxels data to match the embeddings data\n",
|
31 |
+
" self.voxels = torch.from_numpy(np.load(voxels_path)).float().transpose(0, 1)\n",
|
32 |
+
" self.embeddings = torch.load(embeddings_path)\n",
|
33 |
+
" # as each stimulus has been exposed for 15 seconds and the fMRI data is sampled every 1.5 seconds, we take 10 samples per stimulus\n",
|
34 |
+
" self.len = len(self.voxels) // 10\n",
|
35 |
+
"\n",
|
36 |
+
" def __getitem__(self, index):\n",
|
37 |
+
" # as each stimulus has been exposed for 15 seconds and the fMRI data is sampled every 1.5 seconds, we take 10 samples per stimulus\n",
|
38 |
+
" voxels = self.voxels[index*10:(index+1)*10]\n",
|
39 |
+
" embeddings = self.embeddings[index]\n",
|
40 |
+
" return voxels, embeddings\n",
|
41 |
+
"\n",
|
42 |
+
" def __len__(self):\n",
|
43 |
+
" return self.len\n",
|
44 |
+
" \n",
|
45 |
+
"class VoxelsEmbeddinsEncodecDataModule(L.LightningDataModule):\n",
|
46 |
+
" def __init__(self, train_voxels_path, train_embeddings_path, test_voxels_path, test_embeddings_path, batch_size=32):\n",
|
47 |
+
" super().__init__()\n",
|
48 |
+
" self.train_voxels_path = train_voxels_path\n",
|
49 |
+
" self.train_embeddings_path = train_embeddings_path\n",
|
50 |
+
" self.test_voxels_path = test_voxels_path\n",
|
51 |
+
" self.test_embeddings_path = test_embeddings_path\n",
|
52 |
+
" self.batch_size = batch_size\n",
|
53 |
+
"\n",
|
54 |
+
" def setup(self, stage=None):\n",
|
55 |
+
" self.train_dataset = VoxelsDataset(self.train_voxels_path, self.train_embeddings_path)\n",
|
56 |
+
" self.test_dataset = VoxelsDataset(self.test_voxels_path, self.test_embeddings_path)\n",
|
57 |
+
"\n",
|
58 |
+
" def train_dataloader(self):\n",
|
59 |
+
" return data.DataLoader(self.train_dataset, batch_size=self.batch_size, shuffle=True)\n",
|
60 |
+
"\n",
|
61 |
+
" def test_dataloader(self):\n",
|
62 |
+
" return data.DataLoader(self.test_dataset, batch_size=self.batch_size, shuffle=False)\n"
|
63 |
+
]
|
64 |
+
},
|
65 |
+
{
|
66 |
+
"cell_type": "code",
|
67 |
+
"execution_count": null,
|
68 |
+
"metadata": {},
|
69 |
+
"outputs": [],
|
70 |
+
"source": [
|
71 |
+
"class MLP(L.LightningModule):\n",
|
72 |
+
" def __init__(self, sizes, residual_conections, dropout):\n",
|
73 |
+
" # sizes is a list of the sizes of the layers ej: [4800, 1000, 1000, 1000, 1000, 1000, 1000, 600]\n",
|
74 |
+
" # residual_conections is a list with the same length as sizes, each element is a list of the indexes of the layers that will recieve the output of the layer as input, 0 means that the layer will recieve the x inputs ej. [[0], [1], [2,1], [3], [4,3], [5], [6,5], [7]]\n",
|
75 |
+
" # dropout is a list with the same length as sizes, each element is the dropout probability of the layer ej. [0.5, 0.5, 0.5, 0.5, 0.5, 0.5]\n",
|
76 |
+
" super().__init__()\n",
|
77 |
+
" self.sizes = sizes\n",
|
78 |
+
" self.residual_conections = residual_conections\n",
|
79 |
+
" self.dropout = dropout\n",
|
80 |
+
" self.layers = nn.ModuleList()\n",
|
81 |
+
" for i in range(len(sizes)-1):\n",
|
82 |
+
" self.layers.append(nn.Linear(sizes[i], sizes[i+1]))\n",
|
83 |
+
" self.relu = nn.ReLU()\n",
|
84 |
+
" self.loss = nn.MSELoss()\n",
|
85 |
+
"\n",
|
86 |
+
" def forward(self, x):\n",
|
87 |
+
" x_states = [x]\n",
|
88 |
+
" for i in range(len(self.layers)):\n",
|
89 |
+
" x = self.layers[i](x)\n",
|
90 |
+
" for j in self.residual_conections[i]:\n",
|
91 |
+
" x = x + x_states[j]\n",
|
92 |
+
" x = self.relu(x)\n",
|
93 |
+
" x = nn.Dropout(self.dropout[i])(x)\n",
|
94 |
+
" x_states.append(x)\n",
|
95 |
+
"\n",
|
96 |
+
" return x\n",
|
97 |
+
" \n",
|
98 |
+
" def training_step(self, batch, batch_idx):\n",
|
99 |
+
" voxels, embeddings = batch # the sizes are [batch_size, 10, 65000] and [batch_size, 2, 1125]\n",
|
100 |
+
" # flatten the voxels to [batch_size, rest of the dimensions]\n",
|
101 |
+
" embeddings = embeddings.flatten(start_dim=1) # the size is [batch_size, 2250]\n",
|
102 |
+
" # take the mean of the second dimension of the voxels to get the mean of the 10 samples per stimulus\n",
|
103 |
+
" voxels = voxels.mean(dim=1)\n",
|
104 |
+
" voxels = voxels.flatten(start_dim=1) # the size is [batch_size, 65000]\n",
|
105 |
+
" outputs = self(voxels)\n",
|
106 |
+
" loss = self.loss(outputs, embeddings)\n",
|
107 |
+
" self.log('train_loss', loss)\n",
|
108 |
+
" return loss\n",
|
109 |
+
" \n",
|
110 |
+
" def validation_step(self, batch, batch_idx):\n",
|
111 |
+
" voxels, embeddings = batch\n",
|
112 |
+
" embeddings = embeddings.flatten(start_dim=1)\n",
|
113 |
+
" voxels = voxels.mean(dim=1)\n",
|
114 |
+
" voxels = voxels.flatten(start_dim=1)\n",
|
115 |
+
" outputs = self(voxels)\n",
|
116 |
+
" loss = self.loss(outputs, embeddings)\n",
|
117 |
+
" self.log('val_loss', loss)\n",
|
118 |
+
" return loss\n",
|
119 |
+
" \n",
|
120 |
+
" \n",
|
121 |
+
" def configure_optimizers(self):\n",
|
122 |
+
" return torch.optim.Adam(self.parameters(), lr=1e-3)\n",
|
123 |
+
" \n",
|
124 |
+
"\n",
|
125 |
+
"# create the model\n",
|
126 |
+
"sizes = [60784, 1000, 1000, 2250]\n",
|
127 |
+
"residual_conections = [[0], [1], [2,1], [3]]\n",
|
128 |
+
"dropout = [0.5, 0.5, 0.5, 0.5]\n",
|
129 |
+
"model = MLP(sizes, residual_conections, dropout)\n",
|
130 |
+
"\n",
|
131 |
+
"# create the data module\n",
|
132 |
+
"data_module = VoxelsEmbeddinsEncodecDataModule(train_voxels_path, train_embeddings_path, test_voxels_path, test_embeddings_path, batch_size=32)\n",
|
133 |
+
"\n",
|
134 |
+
"\n",
|
135 |
+
"wandb_logger = WandbLogger(project='brain2music', entity='ckadirt')\n",
|
136 |
+
"\n",
|
137 |
+
"# define the trainer\n",
|
138 |
+
"trainer = L.Trainer(devices=2, accelerator=\"gpu\", max_epochs=100, logger=wandb_logger, precision='16-mixed')\n",
|
139 |
+
"\n",
|
140 |
+
"# train the model\n",
|
141 |
+
"trainer.fit(model, data_module)\n"
|
142 |
+
]
|
143 |
+
},
|
144 |
+
{
|
145 |
+
"cell_type": "code",
|
146 |
+
"execution_count": null,
|
147 |
+
"metadata": {},
|
148 |
+
"outputs": [],
|
149 |
+
"source": [
|
150 |
+
"class MLP(L.LightningModule):\n",
|
151 |
+
" def __init__(self, sizes, residual_conections, dropout):\n",
|
152 |
+
" # sizes is a list of the sizes of the layers ej: [4800, 1000, 1000, 1000, 1000, 1000, 1000, 600]\n",
|
153 |
+
" # residual_conections is a list with the same length as sizes, each element is a list of the indexes of the layers that will recieve the output of the layer as input, 0 means that the layer will recieve the x inputs ej. [[0], [1], [2,1], [3], [4,3], [5], [6,5], [7]]\n",
|
154 |
+
" # dropout is a list with the same length as sizes, each element is the dropout probability of the layer ej. [0.5, 0.5, 0.5, 0.5, 0.5, 0.5]\n",
|
155 |
+
" super().__init__()\n",
|
156 |
+
" self.sizes = sizes\n",
|
157 |
+
" self.residual_conections = residual_conections\n",
|
158 |
+
" self.dropout = dropout\n",
|
159 |
+
" self.layers = nn.Sequential()\n",
|
160 |
+
" for i in range(len(sizes)-1):\n",
|
161 |
+
" self.layers.add_module('linear'+str(i), nn.Linear(sizes[i], sizes[i+1]))\n",
|
162 |
+
" self.layers.add_module('relu'+str(i), nn.ReLU())\n",
|
163 |
+
" self.layers.add_module('dropout'+str(i), nn.Dropout(dropout[i]))\n",
|
164 |
+
"\n",
|
165 |
+
" self.loss = nn.MSELoss()\n",
|
166 |
+
"\n",
|
167 |
+
" def forward(self, x):\n",
|
168 |
+
" return self.layers(x)\n",
|
169 |
+
" \n",
|
170 |
+
" def training_step(self, batch, batch_idx):\n",
|
171 |
+
" voxels, embeddings = batch # the sizes are [batch_size, 10, 65000] and [batch_size, 2, 1125]\n",
|
172 |
+
" # flatten the voxels to [batch_size, rest of the dimensions]\n",
|
173 |
+
" embeddings = embeddings.flatten(start_dim=1) # the size is [batch_size, 2250]\n",
|
174 |
+
" # take the mean of the second dimension of the voxels to get the mean of the 10 samples per stimulus\n",
|
175 |
+
" voxels = voxels.mean(dim=1)\n",
|
176 |
+
" voxels = voxels.flatten(start_dim=1) # the size is [batch_size, 65000]\n",
|
177 |
+
" outputs = self(voxels)\n",
|
178 |
+
" loss = self.loss(outputs, embeddings)\n",
|
179 |
+
" self.log('train_loss', loss)\n",
|
180 |
+
" return loss\n",
|
181 |
+
" \n",
|
182 |
+
" def validation_step(self, batch, batch_idx):\n",
|
183 |
+
" voxels, embeddings = batch\n",
|
184 |
+
" embeddings = embeddings.flatten(start_dim=1)\n",
|
185 |
+
" voxels = voxels.mean(dim=1)\n",
|
186 |
+
" voxels = voxels.flatten(start_dim=1)\n",
|
187 |
+
" outputs = self(voxels)\n",
|
188 |
+
" loss = self.loss(outputs, embeddings)\n",
|
189 |
+
" self.log('val_loss', loss)\n",
|
190 |
+
" return loss\n",
|
191 |
+
" \n",
|
192 |
+
" \n",
|
193 |
+
" def configure_optimizers(self):\n",
|
194 |
+
" return torch.optim.Adam(self.parameters(), lr=1e-5)\n",
|
195 |
+
" \n",
|
196 |
+
"\n",
|
197 |
+
"# create the model\n",
|
198 |
+
"sizes = [60784, 1000, 1000, 2250]\n",
|
199 |
+
"residual_conections = [[0], [1], [2], [3]]\n",
|
200 |
+
"dropout = [0.5, 0.5, 0.5, 0.5]\n",
|
201 |
+
"model = MLP(sizes, residual_conections, dropout)\n",
|
202 |
+
"\n",
|
203 |
+
"# create the data module\n",
|
204 |
+
"data_module = VoxelsEmbeddinsEncodecDataModule(train_voxels_path, train_embeddings_path, test_voxels_path, test_embeddings_path, batch_size=32)\n",
|
205 |
+
"\n",
|
206 |
+
"\n",
|
207 |
+
"wandb_logger = WandbLogger(project='brain2music', entity='ckadirt')\n",
|
208 |
+
"\n",
|
209 |
+
"# define the trainer\n",
|
210 |
+
"trainer = L.Trainer(devices=2, accelerator=\"gpu\", max_epochs=400, logger=wandb_logger, precision='16-mixed', log_every_n_steps=10)\n",
|
211 |
+
"\n",
|
212 |
+
"# train the model\n",
|
213 |
+
"trainer.fit(model, datamodule=data_module)\n"
|
214 |
+
]
|
215 |
+
},
|
216 |
+
{
|
217 |
+
"cell_type": "code",
|
218 |
+
"execution_count": null,
|
219 |
+
"metadata": {},
|
220 |
+
"outputs": [],
|
221 |
+
"source": [
|
222 |
+
"class MLP(L.LightningModule):\n",
|
223 |
+
" def __init__(self, sizes, residual_conections, dropout):\n",
|
224 |
+
" # sizes is a list of the sizes of the layers ej: [4800, 1000, 1000, 1000, 1000, 1000, 1000, 600]\n",
|
225 |
+
" # residual_conections is a list with the same length as sizes, each element is a list of the indexes of the layers that will recieve the output of the layer as input, 0 means that the layer will recieve the x inputs ej. [[0], [1], [2,1], [3], [4,3], [5], [6,5], [7]]\n",
|
226 |
+
" # dropout is a list with the same length as sizes, each element is the dropout probability of the layer ej. [0.5, 0.5, 0.5, 0.5, 0.5, 0.5]\n",
|
227 |
+
" super().__init__()\n",
|
228 |
+
" self.sizes = sizes\n",
|
229 |
+
" self.residual_conections = residual_conections\n",
|
230 |
+
" self.dropout = dropout\n",
|
231 |
+
" self.layers = nn.Sequential()\n",
|
232 |
+
" for i in range(len(sizes)-1):\n",
|
233 |
+
" self.layers.add_module('linear'+str(i), nn.Linear(sizes[i], sizes[i+1]))\n",
|
234 |
+
" self.layers.add_module('relu'+str(i), nn.ReLU())\n",
|
235 |
+
" self.layers.add_module('dropout'+str(i), nn.Dropout(dropout[i]))\n",
|
236 |
+
"\n",
|
237 |
+
" self.loss = nn.CrossEntropyLoss()\n",
|
238 |
+
"\n",
|
239 |
+
" def forward(self, x):\n",
|
240 |
+
" return self.layers(x)\n",
|
241 |
+
" \n",
|
242 |
+
" def training_step(self, batch, batch_idx):\n",
|
243 |
+
" voxels, embeddings = batch # the sizes are [batch_size, 10, 65000] and [batch_size, 2, 1125]\n",
|
244 |
+
" # flatten the voxels to [batch_size, rest of the dimensions]\n",
|
245 |
+
" embeddings = embeddings.flatten(start_dim=1).long() # the size is [batch_size, 2250] \n",
|
246 |
+
" #take just the first 200 embeddings\n",
|
247 |
+
" embeddings = embeddings[:, :200]\n",
|
248 |
+
" # take the mean of the second dimension of the voxels to get the mean of the 10 samples per stimulus\n",
|
249 |
+
" voxels = voxels.mean(dim=1)\n",
|
250 |
+
" voxels = voxels.flatten(start_dim=1) # the size is [batch_size, 65000]\n",
|
251 |
+
" outputs = self(voxels)\n",
|
252 |
+
" # the outputs are [batch_size, 200*1024], we need to reshape them to [batch_size, 200, 1024]\n",
|
253 |
+
" outputs = outputs.reshape(-1, 1024, 200)\n",
|
254 |
+
" loss = self.loss(outputs, embeddings)\n",
|
255 |
+
" acuracy = self.tokens_accuracy(outputs, embeddings)\n",
|
256 |
+
" self.log('train_loss', loss)\n",
|
257 |
+
" self.log('train_accuracy', acuracy)\n",
|
258 |
+
" return loss\n",
|
259 |
+
" \n",
|
260 |
+
" def tokens_accuracy(self, outputs, embeddings):\n",
|
261 |
+
" # outputs is [batch_size, 1024, 200]\n",
|
262 |
+
" # embeddings is [batch_size, 200]\n",
|
263 |
+
" # we need to get the index of the maximum value of each token\n",
|
264 |
+
" outputs = outputs.argmax(dim=1)\n",
|
265 |
+
" # now we need to compare the outputs with the embeddings\n",
|
266 |
+
" return (outputs == embeddings).float().mean()\n",
|
267 |
+
"\n",
|
268 |
+
" \n",
|
269 |
+
" def validation_step(self, batch, batch_idx):\n",
|
270 |
+
" voxels, embeddings = batch\n",
|
271 |
+
" embeddings = embeddings.flatten(start_dim=1).long()\n",
|
272 |
+
" embeddings = embeddings[:, :200]\n",
|
273 |
+
" voxels = voxels.mean(dim=1)\n",
|
274 |
+
" voxels = voxels.flatten(start_dim=1)\n",
|
275 |
+
" outputs = self(voxels)\n",
|
276 |
+
" outputs = outputs.reshape(-1, 1024, 200)\n",
|
277 |
+
" loss = self.loss(outputs, embeddings)\n",
|
278 |
+
" accuracy = self.tokens_accuracy(outputs, embeddings)\n",
|
279 |
+
" self.log('val_loss', loss)\n",
|
280 |
+
" self.log('val_accuracy', accuracy)\n",
|
281 |
+
" return loss\n",
|
282 |
+
" \n",
|
283 |
+
" \n",
|
284 |
+
" def configure_optimizers(self):\n",
|
285 |
+
" return torch.optim.Adam(self.parameters(), lr=1e-5)\n",
|
286 |
+
" \n",
|
287 |
+
"\n",
|
288 |
+
"# create the model\n",
|
289 |
+
"sizes = [60784, 1000, 1000, 200*1024]\n",
|
290 |
+
"residual_conections = [[0], [1], [2], [3]]\n",
|
291 |
+
"dropout = [0.5, 0.5, 0.5, 0.5]\n",
|
292 |
+
"model = MLP(sizes, residual_conections, dropout)\n",
|
293 |
+
"\n",
|
294 |
+
"# create the data module\n",
|
295 |
+
"data_module = VoxelsEmbeddinsEncodecDataModule(train_voxels_path, train_embeddings_path, test_voxels_path, test_embeddings_path, batch_size=2)\n",
|
296 |
+
"\n",
|
297 |
+
"wandb.finish()\n",
|
298 |
+
"\n",
|
299 |
+
"wandb_logger = WandbLogger(project='brain2music', entity='ckadirt')\n",
|
300 |
+
"\n",
|
301 |
+
"# define the trainer\n",
|
302 |
+
"trainer = L.Trainer(devices=2, accelerator=\"gpu\", max_epochs=400, logger=wandb_logger, precision='16-mixed', log_every_n_steps=10)\n",
|
303 |
+
"\n",
|
304 |
+
"# train the model\n",
|
305 |
+
"trainer.fit(model, datamodule=data_module)\n"
|
306 |
+
]
|
307 |
+
},
|
308 |
+
{
|
309 |
+
"cell_type": "code",
|
310 |
+
"execution_count": null,
|
311 |
+
"metadata": {},
|
312 |
+
"outputs": [],
|
313 |
+
"source": [
|
314 |
+
"class MLP(L.LightningModule):\n",
|
315 |
+
" def __init__(self, sizes, residual_conections, dropout):\n",
|
316 |
+
" # sizes is a list of the sizes of the layers ej: [4800, 1000, 1000, 1000, 1000, 1000, 1000, 600]\n",
|
317 |
+
" # residual_conections is a list with the same length as sizes, each element is a list of the indexes of the layers that will recieve the output of the layer as input, 0 means that the layer will recieve the x inputs ej. [[0], [1], [2,1], [3], [4,3], [5], [6,5], [7]]\n",
|
318 |
+
" # dropout is a list with the same length as sizes, each element is the dropout probability of the layer ej. [0.5, 0.5, 0.5, 0.5, 0.5, 0.5]\n",
|
319 |
+
" super().__init__()\n",
|
320 |
+
" self.sizes = sizes\n",
|
321 |
+
" self.residual_conections = residual_conections\n",
|
322 |
+
" self.dropout = dropout\n",
|
323 |
+
" self.layers = nn.Sequential()\n",
|
324 |
+
" for i in range(len(sizes)-1):\n",
|
325 |
+
" self.layers.add_module('linear'+str(i), nn.Linear(sizes[i], sizes[i+1]))\n",
|
326 |
+
" self.layers.add_module('relu'+str(i), nn.ReLU())\n",
|
327 |
+
" self.layers.add_module('dropout'+str(i), nn.Dropout(dropout[i]))\n",
|
328 |
+
"\n",
|
329 |
+
" self.loss = nn.CrossEntropyLoss()\n",
|
330 |
+
"\n",
|
331 |
+
" def forward(self, x):\n",
|
332 |
+
" return self.layers(x)\n",
|
333 |
+
" \n",
|
334 |
+
" def training_step(self, batch, batch_idx):\n",
|
335 |
+
" voxels, embeddings = batch # the sizes are [batch_size, 10, 65000] and [batch_size, 2, 1125]\n",
|
336 |
+
" # flatten the voxels to [batch_size, rest of the dimensions]\n",
|
337 |
+
" embeddings = embeddings.flatten(start_dim=1).long() # the size is [batch_size, 2250] \n",
|
338 |
+
" #take just the first 200 embeddings\n",
|
339 |
+
" embeddings = embeddings[:, :200]\n",
|
340 |
+
" # take the mean of the second dimension of the voxels to get the mean of the 10 samples per stimulus\n",
|
341 |
+
" voxels = voxels[:, 1, :]\n",
|
342 |
+
" voxels = voxels.flatten(start_dim=1) # the size is [batch_size, 65000]\n",
|
343 |
+
" outputs = self(voxels)\n",
|
344 |
+
" # the outputs are [batch_size, 200*1024], we need to reshape them to [batch_size, 200, 1024]\n",
|
345 |
+
" outputs = outputs.reshape(-1, 1024, 200)\n",
|
346 |
+
" loss = self.loss(outputs, embeddings)\n",
|
347 |
+
" acuracy = self.tokens_accuracy(outputs, embeddings)\n",
|
348 |
+
" self.log('train_loss', loss)\n",
|
349 |
+
" self.log('train_accuracy', acuracy)\n",
|
350 |
+
" return loss\n",
|
351 |
+
" \n",
|
352 |
+
" def tokens_accuracy(self, outputs, embeddings):\n",
|
353 |
+
" # outputs is [batch_size, 1024, 200]\n",
|
354 |
+
" # embeddings is [batch_size, 200]\n",
|
355 |
+
" # we need to get the index of the maximum value of each token\n",
|
356 |
+
" outputs = outputs.argmax(dim=1)\n",
|
357 |
+
" # now we need to compare the outputs with the embeddings\n",
|
358 |
+
" return (outputs == embeddings).float().mean()\n",
|
359 |
+
"\n",
|
360 |
+
" \n",
|
361 |
+
" def validation_step(self, batch, batch_idx):\n",
|
362 |
+
" voxels, embeddings = batch\n",
|
363 |
+
" embeddings = embeddings.flatten(start_dim=1).long()\n",
|
364 |
+
" embeddings = embeddings[:, :200]\n",
|
365 |
+
" voxels = voxels[:, 1, :]\n",
|
366 |
+
" voxels = voxels.flatten(start_dim=1)\n",
|
367 |
+
" outputs = self(voxels)\n",
|
368 |
+
" outputs = outputs.reshape(-1, 1024, 200)\n",
|
369 |
+
" loss = self.loss(outputs, embeddings)\n",
|
370 |
+
" accuracy = self.tokens_accuracy(outputs, embeddings)\n",
|
371 |
+
" self.log('val_loss', loss)\n",
|
372 |
+
" self.log('val_accuracy', accuracy)\n",
|
373 |
+
" return loss\n",
|
374 |
+
" \n",
|
375 |
+
" \n",
|
376 |
+
" def configure_optimizers(self):\n",
|
377 |
+
" return torch.optim.Adam(self.parameters(), lr=1e-6)\n",
|
378 |
+
" \n",
|
379 |
+
"\n",
|
380 |
+
"# create the model\n",
|
381 |
+
"sizes = [60784, 1000, 1000, 200*1024]\n",
|
382 |
+
"residual_conections = [[0], [1], [2], [3]]\n",
|
383 |
+
"dropout = [0.2, 0.2, 0.2, 0.2]\n",
|
384 |
+
"model = MLP(sizes, residual_conections, dropout)\n",
|
385 |
+
"\n",
|
386 |
+
"# create the data module\n",
|
387 |
+
"data_module = VoxelsEmbeddinsEncodecDataModule(train_voxels_path, train_embeddings_path, test_voxels_path, test_embeddings_path, batch_size=4)\n",
|
388 |
+
"\n",
|
389 |
+
"wandb.finish()\n",
|
390 |
+
"\n",
|
391 |
+
"wandb_logger = WandbLogger(project='brain2music', entity='ckadirt')\n",
|
392 |
+
"\n",
|
393 |
+
"# define the trainer\n",
|
394 |
+
"trainer = L.Trainer(devices=2, accelerator=\"gpu\", max_epochs=400, logger=wandb_logger, precision='16-mixed', log_every_n_steps=10)\n",
|
395 |
+
"\n",
|
396 |
+
"# train the model\n",
|
397 |
+
"trainer.fit(model, datamodule=data_module)\n"
|
398 |
+
]
|
399 |
+
},
|
400 |
+
{
|
401 |
+
"cell_type": "code",
|
402 |
+
"execution_count": null,
|
403 |
+
"metadata": {},
|
404 |
+
"outputs": [],
|
405 |
+
"source": [
|
406 |
+
"model3.eval()\n",
|
407 |
+
"outputs = torch.Tensor((480,200))\n",
|
408 |
+
"with torch.no_grad():\n",
|
409 |
+
" test_dataset = VoxelsDataset(test_voxels_path, test_embeddings_path)\n",
|
410 |
+
" dataloader = data.DataLoader(test_dataset, batch_size = 2)\n",
|
411 |
+
" for i, (voxels, embeddings) in enumerate(dataloader):\n",
|
412 |
+
" voxels = voxels[:, 1, :]\n",
|
413 |
+
" voxels = voxels.flatten(start_dim=1) # the size is [batch_size, 65000]\n",
|
414 |
+
" bout = model3(voxels)\n",
|
415 |
+
" bout = bout.reshape(-1, 1024, 200)\n",
|
416 |
+
" # the 1024 dimension is the number of tokens, we need to get the index of the maximum value of each token\n",
|
417 |
+
" bout = bout.argmax(dim=1)\n",
|
418 |
+
" # now we need to add the outputs to the outputs tensor\n",
|
419 |
+
" outputs[i*2:(i+1)*2] = bout\n",
|
420 |
+
" \n",
|
421 |
+
" \n",
|
422 |
+
"# save the predicted outputs on the current directory\n",
|
423 |
+
"torch.save(outputs, 'outputs.pt')"
|
424 |
+
]
|
425 |
+
}
|
426 |
+
],
|
427 |
+
"metadata": {
|
428 |
+
"kernelspec": {
|
429 |
+
"display_name": "b2m",
|
430 |
+
"language": "python",
|
431 |
+
"name": "python3"
|
432 |
+
},
|
433 |
+
"language_info": {
|
434 |
+
"codemirror_mode": {
|
435 |
+
"name": "ipython",
|
436 |
+
"version": 3
|
437 |
+
},
|
438 |
+
"file_extension": ".py",
|
439 |
+
"mimetype": "text/x-python",
|
440 |
+
"name": "python",
|
441 |
+
"nbconvert_exporter": "python",
|
442 |
+
"pygments_lexer": "ipython3",
|
443 |
+
"version": "3.11.4"
|
444 |
+
},
|
445 |
+
"orig_nbformat": 4
|
446 |
+
},
|
447 |
+
"nbformat": 4,
|
448 |
+
"nbformat_minor": 2
|
449 |
+
}
|
src/.ipynb_checkpoints/MLPencoder-checkpoint.ipynb
ADDED
The diff for this file is too large to render.
See raw diff
|
|
src/.ipynb_checkpoints/mlpdummy-checkpoint.py
ADDED
@@ -0,0 +1,146 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os, torch, torch.nn as nn, torch.utils.data as data, torchvision as tv
|
2 |
+
import lightning as L
|
3 |
+
import numpy as np, pandas as pd, matplotlib.pyplot as plt
|
4 |
+
from pytorch_lightning.loggers import WandbLogger
|
5 |
+
import wandb
|
6 |
+
import pytorch_lightning as pl
|
7 |
+
|
8 |
+
torch.set_float32_matmul_precision('medium')
|
9 |
+
|
10 |
+
# create the datasets and dataloaders
|
11 |
+
train_voxels_path = '/fsx/proj-fmri/ckadirt/b2m/data/sub-001_Resp_Training.npy' # path to training voxels 65000 * 4800
|
12 |
+
test_voxels_path = '/fsx/proj-fmri/ckadirt/b2m/data/sub-001_Resp_Test_Mean.npy' # path to test voxels 65000 * 600
|
13 |
+
|
14 |
+
train_embeddings_path = '/fsx/proj-fmri/ckadirt/b2m/data/encodec_training_embeds_sorted.npy' # path to training embeddings 480 * 2 * 1125
|
15 |
+
test_embeddings_path = '/fsx/proj-fmri/ckadirt/b2m/data/encodec_testing_embeds_sorted.npy' # path to test embeddings 600 * 2 * 1125
|
16 |
+
|
17 |
+
class VoxelsDataset(data.Dataset):
|
18 |
+
def __init__(self, voxels_path, embeddings_path):
|
19 |
+
# transpose the two dimensions of the voxels data to match the embeddings data
|
20 |
+
self.voxels = torch.from_numpy(np.load(voxels_path)).float().transpose(0, 1)
|
21 |
+
self.embeddings = torch.from_numpy(np.load(embeddings_path))
|
22 |
+
# as each stimulus has been exposed for 15 seconds and the fMRI data is sampled every 1.5 seconds, we take 10 samples per stimulus
|
23 |
+
self.len = len(self.voxels) // 10
|
24 |
+
print("The len is ", self.len )
|
25 |
+
|
26 |
+
def __getitem__(self, index):
|
27 |
+
# as each stimulus has been exposed for 15 seconds and the fMRI data is sampled every 1.5 seconds, we take 10 samples per stimulus
|
28 |
+
voxels = self.voxels[index*10:(index+1)*10]
|
29 |
+
embeddings = self.embeddings[index]
|
30 |
+
return voxels, embeddings
|
31 |
+
|
32 |
+
def __len__(self):
|
33 |
+
return self.len
|
34 |
+
|
35 |
+
class VoxelsEmbeddinsEncodecDataModule(pl.LightningDataModule):
|
36 |
+
def __init__(self, train_voxels_path, train_embeddings_path, test_voxels_path, test_embeddings_path, batch_size=8):
|
37 |
+
super().__init__()
|
38 |
+
self.train_voxels_path = train_voxels_path
|
39 |
+
self.train_embeddings_path = train_embeddings_path
|
40 |
+
self.test_voxels_path = test_voxels_path
|
41 |
+
self.test_embeddings_path = test_embeddings_path
|
42 |
+
self.batch_size = batch_size
|
43 |
+
|
44 |
+
def setup(self, stage=None):
|
45 |
+
self.train_dataset = VoxelsDataset(self.train_voxels_path, self.train_embeddings_path)
|
46 |
+
self.test_dataset = VoxelsDataset(self.test_voxels_path, self.test_embeddings_path)
|
47 |
+
|
48 |
+
def train_dataloader(self):
|
49 |
+
return data.DataLoader(self.train_dataset, batch_size=self.batch_size, shuffle=True)
|
50 |
+
|
51 |
+
def val_dataloader(self):
|
52 |
+
return data.DataLoader(self.test_dataset, batch_size=self.batch_size, shuffle=False)
|
53 |
+
|
54 |
+
|
55 |
+
class MLP(pl.LightningModule):
|
56 |
+
def __init__(self, sizes, residual_conections, dropout):
|
57 |
+
# sizes is a list of the sizes of the layers ej: [4800, 1000, 1000, 1000, 1000, 1000, 1000, 600]
|
58 |
+
# residual_conections is a list with the same length as sizes, each element is a list of the indexes of the layers that will recieve the output of the layer as input, 0 means that the layer will recieve the x inputs ej. [[0], [1], [2,1], [3], [4,3], [5], [6,5], [7]]
|
59 |
+
# dropout is a list with the same length as sizes, each element is the dropout probability of the layer ej. [0.5, 0.5, 0.5, 0.5, 0.5, 0.5]
|
60 |
+
super().__init__()
|
61 |
+
self.sizes = sizes
|
62 |
+
self.residual_conections = residual_conections
|
63 |
+
self.dropout = dropout
|
64 |
+
self.layers = nn.Sequential()
|
65 |
+
for i in range(len(sizes)-1):
|
66 |
+
self.layers.add_module('linear'+str(i), nn.Linear(sizes[i], sizes[i+1]))
|
67 |
+
self.layers.add_module('relu'+str(i), nn.ReLU())
|
68 |
+
self.layers.add_module('dropout'+str(i), nn.Dropout(dropout[i]))
|
69 |
+
|
70 |
+
self.loss = nn.CrossEntropyLoss(reduction='mean')
|
71 |
+
|
72 |
+
def forward(self, x):
|
73 |
+
return self.layers(x)
|
74 |
+
|
75 |
+
def training_step(self, batch, batch_idx):
|
76 |
+
voxels, embeddings = batch # the sizes are [batch_size, 10, 65000] and [batch_size, 2, 1125]
|
77 |
+
# flatten the voxels to [batch_size, rest of the dimensions]
|
78 |
+
embeddings = embeddings.flatten(start_dim=1).long() # the size is [batch_size, 2250]
|
79 |
+
#take just the first 200 embeddings
|
80 |
+
# embeddings = embeddings[:, :200]
|
81 |
+
# take the mean of the second dimension of the voxels to get the mean of the 10 samples per stimulus
|
82 |
+
voxels = voxels.mean(dim=1)
|
83 |
+
voxels = voxels.flatten(start_dim=1) # the size is [batch_size, 65000]
|
84 |
+
outputs = self(voxels)
|
85 |
+
# the outputs are [batch_size, 200*1024], we need to reshape them to [batch_size, 200, 1024]
|
86 |
+
outputs = outputs.reshape(-1, 1024, 1125*2)
|
87 |
+
# avoid division by zero
|
88 |
+
outputs = outputs + 1e-6
|
89 |
+
#print(outputs.shape, embeddings.shape)
|
90 |
+
#print(outputs[0,0,:10], embeddings[0,:10])
|
91 |
+
loss = self.loss(outputs, embeddings)
|
92 |
+
#print(loss)
|
93 |
+
acuracy = self.tokens_accuracy(outputs, embeddings)
|
94 |
+
self.log('train_loss', loss)
|
95 |
+
self.log('train_accuracy', acuracy)
|
96 |
+
return loss
|
97 |
+
|
98 |
+
def tokens_accuracy(self, outputs, embeddings):
|
99 |
+
# outputs is [batch_size, 1024, 200]
|
100 |
+
# embeddings is [batch_size, 200]
|
101 |
+
# we need to get the index of the maximum value of each token
|
102 |
+
outputs = outputs.argmax(dim=1)
|
103 |
+
# now we need to compare the outputs with the embeddings
|
104 |
+
return (outputs == embeddings).float().mean()
|
105 |
+
|
106 |
+
|
107 |
+
def validation_step(self, batch, batch_idx):
|
108 |
+
voxels, embeddings = batch
|
109 |
+
embeddings = embeddings.flatten(start_dim=1).long()
|
110 |
+
#embeddings = embeddings[:, :200]
|
111 |
+
voxels = voxels.mean(dim=1)
|
112 |
+
voxels = voxels.flatten(start_dim=1)
|
113 |
+
outputs = self(voxels)
|
114 |
+
outputs = outputs.reshape(-1, 1024, 1125*2)
|
115 |
+
loss = self.loss(outputs, embeddings)
|
116 |
+
accuracy = self.tokens_accuracy(outputs, embeddings)
|
117 |
+
self.log('val_loss', loss)
|
118 |
+
self.log('val_accuracy', accuracy)
|
119 |
+
return loss
|
120 |
+
|
121 |
+
|
122 |
+
def configure_optimizers(self):
|
123 |
+
return torch.optim.Adam(self.trainer.model.parameters(), lr=2e-5, weight_decay=3e-3)
|
124 |
+
|
125 |
+
|
126 |
+
# create the model
|
127 |
+
sizes = [60784, 1000, 1000, 1125*2*1024]
|
128 |
+
residual_conections = [[0], [1], [2], [3]]
|
129 |
+
dropout = [0.5, 0.5, 0.5, 0.5]
|
130 |
+
model = MLP(sizes, residual_conections, dropout)
|
131 |
+
|
132 |
+
|
133 |
+
# create the data module
|
134 |
+
data_module = VoxelsEmbeddinsEncodecDataModule(train_voxels_path, train_embeddings_path, test_voxels_path, test_embeddings_path, batch_size=4)
|
135 |
+
|
136 |
+
wandb.finish()
|
137 |
+
from pytorch_lightning.strategies import DeepSpeedStrategy
|
138 |
+
|
139 |
+
wandb_logger = WandbLogger(project='brain2music', entity='ckadirt')
|
140 |
+
|
141 |
+
# define the trainer
|
142 |
+
trainer = pl.Trainer(accelerator="gpu", devices = [0,1,2,3,4,5,6,7], max_epochs=1000, logger=wandb_logger, precision='32', strategy=DeepSpeedStrategy(stage=3, logging_batch_size_per_gpu=8), enable_checkpointing=False, log_every_n_steps=10)
|
143 |
+
#trainer = pl.Trainer(accelerator="gpu", devices = [0,1,2,3], max_epochs=1000, logger=wandb_logger, precision='bf16', strategy='fsdp', enable_checkpointing=False, log_every_n_steps=10)
|
144 |
+
# train the model
|
145 |
+
trainer.fit(model, datamodule=data_module)
|
146 |
+
|
src/.ipynb_checkpoints/musicgen_test copy-checkpoint.ipynb
ADDED
The diff for this file is too large to render.
See raw diff
|
|
src/Copy_of_MusicGen.ipynb
ADDED
The diff for this file is too large to render.
See raw diff
|
|
src/MLP-model copy.ipynb
ADDED
@@ -0,0 +1,581 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"cells": [
|
3 |
+
{
|
4 |
+
"cell_type": "code",
|
5 |
+
"execution_count": 1,
|
6 |
+
"metadata": {},
|
7 |
+
"outputs": [
|
8 |
+
{
|
9 |
+
"name": "stderr",
|
10 |
+
"output_type": "stream",
|
11 |
+
"text": [
|
12 |
+
"/home/ckadirt/miniconda3/envs/b2m/lib/python3.11/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
|
13 |
+
" from .autonotebook import tqdm as notebook_tqdm\n"
|
14 |
+
]
|
15 |
+
}
|
16 |
+
],
|
17 |
+
"source": [
|
18 |
+
"import os, torch, torch.nn as nn, torch.utils.data as data, torchvision as tv\n",
|
19 |
+
"import lightning as L\n",
|
20 |
+
"import numpy as np, pandas as pd, matplotlib.pyplot as plt\n",
|
21 |
+
"from pytorch_lightning.loggers import WandbLogger"
|
22 |
+
]
|
23 |
+
},
|
24 |
+
{
|
25 |
+
"cell_type": "code",
|
26 |
+
"execution_count": 5,
|
27 |
+
"metadata": {},
|
28 |
+
"outputs": [],
|
29 |
+
"source": [
|
30 |
+
"# create the datasets and dataloaders\n",
|
31 |
+
"train_voxels_path = '/home/ckadirt/brain2music/dataset/preproc/sub-001_Resp_Training.npy' # path to training voxels 65000 * 4800 \n",
|
32 |
+
"test_voxels_path = '/home/ckadirt/brain2music/dataset/preproc/sub-001_Resp_Test_Mean.npy' # path to test voxels 65000 * 600\n",
|
33 |
+
"\n",
|
34 |
+
"train_embeddings_path = '/home/ckadirt/brain2music/encodec_training_embeds_150.npy' # path to training embeddings 480 * 2 * 1125\n",
|
35 |
+
"test_embeddings_path = '/home/ckadirt/brain2music/encodec_test_embeds_150.npy' # path to test embeddings 600 * 2 * 1125\n",
|
36 |
+
"\n",
|
37 |
+
"class VoxelsDataset(data.Dataset):\n",
|
38 |
+
" def __init__(self, voxels_path, embeddings_path):\n",
|
39 |
+
" # transpose the two dimensions of the voxels data to match the embeddings data\n",
|
40 |
+
" self.voxels = torch.from_numpy(np.load(voxels_path)).float().transpose(0, 1)\n",
|
41 |
+
" self.embeddings = torch.from_numpy(np.load(embeddings_path))\n",
|
42 |
+
" # as each stimulus has been exposed for 15 seconds and the fMRI data is sampled every 1.5 seconds, we take 10 samples per stimulus\n",
|
43 |
+
" self.len = len(self.voxels) // 10\n",
|
44 |
+
" print(\"The len is \", self.len )\n",
|
45 |
+
"\n",
|
46 |
+
" def __getitem__(self, index):\n",
|
47 |
+
" # as each stimulus has been exposed for 15 seconds and the fMRI data is sampled every 1.5 seconds, we take 10 samples per stimulus\n",
|
48 |
+
" voxels = self.voxels[index*10:(index+1)*10]\n",
|
49 |
+
" embeddings = self.embeddings[index]\n",
|
50 |
+
" return voxels, embeddings\n",
|
51 |
+
"\n",
|
52 |
+
" def __len__(self):\n",
|
53 |
+
" return self.len\n",
|
54 |
+
" \n",
|
55 |
+
"class VoxelsEmbeddinsEncodecDataModule(L.LightningDataModule):\n",
|
56 |
+
" def __init__(self, train_voxels_path, train_embeddings_path, test_voxels_path, test_embeddings_path, batch_size=4):\n",
|
57 |
+
" super().__init__()\n",
|
58 |
+
" self.train_voxels_path = train_voxels_path\n",
|
59 |
+
" self.train_embeddings_path = train_embeddings_path\n",
|
60 |
+
" self.test_voxels_path = test_voxels_path\n",
|
61 |
+
" self.test_embeddings_path = test_embeddings_path\n",
|
62 |
+
" self.batch_size = batch_size\n",
|
63 |
+
"\n",
|
64 |
+
" def setup(self, stage=None):\n",
|
65 |
+
" self.train_dataset = VoxelsDataset(self.train_voxels_path, self.train_embeddings_path)\n",
|
66 |
+
" self.test_dataset = VoxelsDataset(self.test_voxels_path, self.test_embeddings_path)\n",
|
67 |
+
"\n",
|
68 |
+
" def train_dataloader(self):\n",
|
69 |
+
" return data.DataLoader(self.train_dataset, batch_size=self.batch_size, shuffle=True)\n",
|
70 |
+
"\n",
|
71 |
+
" def val_dataloader(self):\n",
|
72 |
+
" return data.DataLoader(self.test_dataset, batch_size=self.batch_size, shuffle=False)\n",
|
73 |
+
"\n",
|
74 |
+
"\n"
|
75 |
+
]
|
76 |
+
},
|
77 |
+
{
|
78 |
+
"cell_type": "code",
|
79 |
+
"execution_count": 33,
|
80 |
+
"metadata": {},
|
81 |
+
"outputs": [],
|
82 |
+
"source": [
|
83 |
+
"data_module_example = VoxelsEmbeddinsEncodecDataModule(train_voxels_path, train_embeddings_path, test_voxels_path, test_embeddings_path, batch_size=4)"
|
84 |
+
]
|
85 |
+
},
|
86 |
+
{
|
87 |
+
"cell_type": "code",
|
88 |
+
"execution_count": 34,
|
89 |
+
"metadata": {},
|
90 |
+
"outputs": [],
|
91 |
+
"source": [
|
92 |
+
"data_module_example.setup()\n",
|
93 |
+
"train_dataloader = data_module_example.train_dataloader()\n",
|
94 |
+
"val_dataset = data_module_example.val_dataloader()"
|
95 |
+
]
|
96 |
+
},
|
97 |
+
{
|
98 |
+
"cell_type": "code",
|
99 |
+
"execution_count": 38,
|
100 |
+
"metadata": {},
|
101 |
+
"outputs": [
|
102 |
+
{
|
103 |
+
"data": {
|
104 |
+
"text/plain": [
|
105 |
+
"(tensor([], size=(0, 60784)),\n",
|
106 |
+
" tensor([[ 302., 244., 660., 854., 660., 480., 854., 618., 618., 854.,\n",
|
107 |
+
" 790., 750., 659., 59., 891., 891., 536., 167., 343., 536.,\n",
|
108 |
+
" 715., 758., 758., 758., 480., 498., 854., 4., 4., 308.,\n",
|
109 |
+
" 270., 342., 342., 660., 342., 854., 342., 435., 549., 150.,\n",
|
110 |
+
" 631., 485., 844., 366., 266., 35., 847., 667., 862., 109.,\n",
|
111 |
+
" 573., 379., 226., 573., 603., 513., 178., 302., 715., 631.,\n",
|
112 |
+
" 342., 258., 244., 302., 715., 854., 854., 294., 366., 660.,\n",
|
113 |
+
" 361., 302., 729., 962., 790., 711., 660., 243., 294., 802.,\n",
|
114 |
+
" 329., 513., 962., 342., 711., 244., 243., 549., 802., 854.,\n",
|
115 |
+
" 750., 81., 342., 381., 854., 603., 790., 109., 294., 513.,\n",
|
116 |
+
" 419., 485., 504., 660., 361., 790., 790., 167., 802., 246.,\n",
|
117 |
+
" 485., 246., 81., 1023., 149., 81., 943., 504., 755., 414.,\n",
|
118 |
+
" 246., 972., 715., 1023., 790., 692., 790., 572., 504., 302.,\n",
|
119 |
+
" 308., 853., 631., 657., 790., 361., 660., 715., 686., 213.,\n",
|
120 |
+
" 226., 187., 586., 361., 485., 790., 729., 951., 962., 485.],\n",
|
121 |
+
" [ 963., 645., 645., 326., 138., 1013., 680., 525., 411., 102.,\n",
|
122 |
+
" 462., 466., 698., 409., 289., 923., 878., 415., 386., 604.,\n",
|
123 |
+
" 975., 162., 603., 284., 233., 75., 244., 1016., 1016., 242.,\n",
|
124 |
+
" 67., 194., 122., 492., 856., 997., 997., 221., 243., 814.,\n",
|
125 |
+
" 386., 598., 317., 166., 583., 439., 654., 430., 201., 160.,\n",
|
126 |
+
" 813., 716., 312., 664., 204., 462., 375., 451., 67., 535.,\n",
|
127 |
+
" 854., 209., 548., 812., 657., 827., 408., 411., 422., 352.,\n",
|
128 |
+
" 99., 711., 664., 239., 890., 529., 617., 186., 536., 178.,\n",
|
129 |
+
" 29., 930., 187., 973., 354., 450., 468., 273., 995., 653.,\n",
|
130 |
+
" 935., 335., 973., 812., 348., 664., 575., 184., 299., 782.,\n",
|
131 |
+
" 36., 29., 641., 653., 105., 958., 653., 828., 981., 218.,\n",
|
132 |
+
" 1021., 381., 356., 35., 416., 675., 45., 839., 690., 331.,\n",
|
133 |
+
" 634., 610., 317., 745., 673., 331., 575., 57., 100., 564.,\n",
|
134 |
+
" 590., 492., 902., 53., 73., 332., 1005., 395., 679., 781.,\n",
|
135 |
+
" 174., 74., 121., 667., 265., 479., 583., 655., 163., 81.]]))"
|
136 |
+
]
|
137 |
+
},
|
138 |
+
"execution_count": 38,
|
139 |
+
"metadata": {},
|
140 |
+
"output_type": "execute_result"
|
141 |
+
}
|
142 |
+
],
|
143 |
+
"source": [
|
144 |
+
"val_dataset.dataset[239]"
|
145 |
+
]
|
146 |
+
},
|
147 |
+
{
|
148 |
+
"cell_type": "code",
|
149 |
+
"execution_count": null,
|
150 |
+
"metadata": {},
|
151 |
+
"outputs": [],
|
152 |
+
"source": [
|
153 |
+
"class MLP(L.LightningModule):\n",
|
154 |
+
" def __init__(self, sizes, residual_conections, dropout):\n",
|
155 |
+
" # sizes is a list of the sizes of the layers ej: [4800, 1000, 1000, 1000, 1000, 1000, 1000, 600]\n",
|
156 |
+
" # residual_conections is a list with the same length as sizes, each element is a list of the indexes of the layers that will recieve the output of the layer as input, 0 means that the layer will recieve the x inputs ej. [[0], [1], [2,1], [3], [4,3], [5], [6,5], [7]]\n",
|
157 |
+
" # dropout is a list with the same length as sizes, each element is the dropout probability of the layer ej. [0.5, 0.5, 0.5, 0.5, 0.5, 0.5]\n",
|
158 |
+
" super().__init__()\n",
|
159 |
+
" self.sizes = sizes\n",
|
160 |
+
" self.residual_conections = residual_conections\n",
|
161 |
+
" self.dropout = dropout\n",
|
162 |
+
" self.layers = nn.Sequential()\n",
|
163 |
+
" for i in range(len(sizes)-1):\n",
|
164 |
+
" self.layers.add_module('linear'+str(i), nn.Linear(sizes[i], sizes[i+1]))\n",
|
165 |
+
" self.layers.add_module('relu'+str(i), nn.ReLU())\n",
|
166 |
+
" self.layers.add_module('dropout'+str(i), nn.Dropout(dropout[i]))\n",
|
167 |
+
"\n",
|
168 |
+
" self.loss = nn.CrossEntropyLoss()\n",
|
169 |
+
" self.test_outptus = []\n",
|
170 |
+
" self.train_outptus = []\n",
|
171 |
+
"\n",
|
172 |
+
" def forward(self, x):\n",
|
173 |
+
" return self.layers(x)\n",
|
174 |
+
" \n",
|
175 |
+
" def training_step(self, batch, batch_idx):\n",
|
176 |
+
" voxels, embeddings = batch # the sizes are [batch_size, 10, 65000] and [batch_size, 2, 1125]\n",
|
177 |
+
" # flatten the voxels to [batch_size, rest of the dimensions]\n",
|
178 |
+
" embeddings = embeddings.flatten(start_dim=1).long() # the size is [batch_size, 2250] \n",
|
179 |
+
" #take just the first 200 embeddings\n",
|
180 |
+
" embeddings = embeddings[:, :200]\n",
|
181 |
+
" # take the mean of the second dimension of the voxels to get the mean of the 10 samples per stimulus\n",
|
182 |
+
" voxels = voxels[:, 0:2, :]\n",
|
183 |
+
" voxels = voxels.mean(dim=1)\n",
|
184 |
+
" voxels = voxels.flatten(start_dim=1) # the size is [batch_size, 65000]\n",
|
185 |
+
" outputs = self(voxels)\n",
|
186 |
+
" # the outputs are [batch_size, 200*1024], we need to reshape them to [batch_size, 200, 1024]\n",
|
187 |
+
" outputs = outputs.reshape(-1, 1024, 200)\n",
|
188 |
+
" loss = self.loss(outputs, embeddings)\n",
|
189 |
+
" acuracy = self.tokens_accuracy(outputs, embeddings)\n",
|
190 |
+
" self.log('train_loss', loss, sync_dist=True)\n",
|
191 |
+
" self.log('train_accuracy', acuracy, sync_dist=True)\n",
|
192 |
+
" discrete_outputs = outputs.argmax(dim=1)\n",
|
193 |
+
" self.train_outptus.append(discrete_outputs)\n",
|
194 |
+
" return loss\n",
|
195 |
+
" \n",
|
196 |
+
" def tokens_accuracy(self, outputs, embeddings):\n",
|
197 |
+
" # outputs is [batch_size, 1024, 200]\n",
|
198 |
+
" # embeddings is [batch_size, 200]\n",
|
199 |
+
" # we need to get the index of the maximum value of each token\n",
|
200 |
+
" outputs = outputs.argmax(dim=1)\n",
|
201 |
+
" # now we need to compare the outputs with the embeddings\n",
|
202 |
+
" return (outputs == embeddings).float().mean()\n",
|
203 |
+
" \n",
|
204 |
+
" def on_train_epoch_end(self):\n",
|
205 |
+
" self.train_outptus = torch.cat(self.train_outptus)\n",
|
206 |
+
" # save the outputs with the current epoch name\n",
|
207 |
+
" torch.save(self.train_outptus, 'outputs_train'+str(self.current_epoch)+'.pt')\n",
|
208 |
+
" self.train_outptus = []\n",
|
209 |
+
" \n",
|
210 |
+
" def on_validation_epoch_end(self):\n",
|
211 |
+
" self.test_outptus = torch.cat(self.test_outptus)\n",
|
212 |
+
" # save the outputs with the current epoch name\n",
|
213 |
+
" torch.save(self.test_outptus, 'outputs_validation'+str(self.current_epoch)+'.pt')\n",
|
214 |
+
" self.test_outptus = []\n",
|
215 |
+
"\n",
|
216 |
+
" \n",
|
217 |
+
" def validation_step(self, batch, batch_idx):\n",
|
218 |
+
" voxels, embeddings = batch\n",
|
219 |
+
" embeddings = embeddings.flatten(start_dim=1).long()\n",
|
220 |
+
" embeddings = embeddings[:, :200]\n",
|
221 |
+
" voxels = voxels[:, 0:2, :]\n",
|
222 |
+
" voxels = voxels.mean(dim=1)\n",
|
223 |
+
" voxels = voxels.flatten(start_dim=1)\n",
|
224 |
+
" outputs = self(voxels)\n",
|
225 |
+
" outputs = outputs.reshape(-1, 1024, 200)\n",
|
226 |
+
" loss = self.loss(outputs, embeddings)\n",
|
227 |
+
" accuracy = self.tokens_accuracy(outputs, embeddings)\n",
|
228 |
+
" self.log('val_loss', loss, sync_dist=True)\n",
|
229 |
+
" self.log('val_accuracy', accuracy, sync_dist=True)\n",
|
230 |
+
" discrete_outputs = outputs.argmax(dim=1)\n",
|
231 |
+
" self.test_outptus.append(discrete_outputs)\n",
|
232 |
+
" return loss\n",
|
233 |
+
" \n",
|
234 |
+
" \n",
|
235 |
+
" def configure_optimizers(self):\n",
|
236 |
+
" return torch.optim.Adam(self.parameters(), lr=1e-6)\n",
|
237 |
+
" \n",
|
238 |
+
"\n",
|
239 |
+
"# create the model\n",
|
240 |
+
"sizes = [60784, 500, 500, 150*1024]\n",
|
241 |
+
"residual_conections = [[0], [1], [2], [3]]\n",
|
242 |
+
"dropout = [0.3, 0.3, 0.3, 0.3]\n",
|
243 |
+
"model = MLP(sizes, residual_conections, dropout)\n",
|
244 |
+
"\n",
|
245 |
+
"# create the data module\n",
|
246 |
+
"data_module = VoxelsEmbeddinsEncodecDataModule(train_voxels_path, train_embeddings_path, test_voxels_path, test_embeddings_path, batch_size=4)\n",
|
247 |
+
"\n",
|
248 |
+
"wandb.finish()\n",
|
249 |
+
"\n",
|
250 |
+
"wandb_logger = WandbLogger(project='brain2music', entity='ckadirt')\n",
|
251 |
+
"\n",
|
252 |
+
"# define the trainer\n",
|
253 |
+
"trainer = L.Trainer(devices=2, accelerator=\"gpu\", max_epochs=400, logger=wandb_logger, precision='16-mixed', log_every_n_steps=10)\n",
|
254 |
+
"\n",
|
255 |
+
"# train the model\n",
|
256 |
+
"trainer.fit(model, datamodule=data_module)\n"
|
257 |
+
]
|
258 |
+
},
|
259 |
+
{
|
260 |
+
"cell_type": "code",
|
261 |
+
"execution_count": null,
|
262 |
+
"metadata": {},
|
263 |
+
"outputs": [],
|
264 |
+
"source": [
|
265 |
+
"class MLP(L.LightningModule):\n",
|
266 |
+
" def __init__(self, sizes, residual_conections, dropout):\n",
|
267 |
+
" # sizes is a list of the sizes of the layers ej: [4800, 1000, 1000, 1000, 1000, 1000, 1000, 600]\n",
|
268 |
+
" # residual_conections is a list with the same length as sizes, each element is a list of the indexes of the layers that will recieve the output of the layer as input, 0 means that the layer will recieve the x inputs ej. [[0], [1], [2,1], [3], [4,3], [5], [6,5], [7]]\n",
|
269 |
+
" # dropout is a list with the same length as sizes, each element is the dropout probability of the layer ej. [0.5, 0.5, 0.5, 0.5, 0.5, 0.5]\n",
|
270 |
+
" super().__init__()\n",
|
271 |
+
" self.sizes = sizes\n",
|
272 |
+
" self.residual_conections = residual_conections\n",
|
273 |
+
" self.dropout = dropout\n",
|
274 |
+
" self.layers = nn.Sequential()\n",
|
275 |
+
" for i in range(len(sizes)-1):\n",
|
276 |
+
" self.layers.add_module('linear'+str(i), nn.Linear(sizes[i], sizes[i+1]))\n",
|
277 |
+
" self.layers.add_module('relu'+str(i), nn.ReLU())\n",
|
278 |
+
" self.layers.add_module('dropout'+str(i), nn.Dropout(dropout[i]))\n",
|
279 |
+
"\n",
|
280 |
+
" self.loss = nn.MSELoss()\n",
|
281 |
+
" self.test_outptus = []\n",
|
282 |
+
" self.train_outptus = []\n",
|
283 |
+
"\n",
|
284 |
+
" def forward(self, x):\n",
|
285 |
+
" return self.layers(x)\n",
|
286 |
+
" \n",
|
287 |
+
" def training_step(self, batch, batch_idx):\n",
|
288 |
+
" voxels, embeddings = batch # the sizes are [batch_size, 10, 65000] and [batch_size, 2, 1125]\n",
|
289 |
+
" # flatten the voxels to [batch_size, rest of the dimensions]\n",
|
290 |
+
" embeddings = embeddings.flatten(start_dim=1) # the size is [batch_size, 2250]\n",
|
291 |
+
" # take the mean of the second dimension of the voxels to get the mean of the 10 samples per stimulus\n",
|
292 |
+
" voxels = voxels.mean(dim=1)\n",
|
293 |
+
" voxels = voxels.flatten(start_dim=1) # the size is [batch_size, 65000]\n",
|
294 |
+
" outputs = self(voxels)\n",
|
295 |
+
" loss = self.loss(outputs, embeddings)\n",
|
296 |
+
" self.log('train_loss', loss)\n",
|
297 |
+
" discrete_outputs = outputs.argmax(dim=1)\n",
|
298 |
+
" self.train_outptus.append(discrete_outputs)\n",
|
299 |
+
" return loss\n",
|
300 |
+
" \n",
|
301 |
+
" def on_train_epoch_end(self):\n",
|
302 |
+
" self.train_outptus = torch.cat(self.train_outptus)\n",
|
303 |
+
" # save the outputs with the current epoch name\n",
|
304 |
+
" torch.save(self.train_outptus, 'outputs_train'+str(self.current_epoch)+'.pt')\n",
|
305 |
+
" self.train_outptus = []\n",
|
306 |
+
" \n",
|
307 |
+
" def on_validation_epoch_end(self):\n",
|
308 |
+
" self.test_outptus = torch.cat(self.test_outptus)\n",
|
309 |
+
" # save the outputs with the current epoch name\n",
|
310 |
+
" torch.save(self.test_outptus, 'outputs_validation'+str(self.current_epoch)+'.pt')\n",
|
311 |
+
" self.test_outptus = []\n",
|
312 |
+
"\n",
|
313 |
+
" def validation_step(self, batch, batch_idx):\n",
|
314 |
+
" voxels, embeddings = batch\n",
|
315 |
+
" embeddings = embeddings.flatten(start_dim=1)\n",
|
316 |
+
" voxels = voxels.mean(dim=1)\n",
|
317 |
+
" voxels = voxels.flatten(start_dim=1)\n",
|
318 |
+
" outputs = self(voxels)\n",
|
319 |
+
" loss = self.loss(outputs, embeddings)\n",
|
320 |
+
" self.log('val_loss', loss)\n",
|
321 |
+
" discrete_outputs = outputs.argmax(dim=1)\n",
|
322 |
+
" self.test_outptus.append(discrete_outputs)\n",
|
323 |
+
" return loss\n",
|
324 |
+
" \n",
|
325 |
+
" \n",
|
326 |
+
" def configure_optimizers(self):\n",
|
327 |
+
" return torch.optim.Adam(self.parameters(), lr=1e-5)\n",
|
328 |
+
" \n",
|
329 |
+
"\n",
|
330 |
+
"# create the model\n",
|
331 |
+
"sizes = [60784, 1000, 1000, 150*2*1024]\n",
|
332 |
+
"residual_conections = [[0], [1], [2], [3]]\n",
|
333 |
+
"dropout = [0.5, 0.5, 0.5, 0.5]\n",
|
334 |
+
"model = MLP(sizes, residual_conections, dropout)\n",
|
335 |
+
"\n",
|
336 |
+
"# create the data module\n",
|
337 |
+
"data_module = VoxelsEmbeddinsEncodecDataModule(train_voxels_path, train_embeddings_path, test_voxels_path, test_embeddings_path, batch_size=32)\n",
|
338 |
+
"\n",
|
339 |
+
"\n",
|
340 |
+
"wandb_logger = WandbLogger(project='brain2music', entity='ckadirt')\n",
|
341 |
+
"\n",
|
342 |
+
"# define the trainer\n",
|
343 |
+
"trainer = L.Trainer(devices=2, accelerator=\"gpu\", max_epochs=400, logger=wandb_logger, precision='16-mixed', log_every_n_steps=10)\n",
|
344 |
+
"\n",
|
345 |
+
"# train the model\n",
|
346 |
+
"trainer.fit(model, datamodule=data_module)\n"
|
347 |
+
]
|
348 |
+
},
|
349 |
+
{
|
350 |
+
"cell_type": "code",
|
351 |
+
"execution_count": null,
|
352 |
+
"metadata": {},
|
353 |
+
"outputs": [],
|
354 |
+
"source": [
|
355 |
+
"class MLP(L.LightningModule):\n",
|
356 |
+
" def __init__(self, sizes, residual_conections, dropout):\n",
|
357 |
+
" # sizes is a list of the sizes of the layers ej: [4800, 1000, 1000, 1000, 1000, 1000, 1000, 600]\n",
|
358 |
+
" # residual_conections is a list with the same length as sizes, each element is a list of the indexes of the layers that will recieve the output of the layer as input, 0 means that the layer will recieve the x inputs ej. [[0], [1], [2,1], [3], [4,3], [5], [6,5], [7]]\n",
|
359 |
+
" # dropout is a list with the same length as sizes, each element is the dropout probability of the layer ej. [0.5, 0.5, 0.5, 0.5, 0.5, 0.5]\n",
|
360 |
+
" super().__init__()\n",
|
361 |
+
" self.sizes = sizes\n",
|
362 |
+
" self.residual_conections = residual_conections\n",
|
363 |
+
" self.dropout = dropout\n",
|
364 |
+
" self.layers = nn.Sequential()\n",
|
365 |
+
" for i in range(len(sizes)-1):\n",
|
366 |
+
" self.layers.add_module('linear'+str(i), nn.Linear(sizes[i], sizes[i+1]))\n",
|
367 |
+
" self.layers.add_module('relu'+str(i), nn.ReLU())\n",
|
368 |
+
" self.layers.add_module('dropout'+str(i), nn.Dropout(dropout[i]))\n",
|
369 |
+
"\n",
|
370 |
+
" self.loss = nn.CrossEntropyLoss()\n",
|
371 |
+
"\n",
|
372 |
+
" def forward(self, x):\n",
|
373 |
+
" return self.layers(x)\n",
|
374 |
+
" \n",
|
375 |
+
" def training_step(self, batch, batch_idx):\n",
|
376 |
+
" voxels, embeddings = batch # the sizes are [batch_size, 10, 65000] and [batch_size, 2, 1125]\n",
|
377 |
+
" # flatten the voxels to [batch_size, rest of the dimensions]\n",
|
378 |
+
" embeddings = embeddings.flatten(start_dim=1).long() # the size is [batch_size, 2250] \n",
|
379 |
+
" #take just the first 200 embeddings\n",
|
380 |
+
" embeddings = embeddings[:, :200]\n",
|
381 |
+
" # take the mean of the second dimension of the voxels to get the mean of the 10 samples per stimulus\n",
|
382 |
+
" voxels = voxels.mean(dim=1)\n",
|
383 |
+
" voxels = voxels.flatten(start_dim=1) # the size is [batch_size, 65000]\n",
|
384 |
+
" outputs = self(voxels)\n",
|
385 |
+
" # the outputs are [batch_size, 200*1024], we need to reshape them to [batch_size, 200, 1024]\n",
|
386 |
+
" outputs = outputs.reshape(-1, 1024, 200)\n",
|
387 |
+
" loss = self.loss(outputs, embeddings)\n",
|
388 |
+
" acuracy = self.tokens_accuracy(outputs, embeddings)\n",
|
389 |
+
" self.log('train_loss', loss)\n",
|
390 |
+
" self.log('train_accuracy', acuracy)\n",
|
391 |
+
" return loss\n",
|
392 |
+
" \n",
|
393 |
+
" def tokens_accuracy(self, outputs, embeddings):\n",
|
394 |
+
" # outputs is [batch_size, 1024, 200]\n",
|
395 |
+
" # embeddings is [batch_size, 200]\n",
|
396 |
+
" # we need to get the index of the maximum value of each token\n",
|
397 |
+
" outputs = outputs.argmax(dim=1)\n",
|
398 |
+
" # now we need to compare the outputs with the embeddings\n",
|
399 |
+
" return (outputs == embeddings).float().mean()\n",
|
400 |
+
"\n",
|
401 |
+
" \n",
|
402 |
+
" def validation_step(self, batch, batch_idx):\n",
|
403 |
+
" voxels, embeddings = batch\n",
|
404 |
+
" embeddings = embeddings.flatten(start_dim=1).long()\n",
|
405 |
+
" embeddings = embeddings[:, :200]\n",
|
406 |
+
" voxels = voxels.mean(dim=1)\n",
|
407 |
+
" voxels = voxels.flatten(start_dim=1)\n",
|
408 |
+
" outputs = self(voxels)\n",
|
409 |
+
" outputs = outputs.reshape(-1, 1024, 200)\n",
|
410 |
+
" loss = self.loss(outputs, embeddings)\n",
|
411 |
+
" accuracy = self.tokens_accuracy(outputs, embeddings)\n",
|
412 |
+
" self.log('val_loss', loss)\n",
|
413 |
+
" self.log('val_accuracy', accuracy)\n",
|
414 |
+
" return loss\n",
|
415 |
+
" \n",
|
416 |
+
" \n",
|
417 |
+
" def configure_optimizers(self):\n",
|
418 |
+
" return torch.optim.Adam(self.parameters(), lr=1e-5)\n",
|
419 |
+
" \n",
|
420 |
+
"\n",
|
421 |
+
"# create the model\n",
|
422 |
+
"sizes = [60784, 1000, 1000, 200*1024]\n",
|
423 |
+
"residual_conections = [[0], [1], [2], [3]]\n",
|
424 |
+
"dropout = [0.5, 0.5, 0.5, 0.5]\n",
|
425 |
+
"model = MLP(sizes, residual_conections, dropout)\n",
|
426 |
+
"\n",
|
427 |
+
"# create the data module\n",
|
428 |
+
"data_module = VoxelsEmbeddinsEncodecDataModule(train_voxels_path, train_embeddings_path, test_voxels_path, test_embeddings_path, batch_size=2)\n",
|
429 |
+
"\n",
|
430 |
+
"wandb.finish()\n",
|
431 |
+
"\n",
|
432 |
+
"wandb_logger = WandbLogger(project='brain2music', entity='ckadirt')\n",
|
433 |
+
"\n",
|
434 |
+
"# define the trainer\n",
|
435 |
+
"trainer = L.Trainer(devices=2, accelerator=\"gpu\", max_epochs=400, logger=wandb_logger, precision='16-mixed', log_every_n_steps=10)\n",
|
436 |
+
"\n",
|
437 |
+
"# train the model\n",
|
438 |
+
"trainer.fit(model, datamodule=data_module)\n"
|
439 |
+
]
|
440 |
+
},
|
441 |
+
{
|
442 |
+
"cell_type": "code",
|
443 |
+
"execution_count": null,
|
444 |
+
"metadata": {},
|
445 |
+
"outputs": [],
|
446 |
+
"source": [
|
447 |
+
"class MLP(L.LightningModule):\n",
|
448 |
+
" def __init__(self, sizes, residual_conections, dropout):\n",
|
449 |
+
" # sizes is a list of the sizes of the layers ej: [4800, 1000, 1000, 1000, 1000, 1000, 1000, 600]\n",
|
450 |
+
" # residual_conections is a list with the same length as sizes, each element is a list of the indexes of the layers that will recieve the output of the layer as input, 0 means that the layer will recieve the x inputs ej. [[0], [1], [2,1], [3], [4,3], [5], [6,5], [7]]\n",
|
451 |
+
" # dropout is a list with the same length as sizes, each element is the dropout probability of the layer ej. [0.5, 0.5, 0.5, 0.5, 0.5, 0.5]\n",
|
452 |
+
" super().__init__()\n",
|
453 |
+
" self.sizes = sizes\n",
|
454 |
+
" self.residual_conections = residual_conections\n",
|
455 |
+
" self.dropout = dropout\n",
|
456 |
+
" self.layers = nn.Sequential()\n",
|
457 |
+
" for i in range(len(sizes)-1):\n",
|
458 |
+
" self.layers.add_module('linear'+str(i), nn.Linear(sizes[i], sizes[i+1]))\n",
|
459 |
+
" self.layers.add_module('relu'+str(i), nn.ReLU())\n",
|
460 |
+
" self.layers.add_module('dropout'+str(i), nn.Dropout(dropout[i]))\n",
|
461 |
+
"\n",
|
462 |
+
" self.loss = nn.CrossEntropyLoss()\n",
|
463 |
+
"\n",
|
464 |
+
" def forward(self, x):\n",
|
465 |
+
" return self.layers(x)\n",
|
466 |
+
" \n",
|
467 |
+
" def training_step(self, batch, batch_idx):\n",
|
468 |
+
" voxels, embeddings = batch # the sizes are [batch_size, 10, 65000] and [batch_size, 2, 1125]\n",
|
469 |
+
" # flatten the voxels to [batch_size, rest of the dimensions]\n",
|
470 |
+
" embeddings = embeddings.flatten(start_dim=1).long() # the size is [batch_size, 2250] \n",
|
471 |
+
" #take just the first 200 embeddings\n",
|
472 |
+
" embeddings = embeddings[:, :200]\n",
|
473 |
+
" # take the mean of the second dimension of the voxels to get the mean of the 10 samples per stimulus\n",
|
474 |
+
" voxels = voxels[:, 1, :]\n",
|
475 |
+
" voxels = voxels.flatten(start_dim=1) # the size is [batch_size, 65000]\n",
|
476 |
+
" outputs = self(voxels)\n",
|
477 |
+
" # the outputs are [batch_size, 200*1024], we need to reshape them to [batch_size, 200, 1024]\n",
|
478 |
+
" outputs = outputs.reshape(-1, 1024, 200)\n",
|
479 |
+
" loss = self.loss(outputs, embeddings)\n",
|
480 |
+
" acuracy = self.tokens_accuracy(outputs, embeddings)\n",
|
481 |
+
" self.log('train_loss', loss)\n",
|
482 |
+
" self.log('train_accuracy', acuracy)\n",
|
483 |
+
" return loss\n",
|
484 |
+
" \n",
|
485 |
+
" def tokens_accuracy(self, outputs, embeddings):\n",
|
486 |
+
" # outputs is [batch_size, 1024, 200]\n",
|
487 |
+
" # embeddings is [batch_size, 200]\n",
|
488 |
+
" # we need to get the index of the maximum value of each token\n",
|
489 |
+
" outputs = outputs.argmax(dim=1)\n",
|
490 |
+
" # now we need to compare the outputs with the embeddings\n",
|
491 |
+
" return (outputs == embeddings).float().mean()\n",
|
492 |
+
"\n",
|
493 |
+
" \n",
|
494 |
+
" def validation_step(self, batch, batch_idx):\n",
|
495 |
+
" voxels, embeddings = batch\n",
|
496 |
+
" embeddings = embeddings.flatten(start_dim=1).long()\n",
|
497 |
+
" embeddings = embeddings[:, :200]\n",
|
498 |
+
" voxels = voxels[:, 1, :]\n",
|
499 |
+
" voxels = voxels.flatten(start_dim=1)\n",
|
500 |
+
" outputs = self(voxels)\n",
|
501 |
+
" outputs = outputs.reshape(-1, 1024, 200)\n",
|
502 |
+
" loss = self.loss(outputs, embeddings)\n",
|
503 |
+
" accuracy = self.tokens_accuracy(outputs, embeddings)\n",
|
504 |
+
" self.log('val_loss', loss)\n",
|
505 |
+
" self.log('val_accuracy', accuracy)\n",
|
506 |
+
" return loss\n",
|
507 |
+
" \n",
|
508 |
+
" \n",
|
509 |
+
" def configure_optimizers(self):\n",
|
510 |
+
" return torch.optim.Adam(self.parameters(), lr=1e-6)\n",
|
511 |
+
" \n",
|
512 |
+
"\n",
|
513 |
+
"# create the model\n",
|
514 |
+
"sizes = [60784, 1000, 1000, 200*1024]\n",
|
515 |
+
"residual_conections = [[0], [1], [2], [3]]\n",
|
516 |
+
"dropout = [0.2, 0.2, 0.2, 0.2]\n",
|
517 |
+
"model = MLP(sizes, residual_conections, dropout)\n",
|
518 |
+
"\n",
|
519 |
+
"# create the data module\n",
|
520 |
+
"data_module = VoxelsEmbeddinsEncodecDataModule(train_voxels_path, train_embeddings_path, test_voxels_path, test_embeddings_path, batch_size=4)\n",
|
521 |
+
"\n",
|
522 |
+
"wandb.finish()\n",
|
523 |
+
"\n",
|
524 |
+
"wandb_logger = WandbLogger(project='brain2music', entity='ckadirt')\n",
|
525 |
+
"\n",
|
526 |
+
"# define the trainer\n",
|
527 |
+
"trainer = L.Trainer(devices=2, accelerator=\"gpu\", max_epochs=400, logger=wandb_logger, precision='16-mixed', log_every_n_steps=10)\n",
|
528 |
+
"\n",
|
529 |
+
"# train the model\n",
|
530 |
+
"trainer.fit(model, datamodule=data_module)\n"
|
531 |
+
]
|
532 |
+
},
|
533 |
+
{
|
534 |
+
"cell_type": "code",
|
535 |
+
"execution_count": null,
|
536 |
+
"metadata": {},
|
537 |
+
"outputs": [],
|
538 |
+
"source": [
|
539 |
+
"model3.eval()\n",
|
540 |
+
"outputs = torch.Tensor((480,200))\n",
|
541 |
+
"with torch.no_grad():\n",
|
542 |
+
" test_dataset = VoxelsDataset(test_voxels_path, test_embeddings_path)\n",
|
543 |
+
" dataloader = data.DataLoader(test_dataset, batch_size = 2)\n",
|
544 |
+
" for i, (voxels, embeddings) in enumerate(dataloader):\n",
|
545 |
+
" voxels = voxels[:, 1, :]\n",
|
546 |
+
" voxels = voxels.flatten(start_dim=1) # the size is [batch_size, 65000]\n",
|
547 |
+
" bout = model3(voxels)\n",
|
548 |
+
" bout = bout.reshape(-1, 1024, 200)\n",
|
549 |
+
" # the 1024 dimension is the number of tokens, we need to get the index of the maximum value of each token\n",
|
550 |
+
" bout = bout.argmax(dim=1)\n",
|
551 |
+
" # now we need to add the outputs to the outputs tensor\n",
|
552 |
+
" outputs[i*2:(i+1)*2] = bout\n",
|
553 |
+
" \n",
|
554 |
+
" \n",
|
555 |
+
"# save the predicted outputs on the current directory\n",
|
556 |
+
"torch.save(outputs, 'outputs.pt')"
|
557 |
+
]
|
558 |
+
}
|
559 |
+
],
|
560 |
+
"metadata": {
|
561 |
+
"kernelspec": {
|
562 |
+
"display_name": "Python 3 (ipykernel)",
|
563 |
+
"language": "python",
|
564 |
+
"name": "python3"
|
565 |
+
},
|
566 |
+
"language_info": {
|
567 |
+
"codemirror_mode": {
|
568 |
+
"name": "ipython",
|
569 |
+
"version": 3
|
570 |
+
},
|
571 |
+
"file_extension": ".py",
|
572 |
+
"mimetype": "text/x-python",
|
573 |
+
"name": "python",
|
574 |
+
"nbconvert_exporter": "python",
|
575 |
+
"pygments_lexer": "ipython3",
|
576 |
+
"version": "3.10.8"
|
577 |
+
}
|
578 |
+
},
|
579 |
+
"nbformat": 4,
|
580 |
+
"nbformat_minor": 4
|
581 |
+
}
|
src/MLP-model.ipynb
ADDED
@@ -0,0 +1,448 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"cells": [
|
3 |
+
{
|
4 |
+
"cell_type": "code",
|
5 |
+
"execution_count": 2,
|
6 |
+
"metadata": {},
|
7 |
+
"outputs": [],
|
8 |
+
"source": [
|
9 |
+
"import os, torch, torch.nn as nn, torch.utils.data as data, torchvision as tv\n",
|
10 |
+
"import lightning as L\n",
|
11 |
+
"import numpy as np, pandas as pd, matplotlib.pyplot as plt\n",
|
12 |
+
"from pytorch_lightning.loggers import WandbLogger"
|
13 |
+
]
|
14 |
+
},
|
15 |
+
{
|
16 |
+
"cell_type": "code",
|
17 |
+
"execution_count": null,
|
18 |
+
"metadata": {},
|
19 |
+
"outputs": [],
|
20 |
+
"source": [
|
21 |
+
"# create the datasets and dataloaders\n",
|
22 |
+
"train_voxels_path = '/home/ckadirt/brain2music/dataset/preproc/sub-001_Resp_Training.npy' # path to training voxels 65000 * 4800 \n",
|
23 |
+
"test_voxels_path = '/home/ckadirt/brain2music/dataset/preproc/sub-001_Resp_Test_Mean.npy' # path to test voxels 65000 * 600\n",
|
24 |
+
"\n",
|
25 |
+
"train_embeddings_path = '/home/ckadirt/brain2music/dataset/Gtanz/audios/sub-001/encodec_embeddings_train.pt' # path to training embeddings 480 * 2 * 1125\n",
|
26 |
+
"test_embeddings_path = '/home/ckadirt/brain2music/dataset/Gtanz/audios/sub-001/encodec_embeddings_test.pt' # path to test embeddings 600 * 2 * 1125\n",
|
27 |
+
"\n",
|
28 |
+
"class VoxelsDataset(data.Dataset):\n",
|
29 |
+
" def __init__(self, voxels_path, embeddings_path):\n",
|
30 |
+
" # transpose the two dimensions of the voxels data to match the embeddings data\n",
|
31 |
+
" self.voxels = torch.from_numpy(np.load(voxels_path)).float().transpose(0, 1)\n",
|
32 |
+
" self.embeddings = torch.load(embeddings_path)\n",
|
33 |
+
" # as each stimulus has been exposed for 15 seconds and the fMRI data is sampled every 1.5 seconds, we take 10 samples per stimulus\n",
|
34 |
+
" self.len = len(self.voxels) // 10\n",
|
35 |
+
"\n",
|
36 |
+
" def __getitem__(self, index):\n",
|
37 |
+
" # as each stimulus has been exposed for 15 seconds and the fMRI data is sampled every 1.5 seconds, we take 10 samples per stimulus\n",
|
38 |
+
" voxels = self.voxels[index*10:(index+1)*10]\n",
|
39 |
+
" embeddings = self.embeddings[index]\n",
|
40 |
+
" return voxels, embeddings\n",
|
41 |
+
"\n",
|
42 |
+
" def __len__(self):\n",
|
43 |
+
" return self.len\n",
|
44 |
+
" \n",
|
45 |
+
"class VoxelsEmbeddinsEncodecDataModule(L.LightningDataModule):\n",
|
46 |
+
" def __init__(self, train_voxels_path, train_embeddings_path, test_voxels_path, test_embeddings_path, batch_size=32):\n",
|
47 |
+
" super().__init__()\n",
|
48 |
+
" self.train_voxels_path = train_voxels_path\n",
|
49 |
+
" self.train_embeddings_path = train_embeddings_path\n",
|
50 |
+
" self.test_voxels_path = test_voxels_path\n",
|
51 |
+
" self.test_embeddings_path = test_embeddings_path\n",
|
52 |
+
" self.batch_size = batch_size\n",
|
53 |
+
"\n",
|
54 |
+
" def setup(self, stage=None):\n",
|
55 |
+
" self.train_dataset = VoxelsDataset(self.train_voxels_path, self.train_embeddings_path)\n",
|
56 |
+
" self.test_dataset = VoxelsDataset(self.test_voxels_path, self.test_embeddings_path)\n",
|
57 |
+
"\n",
|
58 |
+
" def train_dataloader(self):\n",
|
59 |
+
" return data.DataLoader(self.train_dataset, batch_size=self.batch_size, shuffle=True)\n",
|
60 |
+
"\n",
|
61 |
+
" def test_dataloader(self):\n",
|
62 |
+
" return data.DataLoader(self.test_dataset, batch_size=self.batch_size, shuffle=False)\n"
|
63 |
+
]
|
64 |
+
},
|
65 |
+
{
|
66 |
+
"cell_type": "code",
|
67 |
+
"execution_count": null,
|
68 |
+
"metadata": {},
|
69 |
+
"outputs": [],
|
70 |
+
"source": [
|
71 |
+
"class MLP(L.LightningModule):\n",
|
72 |
+
" def __init__(self, sizes, residual_conections, dropout):\n",
|
73 |
+
" # sizes is a list of the sizes of the layers ej: [4800, 1000, 1000, 1000, 1000, 1000, 1000, 600]\n",
|
74 |
+
" # residual_conections is a list with the same length as sizes, each element is a list of the indexes of the layers that will recieve the output of the layer as input, 0 means that the layer will recieve the x inputs ej. [[0], [1], [2,1], [3], [4,3], [5], [6,5], [7]]\n",
|
75 |
+
" # dropout is a list with the same length as sizes, each element is the dropout probability of the layer ej. [0.5, 0.5, 0.5, 0.5, 0.5, 0.5]\n",
|
76 |
+
" super().__init__()\n",
|
77 |
+
" self.sizes = sizes\n",
|
78 |
+
" self.residual_conections = residual_conections\n",
|
79 |
+
" self.dropout = dropout\n",
|
80 |
+
" self.layers = nn.ModuleList()\n",
|
81 |
+
" for i in range(len(sizes)-1):\n",
|
82 |
+
" self.layers.append(nn.Linear(sizes[i], sizes[i+1]))\n",
|
83 |
+
" self.relu = nn.ReLU()\n",
|
84 |
+
" self.loss = nn.MSELoss()\n",
|
85 |
+
"\n",
|
86 |
+
" def forward(self, x):\n",
|
87 |
+
" x_states = [x]\n",
|
88 |
+
" for i in range(len(self.layers)):\n",
|
89 |
+
" x = self.layers[i](x)\n",
|
90 |
+
" for j in self.residual_conections[i]:\n",
|
91 |
+
" x = x + x_states[j]\n",
|
92 |
+
" x = self.relu(x)\n",
|
93 |
+
" x = nn.Dropout(self.dropout[i])(x)\n",
|
94 |
+
" x_states.append(x)\n",
|
95 |
+
"\n",
|
96 |
+
" return x\n",
|
97 |
+
" \n",
|
98 |
+
" def training_step(self, batch, batch_idx):\n",
|
99 |
+
" voxels, embeddings = batch # the sizes are [batch_size, 10, 65000] and [batch_size, 2, 1125]\n",
|
100 |
+
" # flatten the voxels to [batch_size, rest of the dimensions]\n",
|
101 |
+
" embeddings = embeddings.flatten(start_dim=1) # the size is [batch_size, 2250]\n",
|
102 |
+
" # take the mean of the second dimension of the voxels to get the mean of the 10 samples per stimulus\n",
|
103 |
+
" voxels = voxels.mean(dim=1)\n",
|
104 |
+
" voxels = voxels.flatten(start_dim=1) # the size is [batch_size, 65000]\n",
|
105 |
+
" outputs = self(voxels)\n",
|
106 |
+
" loss = self.loss(outputs, embeddings)\n",
|
107 |
+
" self.log('train_loss', loss)\n",
|
108 |
+
" return loss\n",
|
109 |
+
" \n",
|
110 |
+
" def validation_step(self, batch, batch_idx):\n",
|
111 |
+
" voxels, embeddings = batch\n",
|
112 |
+
" embeddings = embeddings.flatten(start_dim=1)\n",
|
113 |
+
" voxels = voxels.mean(dim=1)\n",
|
114 |
+
" voxels = voxels.flatten(start_dim=1)\n",
|
115 |
+
" outputs = self(voxels)\n",
|
116 |
+
" loss = self.loss(outputs, embeddings)\n",
|
117 |
+
" self.log('val_loss', loss)\n",
|
118 |
+
" return loss\n",
|
119 |
+
" \n",
|
120 |
+
" \n",
|
121 |
+
" def configure_optimizers(self):\n",
|
122 |
+
" return torch.optim.Adam(self.parameters(), lr=1e-3)\n",
|
123 |
+
" \n",
|
124 |
+
"\n",
|
125 |
+
"# create the model\n",
|
126 |
+
"sizes = [60784, 1000, 1000, 2250]\n",
|
127 |
+
"residual_conections = [[0], [1], [2,1], [3]]\n",
|
128 |
+
"dropout = [0.5, 0.5, 0.5, 0.5]\n",
|
129 |
+
"model = MLP(sizes, residual_conections, dropout)\n",
|
130 |
+
"\n",
|
131 |
+
"# create the data module\n",
|
132 |
+
"data_module = VoxelsEmbeddinsEncodecDataModule(train_voxels_path, train_embeddings_path, test_voxels_path, test_embeddings_path, batch_size=32)\n",
|
133 |
+
"\n",
|
134 |
+
"\n",
|
135 |
+
"wandb_logger = WandbLogger(project='brain2music', entity='ckadirt')\n",
|
136 |
+
"\n",
|
137 |
+
"# define the trainer\n",
|
138 |
+
"trainer = L.Trainer(devices=2, accelerator=\"gpu\", max_epochs=100, logger=wandb_logger, precision='16-mixed')\n",
|
139 |
+
"\n",
|
140 |
+
"# train the model\n",
|
141 |
+
"trainer.fit(model, data_module)\n"
|
142 |
+
]
|
143 |
+
},
|
144 |
+
{
|
145 |
+
"cell_type": "code",
|
146 |
+
"execution_count": null,
|
147 |
+
"metadata": {},
|
148 |
+
"outputs": [],
|
149 |
+
"source": [
|
150 |
+
"class MLP(L.LightningModule):\n",
|
151 |
+
" def __init__(self, sizes, residual_conections, dropout):\n",
|
152 |
+
" # sizes is a list of the sizes of the layers ej: [4800, 1000, 1000, 1000, 1000, 1000, 1000, 600]\n",
|
153 |
+
" # residual_conections is a list with the same length as sizes, each element is a list of the indexes of the layers that will recieve the output of the layer as input, 0 means that the layer will recieve the x inputs ej. [[0], [1], [2,1], [3], [4,3], [5], [6,5], [7]]\n",
|
154 |
+
" # dropout is a list with the same length as sizes, each element is the dropout probability of the layer ej. [0.5, 0.5, 0.5, 0.5, 0.5, 0.5]\n",
|
155 |
+
" super().__init__()\n",
|
156 |
+
" self.sizes = sizes\n",
|
157 |
+
" self.residual_conections = residual_conections\n",
|
158 |
+
" self.dropout = dropout\n",
|
159 |
+
" self.layers = nn.Sequential()\n",
|
160 |
+
" for i in range(len(sizes)-1):\n",
|
161 |
+
" self.layers.add_module('linear'+str(i), nn.Linear(sizes[i], sizes[i+1]))\n",
|
162 |
+
" self.layers.add_module('relu'+str(i), nn.ReLU())\n",
|
163 |
+
" self.layers.add_module('dropout'+str(i), nn.Dropout(dropout[i]))\n",
|
164 |
+
"\n",
|
165 |
+
" self.loss = nn.MSELoss()\n",
|
166 |
+
"\n",
|
167 |
+
" def forward(self, x):\n",
|
168 |
+
" return self.layers(x)\n",
|
169 |
+
" \n",
|
170 |
+
" def training_step(self, batch, batch_idx):\n",
|
171 |
+
" voxels, embeddings = batch # the sizes are [batch_size, 10, 65000] and [batch_size, 2, 1125]\n",
|
172 |
+
" # flatten the voxels to [batch_size, rest of the dimensions]\n",
|
173 |
+
" embeddings = embeddings.flatten(start_dim=1) # the size is [batch_size, 2250]\n",
|
174 |
+
" # take the mean of the second dimension of the voxels to get the mean of the 10 samples per stimulus\n",
|
175 |
+
" voxels = voxels.mean(dim=1)\n",
|
176 |
+
" voxels = voxels.flatten(start_dim=1) # the size is [batch_size, 65000]\n",
|
177 |
+
" outputs = self(voxels)\n",
|
178 |
+
" loss = self.loss(outputs, embeddings)\n",
|
179 |
+
" self.log('train_loss', loss)\n",
|
180 |
+
" return loss\n",
|
181 |
+
" \n",
|
182 |
+
" def validation_step(self, batch, batch_idx):\n",
|
183 |
+
" voxels, embeddings = batch\n",
|
184 |
+
" embeddings = embeddings.flatten(start_dim=1)\n",
|
185 |
+
" voxels = voxels.mean(dim=1)\n",
|
186 |
+
" voxels = voxels.flatten(start_dim=1)\n",
|
187 |
+
" outputs = self(voxels)\n",
|
188 |
+
" loss = self.loss(outputs, embeddings)\n",
|
189 |
+
" self.log('val_loss', loss)\n",
|
190 |
+
" return loss\n",
|
191 |
+
" \n",
|
192 |
+
" \n",
|
193 |
+
" def configure_optimizers(self):\n",
|
194 |
+
" return torch.optim.Adam(self.parameters(), lr=1e-5)\n",
|
195 |
+
" \n",
|
196 |
+
"\n",
|
197 |
+
"# create the model\n",
|
198 |
+
"sizes = [60784, 1000, 1000, 2250]\n",
|
199 |
+
"residual_conections = [[0], [1], [2], [3]]\n",
|
200 |
+
"dropout = [0.5, 0.5, 0.5, 0.5]\n",
|
201 |
+
"model = MLP(sizes, residual_conections, dropout)\n",
|
202 |
+
"\n",
|
203 |
+
"# create the data module\n",
|
204 |
+
"data_module = VoxelsEmbeddinsEncodecDataModule(train_voxels_path, train_embeddings_path, test_voxels_path, test_embeddings_path, batch_size=32)\n",
|
205 |
+
"\n",
|
206 |
+
"\n",
|
207 |
+
"wandb_logger = WandbLogger(project='brain2music', entity='ckadirt')\n",
|
208 |
+
"\n",
|
209 |
+
"# define the trainer\n",
|
210 |
+
"trainer = L.Trainer(devices=2, accelerator=\"gpu\", max_epochs=400, logger=wandb_logger, precision='16-mixed', log_every_n_steps=10)\n",
|
211 |
+
"\n",
|
212 |
+
"# train the model\n",
|
213 |
+
"trainer.fit(model, datamodule=data_module)\n"
|
214 |
+
]
|
215 |
+
},
|
216 |
+
{
|
217 |
+
"cell_type": "code",
|
218 |
+
"execution_count": null,
|
219 |
+
"metadata": {},
|
220 |
+
"outputs": [],
|
221 |
+
"source": [
|
222 |
+
"class MLP(L.LightningModule):\n",
|
223 |
+
" def __init__(self, sizes, residual_conections, dropout):\n",
|
224 |
+
" # sizes is a list of the sizes of the layers ej: [4800, 1000, 1000, 1000, 1000, 1000, 1000, 600]\n",
|
225 |
+
" # residual_conections is a list with the same length as sizes, each element is a list of the indexes of the layers that will recieve the output of the layer as input, 0 means that the layer will recieve the x inputs ej. [[0], [1], [2,1], [3], [4,3], [5], [6,5], [7]]\n",
|
226 |
+
" # dropout is a list with the same length as sizes, each element is the dropout probability of the layer ej. [0.5, 0.5, 0.5, 0.5, 0.5, 0.5]\n",
|
227 |
+
" super().__init__()\n",
|
228 |
+
" self.sizes = sizes\n",
|
229 |
+
" self.residual_conections = residual_conections\n",
|
230 |
+
" self.dropout = dropout\n",
|
231 |
+
" self.layers = nn.Sequential()\n",
|
232 |
+
" for i in range(len(sizes)-1):\n",
|
233 |
+
" self.layers.add_module('linear'+str(i), nn.Linear(sizes[i], sizes[i+1]))\n",
|
234 |
+
" self.layers.add_module('relu'+str(i), nn.ReLU())\n",
|
235 |
+
" self.layers.add_module('dropout'+str(i), nn.Dropout(dropout[i]))\n",
|
236 |
+
"\n",
|
237 |
+
" self.loss = nn.CrossEntropyLoss()\n",
|
238 |
+
"\n",
|
239 |
+
" def forward(self, x):\n",
|
240 |
+
" return self.layers(x)\n",
|
241 |
+
" \n",
|
242 |
+
" def training_step(self, batch, batch_idx):\n",
|
243 |
+
" voxels, embeddings = batch # the sizes are [batch_size, 10, 65000] and [batch_size, 2, 1125]\n",
|
244 |
+
" # flatten the voxels to [batch_size, rest of the dimensions]\n",
|
245 |
+
" embeddings = embeddings.flatten(start_dim=1).long() # the size is [batch_size, 2250] \n",
|
246 |
+
" #take just the first 200 embeddings\n",
|
247 |
+
" embeddings = embeddings[:, :200]\n",
|
248 |
+
" # take the mean of the second dimension of the voxels to get the mean of the 10 samples per stimulus\n",
|
249 |
+
" voxels = voxels.mean(dim=1)\n",
|
250 |
+
" voxels = voxels.flatten(start_dim=1) # the size is [batch_size, 65000]\n",
|
251 |
+
" outputs = self(voxels)\n",
|
252 |
+
" # the outputs are [batch_size, 200*1024], we need to reshape them to [batch_size, 200, 1024]\n",
|
253 |
+
" outputs = outputs.reshape(-1, 1024, 200)\n",
|
254 |
+
" loss = self.loss(outputs, embeddings)\n",
|
255 |
+
" acuracy = self.tokens_accuracy(outputs, embeddings)\n",
|
256 |
+
" self.log('train_loss', loss)\n",
|
257 |
+
" self.log('train_accuracy', acuracy)\n",
|
258 |
+
" return loss\n",
|
259 |
+
" \n",
|
260 |
+
" def tokens_accuracy(self, outputs, embeddings):\n",
|
261 |
+
" # outputs is [batch_size, 1024, 200]\n",
|
262 |
+
" # embeddings is [batch_size, 200]\n",
|
263 |
+
" # we need to get the index of the maximum value of each token\n",
|
264 |
+
" outputs = outputs.argmax(dim=1)\n",
|
265 |
+
" # now we need to compare the outputs with the embeddings\n",
|
266 |
+
" return (outputs == embeddings).float().mean()\n",
|
267 |
+
"\n",
|
268 |
+
" \n",
|
269 |
+
" def validation_step(self, batch, batch_idx):\n",
|
270 |
+
" voxels, embeddings = batch\n",
|
271 |
+
" embeddings = embeddings.flatten(start_dim=1).long()\n",
|
272 |
+
" embeddings = embeddings[:, :200]\n",
|
273 |
+
" voxels = voxels.mean(dim=1)\n",
|
274 |
+
" voxels = voxels.flatten(start_dim=1)\n",
|
275 |
+
" outputs = self(voxels)\n",
|
276 |
+
" outputs = outputs.reshape(-1, 1024, 200)\n",
|
277 |
+
" loss = self.loss(outputs, embeddings)\n",
|
278 |
+
" accuracy = self.tokens_accuracy(outputs, embeddings)\n",
|
279 |
+
" self.log('val_loss', loss)\n",
|
280 |
+
" self.log('val_accuracy', accuracy)\n",
|
281 |
+
" return loss\n",
|
282 |
+
" \n",
|
283 |
+
" \n",
|
284 |
+
" def configure_optimizers(self):\n",
|
285 |
+
" return torch.optim.Adam(self.parameters(), lr=1e-5)\n",
|
286 |
+
" \n",
|
287 |
+
"\n",
|
288 |
+
"# create the model\n",
|
289 |
+
"sizes = [60784, 1000, 1000, 200*1024]\n",
|
290 |
+
"residual_conections = [[0], [1], [2], [3]]\n",
|
291 |
+
"dropout = [0.5, 0.5, 0.5, 0.5]\n",
|
292 |
+
"model = MLP(sizes, residual_conections, dropout)\n",
|
293 |
+
"\n",
|
294 |
+
"# create the data module\n",
|
295 |
+
"data_module = VoxelsEmbeddinsEncodecDataModule(train_voxels_path, train_embeddings_path, test_voxels_path, test_embeddings_path, batch_size=2)\n",
|
296 |
+
"\n",
|
297 |
+
"wandb.finish()\n",
|
298 |
+
"\n",
|
299 |
+
"wandb_logger = WandbLogger(project='brain2music', entity='ckadirt')\n",
|
300 |
+
"\n",
|
301 |
+
"# define the trainer\n",
|
302 |
+
"trainer = L.Trainer(devices=2, accelerator=\"gpu\", max_epochs=400, logger=wandb_logger, precision='16-mixed', log_every_n_steps=10)\n",
|
303 |
+
"\n",
|
304 |
+
"# train the model\n",
|
305 |
+
"trainer.fit(model, datamodule=data_module)\n"
|
306 |
+
]
|
307 |
+
},
|
308 |
+
{
|
309 |
+
"cell_type": "code",
|
310 |
+
"execution_count": null,
|
311 |
+
"metadata": {},
|
312 |
+
"outputs": [],
|
313 |
+
"source": [
|
314 |
+
"class MLP(L.LightningModule):\n",
|
315 |
+
" def __init__(self, sizes, residual_conections, dropout):\n",
|
316 |
+
" # sizes is a list of the sizes of the layers ej: [4800, 1000, 1000, 1000, 1000, 1000, 1000, 600]\n",
|
317 |
+
" # residual_conections is a list with the same length as sizes, each element is a list of the indexes of the layers that will recieve the output of the layer as input, 0 means that the layer will recieve the x inputs ej. [[0], [1], [2,1], [3], [4,3], [5], [6,5], [7]]\n",
|
318 |
+
" # dropout is a list with the same length as sizes, each element is the dropout probability of the layer ej. [0.5, 0.5, 0.5, 0.5, 0.5, 0.5]\n",
|
319 |
+
" super().__init__()\n",
|
320 |
+
" self.sizes = sizes\n",
|
321 |
+
" self.residual_conections = residual_conections\n",
|
322 |
+
" self.dropout = dropout\n",
|
323 |
+
" self.layers = nn.Sequential()\n",
|
324 |
+
" for i in range(len(sizes)-1):\n",
|
325 |
+
" self.layers.add_module('linear'+str(i), nn.Linear(sizes[i], sizes[i+1]))\n",
|
326 |
+
" self.layers.add_module('relu'+str(i), nn.ReLU())\n",
|
327 |
+
" self.layers.add_module('dropout'+str(i), nn.Dropout(dropout[i]))\n",
|
328 |
+
"\n",
|
329 |
+
" self.loss = nn.CrossEntropyLoss()\n",
|
330 |
+
"\n",
|
331 |
+
" def forward(self, x):\n",
|
332 |
+
" return self.layers(x)\n",
|
333 |
+
" \n",
|
334 |
+
" def training_step(self, batch, batch_idx):\n",
|
335 |
+
" voxels, embeddings = batch # the sizes are [batch_size, 10, 65000] and [batch_size, 2, 1125]\n",
|
336 |
+
" # flatten the voxels to [batch_size, rest of the dimensions]\n",
|
337 |
+
" embeddings = embeddings.flatten(start_dim=1).long() # the size is [batch_size, 2250] \n",
|
338 |
+
" #take just the first 200 embeddings\n",
|
339 |
+
" embeddings = embeddings[:, :200]\n",
|
340 |
+
" # take the mean of the second dimension of the voxels to get the mean of the 10 samples per stimulus\n",
|
341 |
+
" voxels = voxels[:, 1, :]\n",
|
342 |
+
" voxels = voxels.flatten(start_dim=1) # the size is [batch_size, 65000]\n",
|
343 |
+
" outputs = self(voxels)\n",
|
344 |
+
" # the outputs are [batch_size, 200*1024], we need to reshape them to [batch_size, 200, 1024]\n",
|
345 |
+
" outputs = outputs.reshape(-1, 1024, 200)\n",
|
346 |
+
" loss = self.loss(outputs, embeddings)\n",
|
347 |
+
" acuracy = self.tokens_accuracy(outputs, embeddings)\n",
|
348 |
+
" self.log('train_loss', loss)\n",
|
349 |
+
" self.log('train_accuracy', acuracy)\n",
|
350 |
+
" return loss\n",
|
351 |
+
" \n",
|
352 |
+
" def tokens_accuracy(self, outputs, embeddings):\n",
|
353 |
+
" # outputs is [batch_size, 1024, 200]\n",
|
354 |
+
" # embeddings is [batch_size, 200]\n",
|
355 |
+
" # we need to get the index of the maximum value of each token\n",
|
356 |
+
" outputs = outputs.argmax(dim=1)\n",
|
357 |
+
" # now we need to compare the outputs with the embeddings\n",
|
358 |
+
" return (outputs == embeddings).float().mean()\n",
|
359 |
+
"\n",
|
360 |
+
" \n",
|
361 |
+
" def validation_step(self, batch, batch_idx):\n",
|
362 |
+
" voxels, embeddings = batch\n",
|
363 |
+
" embeddings = embeddings.flatten(start_dim=1).long()\n",
|
364 |
+
" embeddings = embeddings[:, :200]\n",
|
365 |
+
" voxels = voxels[:, 1, :]\n",
|
366 |
+
" voxels = voxels.flatten(start_dim=1)\n",
|
367 |
+
" outputs = self(voxels)\n",
|
368 |
+
" outputs = outputs.reshape(-1, 1024, 200)\n",
|
369 |
+
" loss = self.loss(outputs, embeddings)\n",
|
370 |
+
" accuracy = self.tokens_accuracy(outputs, embeddings)\n",
|
371 |
+
" self.log('val_loss', loss)\n",
|
372 |
+
" self.log('val_accuracy', accuracy)\n",
|
373 |
+
" return loss\n",
|
374 |
+
" \n",
|
375 |
+
" \n",
|
376 |
+
" def configure_optimizers(self):\n",
|
377 |
+
" return torch.optim.Adam(self.parameters(), lr=1e-6)\n",
|
378 |
+
" \n",
|
379 |
+
"\n",
|
380 |
+
"# create the model\n",
|
381 |
+
"sizes = [60784, 1000, 1000, 200*1024]\n",
|
382 |
+
"residual_conections = [[0], [1], [2], [3]]\n",
|
383 |
+
"dropout = [0.2, 0.2, 0.2, 0.2]\n",
|
384 |
+
"model = MLP(sizes, residual_conections, dropout)\n",
|
385 |
+
"\n",
|
386 |
+
"# create the data module\n",
|
387 |
+
"data_module = VoxelsEmbeddinsEncodecDataModule(train_voxels_path, train_embeddings_path, test_voxels_path, test_embeddings_path, batch_size=4)\n",
|
388 |
+
"\n",
|
389 |
+
"wandb.finish()\n",
|
390 |
+
"\n",
|
391 |
+
"wandb_logger = WandbLogger(project='brain2music', entity='ckadirt')\n",
|
392 |
+
"\n",
|
393 |
+
"# define the trainer\n",
|
394 |
+
"trainer = L.Trainer(devices=2, accelerator=\"gpu\", max_epochs=400, logger=wandb_logger, precision='16-mixed', log_every_n_steps=10)\n",
|
395 |
+
"\n",
|
396 |
+
"# train the model\n",
|
397 |
+
"trainer.fit(model, datamodule=data_module)\n"
|
398 |
+
]
|
399 |
+
},
|
400 |
+
{
|
401 |
+
"cell_type": "code",
|
402 |
+
"execution_count": null,
|
403 |
+
"metadata": {},
|
404 |
+
"outputs": [],
|
405 |
+
"source": [
|
406 |
+
"model3.eval()\n",
|
407 |
+
"outputs = torch.Tensor((480,200))\n",
|
408 |
+
"with torch.no_grad():\n",
|
409 |
+
" test_dataset = VoxelsDataset(test_voxels_path, test_embeddings_path)\n",
|
410 |
+
" dataloader = data.DataLoader(test_dataset, batch_size = 2)\n",
|
411 |
+
" for i, (voxels, embeddings) in enumerate(dataloader):\n",
|
412 |
+
" voxels = voxels[:, 1, :]\n",
|
413 |
+
" voxels = voxels.flatten(start_dim=1) # the size is [batch_size, 65000]\n",
|
414 |
+
" bout = model3(voxels)\n",
|
415 |
+
" bout = bout.reshape(-1, 1024, 200)\n",
|
416 |
+
" # the 1024 dimension is the number of tokens, we need to get the index of the maximum value of each token\n",
|
417 |
+
" bout = bout.argmax(dim=1)\n",
|
418 |
+
" # now we need to add the outputs to the outputs tensor\n",
|
419 |
+
" outputs[i*2:(i+1)*2] = bout\n",
|
420 |
+
" \n",
|
421 |
+
" \n",
|
422 |
+
"# save the predicted outputs on the current directory\n",
|
423 |
+
"torch.save(outputs, 'outputs.pt')"
|
424 |
+
]
|
425 |
+
}
|
426 |
+
],
|
427 |
+
"metadata": {
|
428 |
+
"kernelspec": {
|
429 |
+
"display_name": "Python 3 (ipykernel)",
|
430 |
+
"language": "python",
|
431 |
+
"name": "python3"
|
432 |
+
},
|
433 |
+
"language_info": {
|
434 |
+
"codemirror_mode": {
|
435 |
+
"name": "ipython",
|
436 |
+
"version": 3
|
437 |
+
},
|
438 |
+
"file_extension": ".py",
|
439 |
+
"mimetype": "text/x-python",
|
440 |
+
"name": "python",
|
441 |
+
"nbconvert_exporter": "python",
|
442 |
+
"pygments_lexer": "ipython3",
|
443 |
+
"version": "3.10.8"
|
444 |
+
}
|
445 |
+
},
|
446 |
+
"nbformat": 4,
|
447 |
+
"nbformat_minor": 4
|
448 |
+
}
|
src/MLPencoder.ipynb
ADDED
The diff for this file is too large to render.
See raw diff
|
|
src/b2m-ckpt1
ADDED
Binary file (184 kB). View file
|
|
src/b2m-ckpt1.pt
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:324b3fec6e3363f45b6e886219effec76e6a8a8b207cb6391eb7c0829b106484
|
3 |
+
size 183603
|
src/mlpdummy.py
ADDED
@@ -0,0 +1,146 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os, torch, torch.nn as nn, torch.utils.data as data, torchvision as tv
|
2 |
+
import lightning as L
|
3 |
+
import numpy as np, pandas as pd, matplotlib.pyplot as plt
|
4 |
+
from pytorch_lightning.loggers import WandbLogger
|
5 |
+
import wandb
|
6 |
+
import pytorch_lightning as pl
|
7 |
+
|
8 |
+
torch.set_float32_matmul_precision('medium')
|
9 |
+
|
10 |
+
# create the datasets and dataloaders
|
11 |
+
train_voxels_path = '/fsx/proj-fmri/ckadirt/b2m/data/sub-001_Resp_Training.npy' # path to training voxels 65000 * 4800
|
12 |
+
test_voxels_path = '/fsx/proj-fmri/ckadirt/b2m/data/sub-001_Resp_Test_Mean.npy' # path to test voxels 65000 * 600
|
13 |
+
|
14 |
+
train_embeddings_path = '/fsx/proj-fmri/ckadirt/b2m/data/encodec_training_embeds_sorted.npy' # path to training embeddings 480 * 2 * 1125
|
15 |
+
test_embeddings_path = '/fsx/proj-fmri/ckadirt/b2m/data/encodec_testing_embeds_sorted.npy' # path to test embeddings 600 * 2 * 1125
|
16 |
+
|
17 |
+
class VoxelsDataset(data.Dataset):
|
18 |
+
def __init__(self, voxels_path, embeddings_path):
|
19 |
+
# transpose the two dimensions of the voxels data to match the embeddings data
|
20 |
+
self.voxels = torch.from_numpy(np.load(voxels_path)).float().transpose(0, 1)
|
21 |
+
self.embeddings = torch.from_numpy(np.load(embeddings_path))
|
22 |
+
# as each stimulus has been exposed for 15 seconds and the fMRI data is sampled every 1.5 seconds, we take 10 samples per stimulus
|
23 |
+
self.len = len(self.voxels) // 10
|
24 |
+
print("The len is ", self.len )
|
25 |
+
|
26 |
+
def __getitem__(self, index):
|
27 |
+
# as each stimulus has been exposed for 15 seconds and the fMRI data is sampled every 1.5 seconds, we take 10 samples per stimulus
|
28 |
+
voxels = self.voxels[index*10:(index+1)*10]
|
29 |
+
embeddings = self.embeddings[index]
|
30 |
+
return voxels, embeddings
|
31 |
+
|
32 |
+
def __len__(self):
|
33 |
+
return self.len
|
34 |
+
|
35 |
+
class VoxelsEmbeddinsEncodecDataModule(pl.LightningDataModule):
|
36 |
+
def __init__(self, train_voxels_path, train_embeddings_path, test_voxels_path, test_embeddings_path, batch_size=8):
|
37 |
+
super().__init__()
|
38 |
+
self.train_voxels_path = train_voxels_path
|
39 |
+
self.train_embeddings_path = train_embeddings_path
|
40 |
+
self.test_voxels_path = test_voxels_path
|
41 |
+
self.test_embeddings_path = test_embeddings_path
|
42 |
+
self.batch_size = batch_size
|
43 |
+
|
44 |
+
def setup(self, stage=None):
|
45 |
+
self.train_dataset = VoxelsDataset(self.train_voxels_path, self.train_embeddings_path)
|
46 |
+
self.test_dataset = VoxelsDataset(self.test_voxels_path, self.test_embeddings_path)
|
47 |
+
|
48 |
+
def train_dataloader(self):
|
49 |
+
return data.DataLoader(self.train_dataset, batch_size=self.batch_size, shuffle=True)
|
50 |
+
|
51 |
+
def val_dataloader(self):
|
52 |
+
return data.DataLoader(self.test_dataset, batch_size=self.batch_size, shuffle=False)
|
53 |
+
|
54 |
+
|
55 |
+
class MLP(pl.LightningModule):
|
56 |
+
def __init__(self, sizes, residual_conections, dropout):
|
57 |
+
# sizes is a list of the sizes of the layers ej: [4800, 1000, 1000, 1000, 1000, 1000, 1000, 600]
|
58 |
+
# residual_conections is a list with the same length as sizes, each element is a list of the indexes of the layers that will recieve the output of the layer as input, 0 means that the layer will recieve the x inputs ej. [[0], [1], [2,1], [3], [4,3], [5], [6,5], [7]]
|
59 |
+
# dropout is a list with the same length as sizes, each element is the dropout probability of the layer ej. [0.5, 0.5, 0.5, 0.5, 0.5, 0.5]
|
60 |
+
super().__init__()
|
61 |
+
self.sizes = sizes
|
62 |
+
self.residual_conections = residual_conections
|
63 |
+
self.dropout = dropout
|
64 |
+
self.layers = nn.Sequential()
|
65 |
+
for i in range(len(sizes)-1):
|
66 |
+
self.layers.add_module('linear'+str(i), nn.Linear(sizes[i], sizes[i+1]))
|
67 |
+
self.layers.add_module('relu'+str(i), nn.ReLU())
|
68 |
+
self.layers.add_module('dropout'+str(i), nn.Dropout(dropout[i]))
|
69 |
+
|
70 |
+
self.loss = nn.CrossEntropyLoss(reduction='mean')
|
71 |
+
|
72 |
+
def forward(self, x):
|
73 |
+
return self.layers(x)
|
74 |
+
|
75 |
+
def training_step(self, batch, batch_idx):
|
76 |
+
voxels, embeddings = batch # the sizes are [batch_size, 10, 65000] and [batch_size, 2, 1125]
|
77 |
+
# flatten the voxels to [batch_size, rest of the dimensions]
|
78 |
+
embeddings = embeddings.flatten(start_dim=1).long() # the size is [batch_size, 2250]
|
79 |
+
#take just the first 200 embeddings
|
80 |
+
# embeddings = embeddings[:, :200]
|
81 |
+
# take the mean of the second dimension of the voxels to get the mean of the 10 samples per stimulus
|
82 |
+
voxels = voxels.mean(dim=1)
|
83 |
+
voxels = voxels.flatten(start_dim=1) # the size is [batch_size, 65000]
|
84 |
+
outputs = self(voxels)
|
85 |
+
# the outputs are [batch_size, 200*1024], we need to reshape them to [batch_size, 200, 1024]
|
86 |
+
outputs = outputs.reshape(-1, 1024, 1125*2)
|
87 |
+
# avoid division by zero
|
88 |
+
outputs = outputs + 1e-6
|
89 |
+
#print(outputs.shape, embeddings.shape)
|
90 |
+
#print(outputs[0,0,:10], embeddings[0,:10])
|
91 |
+
loss = self.loss(outputs, embeddings)
|
92 |
+
#print(loss)
|
93 |
+
acuracy = self.tokens_accuracy(outputs, embeddings)
|
94 |
+
self.log('train_loss', loss)
|
95 |
+
self.log('train_accuracy', acuracy)
|
96 |
+
return loss
|
97 |
+
|
98 |
+
def tokens_accuracy(self, outputs, embeddings):
|
99 |
+
# outputs is [batch_size, 1024, 200]
|
100 |
+
# embeddings is [batch_size, 200]
|
101 |
+
# we need to get the index of the maximum value of each token
|
102 |
+
outputs = outputs.argmax(dim=1)
|
103 |
+
# now we need to compare the outputs with the embeddings
|
104 |
+
return (outputs == embeddings).float().mean()
|
105 |
+
|
106 |
+
|
107 |
+
def validation_step(self, batch, batch_idx):
|
108 |
+
voxels, embeddings = batch
|
109 |
+
embeddings = embeddings.flatten(start_dim=1).long()
|
110 |
+
#embeddings = embeddings[:, :200]
|
111 |
+
voxels = voxels.mean(dim=1)
|
112 |
+
voxels = voxels.flatten(start_dim=1)
|
113 |
+
outputs = self(voxels)
|
114 |
+
outputs = outputs.reshape(-1, 1024, 1125*2)
|
115 |
+
loss = self.loss(outputs, embeddings)
|
116 |
+
accuracy = self.tokens_accuracy(outputs, embeddings)
|
117 |
+
self.log('val_loss', loss)
|
118 |
+
self.log('val_accuracy', accuracy)
|
119 |
+
return loss
|
120 |
+
|
121 |
+
|
122 |
+
def configure_optimizers(self):
|
123 |
+
return torch.optim.Adam(self.trainer.model.parameters(), lr=2e-5, weight_decay=3e-3)
|
124 |
+
|
125 |
+
|
126 |
+
# create the model
|
127 |
+
sizes = [60784, 1000, 1000, 1125*2*1024]
|
128 |
+
residual_conections = [[0], [1], [2], [3]]
|
129 |
+
dropout = [0.5, 0.5, 0.5, 0.5]
|
130 |
+
model = MLP(sizes, residual_conections, dropout)
|
131 |
+
|
132 |
+
|
133 |
+
# create the data module
|
134 |
+
data_module = VoxelsEmbeddinsEncodecDataModule(train_voxels_path, train_embeddings_path, test_voxels_path, test_embeddings_path, batch_size=4)
|
135 |
+
|
136 |
+
wandb.finish()
|
137 |
+
from pytorch_lightning.strategies import DeepSpeedStrategy
|
138 |
+
|
139 |
+
wandb_logger = WandbLogger(project='brain2music', entity='ckadirt')
|
140 |
+
|
141 |
+
# define the trainer
|
142 |
+
trainer = pl.Trainer(accelerator="gpu", devices = [0,1,2,3,4,5,6,7], max_epochs=1000, logger=wandb_logger, precision='32', strategy=DeepSpeedStrategy(stage=3, logging_batch_size_per_gpu=8), enable_checkpointing=False, log_every_n_steps=10)
|
143 |
+
#trainer = pl.Trainer(accelerator="gpu", devices = [0,1,2,3], max_epochs=1000, logger=wandb_logger, precision='bf16', strategy='fsdp', enable_checkpointing=False, log_every_n_steps=10)
|
144 |
+
# train the model
|
145 |
+
trainer.fit(model, datamodule=data_module)
|
146 |
+
|
src/musicgen_test copy.ipynb
ADDED
The diff for this file is too large to render.
See raw diff
|
|
src/musicgen_test.ipynb
ADDED
The diff for this file is too large to render.
See raw diff
|
|
src/outputs_train0.pt
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:4c329bb538c038cb0997e4d8a28c1194b985fe749d335acdd217d4584d5a5f33
|
3 |
+
size 11505408
|
src/outputs_train1.pt
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:b943d8ad8171f749eb949a15b2b533febef14b63766a3822216ab6ca0136a7df
|
3 |
+
size 11505408
|
src/outputs_train10.pt
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:44220fbaaae452574cbbf3ee994930e1f82b71a80e87d413fa7c1e9e982ba628
|
3 |
+
size 11505411
|
src/outputs_train11.pt
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:9c724ecb56118655468b1f029e21b26bccfda1a2fbbaa22384c807e64ab04eba
|
3 |
+
size 11505411
|
src/outputs_train12.pt
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:471d0f66b3f174442b1001bdab8672f22d5f0a8958de547beb332ee7bf3326f2
|
3 |
+
size 11505411
|
src/outputs_train13.pt
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:5a25c407a91bdd02cbc45ab829c1bb41c74865611d2e0ccab2129f266c3002f3
|
3 |
+
size 11505411
|
src/outputs_train14.pt
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:89b0eeb9b9aae498e1caaed017ee6d6f7d8819e388853fbb3f0f510b87b3f54b
|
3 |
+
size 11505411
|
src/outputs_train15.pt
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:21c8ee497ee20e58bbb164ae8bdece4d11fcc49b956d9024dd9d445acdd655cc
|
3 |
+
size 11505411
|
src/outputs_train16.pt
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:dc9c20f0192317d604a06ea1f0bece0e292c9c3b5d7fbe4f38baa048f2c21ea6
|
3 |
+
size 11505411
|
src/outputs_train17.pt
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:bcf1d56c5e018539f8df4c27ceae6d4586f7f337597efee39575520c94bcef02
|
3 |
+
size 11505411
|
src/outputs_train18.pt
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:7f43266b7e5fd07645e2775b51133e13c052530715e0a94885bc44b5ad80943f
|
3 |
+
size 11505411
|
src/outputs_train19.pt
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:22e50667a061182431fb5b6e0f1d973942d813a399baad1fa2289197a4ba61e8
|
3 |
+
size 11505411
|
src/outputs_train2.pt
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:31e397b8e34a6b00ce8ec2930269f78323b5a5717586a941d50fc6d7a11aab09
|
3 |
+
size 11505408
|
src/outputs_train20.pt
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:06b1e7abd9058661a98adfc9416e59563bc2c81f5e722748c6a857b8e646dc44
|
3 |
+
size 11505411
|
src/outputs_train21.pt
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:700abd1ea9a42a56deea97287da1ed5991cdac64d3ff2b254c122025e02445de
|
3 |
+
size 11505411
|
src/outputs_train22.pt
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:9eb089a91056c1c9fe77240d15c89298c9124e0f82a6c38d29c555cedeb025ec
|
3 |
+
size 11505411
|
src/outputs_train23.pt
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:47c6f65fc2cc3728caa62269ced13927b8d7de17190e2c9a0068a7d57181a1aa
|
3 |
+
size 11505411
|
src/outputs_train24.pt
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:30752d07d2360df5b65bc9ce02cfe388f85cdb4b68b966e4a701055ba4049025
|
3 |
+
size 11505411
|