-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmain.py
More file actions
136 lines (115 loc) · 4.09 KB
/
Copy pathmain.py
File metadata and controls
136 lines (115 loc) · 4.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
from load_data import load_data
from baseline import AE
import torch.optim as optim
import torch
from torch.utils.data import DataLoader, TensorDataset, random_split
from sklearn.decomposition import PCA
from torch import nn
import numpy as np
import os
import pandas as pd
base_dir = os.getcwd()
study = 'schiebinger2019/raw_data_log'
# study = 'cao2019'
ttp = 12
ttp_p = 11
gene_cap = 2000
cell_cap = 2000
latent_size = 100
count = []
dense_mat_list, _ = load_data(base_dir, study, ttp, gene_cap, cell_cap)
for i in dense_mat_list:
count.append(len(i))
print(f"Count si {count}")
mat = np.concatenate(dense_mat_list)
print("Mat is:")
print(mat.shape)
pca = PCA(n_components= latent_size)
pca.fit(mat)
transformed = pca.transform(mat)
print(f"Transformed: {transformed.shape}")
# print(len(dense_mat_list))
sum=0
output = []
for i in count:
adding = transformed[sum:sum+i,:]
print(adding.shape)
output.append(adding)
sum+=i
for i in range(len(output)):
cur = output[i]
print(len(cur))
df = pd.DataFrame(cur)
file_name = 'schiebinger2019/large_test/pca/' + str(i+1) + '.tsv.gz'
df.to_csv(file_name, sep='\t', index=False, compression='gzip')
# for i in range(len(output)):
# # Extract the (c,g) matrix for the i-th t
# matrix = dense_mat_list[i]
# # Convert the numpy array to a pandas DataFrame
# df = pd.DataFrame(matrix)
# # Construct the file name
# file_name = 'schiebinger2019/raw_data_origin/raw_data/original_' + str(i+1) + '.tsv.gz'
# # Save the DataFrame to a compressed TSV file
# df.to_csv(file_name, sep='\t', index=False, compression='gzip')
exit()
# Convert tensor
input_tensor = torch.tensor(np.concatenate(dense_mat_list), dtype=torch.float32)
# Shuffle
input_tensor = input_tensor[torch.randperm(input_tensor.size()[0])]
# Split
train_size = int(0.7 * len(input_tensor))
valid_size = int(0.15 * len(input_tensor))
test_size = len(input_tensor) - train_size - valid_size
train_dataset, valid_dataset, test_dataset = random_split(input_tensor, [train_size, valid_size, test_size])
print(f"Dataset preprocessed.")
# Initialization
[cell_num, gene_num] = input_tensor.size()
print(f"Cell and gene: {cell_num}, {gene_num}")
print(f"Cuda? {torch.cuda.is_available()}")
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
ae = AE(gene_num, latent_size).to(device) #Testing.
print(f"AE initialized.")
# Recon
criterion = nn.MSELoss()
optimizer = optim.Adam(ae.parameters(), lr=0.001)
# Create DataLoaders
batch_size = 32
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True).to(device)
valid_loader = DataLoader(valid_dataset, batch_size=batch_size, shuffle=True).to(device)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=True).to(device)
# Train
def train(model, data_loader, optimizer, criterion, epochs=10):
model.train()
for epoch in range(epochs):
running_loss = 0.0
for data in data_loader:
inputs = data.unsqueeze(1) # Add a channel dimension
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, inputs)
loss.backward()
optimizer.step()
running_loss += loss.item()
print(f'Epoch {epoch + 1}, Loss: {running_loss / len(data_loader)}')
# Eval
def evaluate(model, data_loader, criterion):
model.eval()
total_loss = 0.0
with torch.no_grad():
for data in data_loader:
inputs = data.unsqueeze(1) # Add a channel dimension
outputs = model(inputs)
loss = criterion(outputs, inputs)
total_loss += loss.item()
return total_loss / len(data_loader)
# Train
print("Start training.")
train(ae, train_loader, optimizer, criterion, epochs=10)
print("Training completed.")
latent = ae.latent(gene_num, input_tensor)
print(f"Latent representation: {latent.size()}")
# Evaluating the model
valid_loss = evaluate(ae, valid_loader, criterion)
test_loss = evaluate(ae, test_loader, criterion)
print(f'Validation Loss: {valid_loss}, Test Loss: {test_loss}')
torch.save(ae.state_dict(), "Output_baseline.pt")