Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
A
Autoencoder_Project
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Lam Giang Tran
Autoencoder_Project
Commits
a805a9aa
Commit
a805a9aa
authored
9 months ago
by
Lam Giang Tran
Browse files
Options
Downloads
Patches
Plain Diff
final scripts
parent
0226b66d
No related branches found
No related tags found
No related merge requests found
Changes
2
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
SCRIPT - Autoencoder_Summer Student Programm.ipynb
+616
-0
616 additions, 0 deletions
SCRIPT - Autoencoder_Summer Student Programm.ipynb
SCRIPT - Data Preparation_Summer Student Programm.ipynb
+1021
-0
1021 additions, 0 deletions
SCRIPT - Data Preparation_Summer Student Programm.ipynb
with
1637 additions
and
0 deletions
SCRIPT - Autoencoder_Summer Student Programm.ipynb
0 → 100644
+
616
−
0
View file @
a805a9aa
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "a2409e03-673f-4546-9b59-9f7bdee1fd6e",
"metadata": {},
"outputs": [],
"source": [
"## AUTOENCODER-IMPLEMENTATION - Summer Student Project\n",
"# based on ==> https://www.geeksforgeeks.org/implementing-an-autoencoder-in-pytorch/\n",
"# by Lam Giang Tran, Chiara Amendola, Pedro Silva"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "44e646d5",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Welcome to JupyROOT 6.30/04\n"
]
}
],
"source": [
"# Loading Libaries\n",
"\n",
"import torch\n",
"import ROOT\n",
"import uproot\n",
"import numpy as np\n",
"import torch.nn as nn\n",
"import torch.optim as optim\n",
"import torchvision.datasets as datasets\n",
"import torchvision.transforms as transforms\n",
"import matplotlib.pyplot as plt\n",
"\n",
"from scipy.optimize import curve_fit\n",
"from torch.utils.data import DataLoader,TensorDataset"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "90df5809",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 89. 87. 79. 88. 87. 89. 83. 93. 93. 93. 95. 93. 89. 90.\n",
" 87. 85. 93. 91. 92. 91. 95. 91. 89. 93. 89. 90. 93. 89.\n",
" 90. 86. 89. 89. 86. 87. 91. 93. 86. 89. 91. 87. 89. 90.\n",
" 83. 91. 94. 93. 95. 101. 93. 79. 89. 94. 106. 87. 89. 95.\n",
" 89. 95. 93. 91. 91. 90. 91. 93. 87. 97. 91. 91. 89. 91.\n",
" 91. 87. 90. 93.]\n",
"[ 79 83 77 83 83 79 77 87 92 86 181 85 81 83 77 82 83 95\n",
" 89 91 91 81 83 82 82 86 57 84 91 79 75 83 77 82 79 94\n",
" 163 87 87 84 83 84 95 83 89 95 87 93 895 83 85 95 117 185\n",
" 90 95 91 89 87 89 86 85 85 89 86 94 83 85 89 87 85 84\n",
" 85 85]\n",
"Using CUDA as it's available\n",
"599999\n",
"399999\n"
]
}
],
"source": [
"#read the data\n",
"#fIn=ROOT('Events','/eos/user/l/latran/Autoencoder_Project/data/Test_Dataloader/Training_Dataset.root:Events')\n",
"\n",
"## Start reading Data\n",
"# loading Dataset Training\n",
"Dataset_Training = uproot.open('/eos/user/l/latran/Autoencoder_Project/data/Training_Dataloader/Training_Dataset.root:Events'); \n",
"channal_training = Dataset_Training['x'].array(library=\"np\"); #print(ch.shape)\n",
"x_training = Dataset_Training['y'].array(library=\"np\"); print(x_training[0]); #print(x.shape); print(x)\n",
"x_training = x_training.astype(dtype='f'); np.array(x_training)\n",
"\n",
"# Loading Dataset Testing\n",
"Dataset_Testing = uproot.open('/eos/user/l/latran/Autoencoder_Project/data/Training_Dataloader/Test_Dataset.root:Events'); \n",
"channal_testing = Dataset_Testing['x'].array(library=\"np\"); #print(ch.shape)\n",
"x_testing = Dataset_Testing['y'].array(library=\"np\"); print(x_testing[0]) #print(x.shape); print(x)\n",
"x_testing = x_testing.astype(dtype='f'); np.array(x_testing)\n",
"\n",
"#convert to pytorch tensors\n",
"X_Training = torch.from_numpy(x_training)\n",
"X_Testing = torch.from_numpy(x_testing)\n",
"\n",
"if torch.cuda.is_available():\n",
" print(\"Using CUDA as it's available\")\n",
" X_Training = X_Training.cuda() \n",
" X_Testing = X_Testing.cuda()\n",
" \n",
"#split in training and validation -> already splitted during data preperation\n",
"b_Training = X_Training.shape[0]; print(b_Training)\n",
"b_Testing = X_Testing.shape[0]; print(b_Testing)\n",
" # fsplit = 0.1 -> already splitted during data preperation\n",
" # t = int((1-fsplit)*b); print(t)\n",
"\n",
"batch_size=8192; # batch_size=1024\n",
"\n",
" #train_tensors = TensorDataset(X[:b-t],X[:b-t]); print(train_tensors)\n",
" #test_tensors = TensorDataset(X[b-t:b],X[b-t:b]); print(test_tensors) \n",
"\n",
"#create the data loaders\n",
"train_tensors = TensorDataset(X_Training[:b_Training],X_Training[:b_Training]); # print(len(train_tensors))\n",
"train_dataloader = DataLoader(train_tensors, batch_size=batch_size, shuffle=True); # print(len(train_dataloader))\n",
"\n",
"test_tensors = TensorDataset(X_Testing[:b_Testing],X_Testing[:b_Testing]); # print(len(test_tensors))\n",
"test_dataloader = DataLoader(test_tensors, batch_size=batch_size, shuffle=True); # print(len(test_dataloader))\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "e42c878b-b3a0-4b00-8aba-9eb8a8f8f066",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"cuda\n",
"Epoch [1/50], Loss: 1.0179\n",
"Epoch [6/50], Loss: 1.0057\n",
"Epoch [11/50], Loss: 1.0014\n",
"Epoch [16/50], Loss: 1.0028\n",
"Epoch [21/50], Loss: 1.0063\n",
"Epoch [26/50], Loss: 1.0072\n",
"Epoch [31/50], Loss: 1.0030\n",
"Epoch [36/50], Loss: 1.0087\n",
"Epoch [41/50], Loss: 1.0078\n",
"Epoch [46/50], Loss: 1.0043\n",
"CPU times: user 8min 30s, sys: 3.02 s, total: 8min 33s\n",
"Wall time: 8min 34s\n"
]
}
],
"source": [
"%%time\n",
"# Define the autoencoder architecture\n",
"class Autoencoder(nn.Module):\n",
" def __init__(self):\n",
" super().__init__()\n",
" self.encoder = nn.Sequential(\n",
" nn.Linear(74, 148),\n",
" nn.ReLU(), \n",
" nn.Linear(148, 128),\n",
" nn.ReLU(), \n",
" nn.Linear(128, 64),\n",
" nn.ReLU(), \n",
" nn.Linear(64, 32),\n",
" nn.ReLU(),\n",
" nn.Linear(32, 16),\n",
" nn.ReLU(),\n",
" nn.Linear(16, 8),\n",
" nn.ReLU(),\n",
" nn.Linear(8, 4),\n",
" nn.ReLU(),\n",
" nn.Linear(4, 2),\n",
" nn.ReLU()\n",
" )\n",
"\n",
" self.decoder = nn.Sequential(\n",
" nn.Linear(2, 4),\n",
" nn.ReLU(),\n",
" nn.Linear(4, 8),\n",
" nn.ReLU(),\n",
" nn.Linear(8, 16),\n",
" nn.ReLU(),\n",
" nn.Linear(16, 32),\n",
" nn.ReLU(),\n",
" nn.Linear(32, 64),\n",
" nn.ReLU(),\n",
" nn.Linear(64, 128),\n",
" nn.ReLU(),\n",
" nn.Linear(128, 148),\n",
" nn.ReLU(),\n",
" nn.Linear(148, 74),\n",
" nn.Sigmoid()\n",
" )\n",
"\n",
" def forward(self, x):\n",
" encoded = self.encoder(x); \n",
" decoded = self.decoder(encoded);\n",
" return decoded\n",
"\n",
"# Initialize the autoencoder\n",
"model = Autoencoder()\n",
"\n",
"# Define transform\n",
"#transform = transforms.Compose([\n",
"# transforms.Resize((64, 64)),\n",
"# transforms.ToTensor(),\n",
"#])\n",
"\n",
"# Move the model to GPU\n",
"device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n",
"print(device)\n",
"model.to(device)\n",
"\n",
"# Define the loss function and optimizer\n",
"criterion = nn.MSELoss(reduction='mean')# mean square of difference of input- and output layer\n",
"optimizer = optim.Adam(model.parameters(), lr=0.0001, weight_decay = 1e-4)\n",
"\n",
"# Train the autoencoder\n",
"num_epochs = 50\n",
"outputs = []\n",
"trained = []\n",
"losses = []\n",
"\n",
"for epoch in range(num_epochs):\n",
" for data in train_dataloader:\n",
" \n",
" img, _ = data; # print(\"img:\",img); # print(\"_:\", _)\n",
" img = img.to(device); \n",
" output = model(img); # print(\"output:\", output)\n",
" optimizer.zero_grad()\n",
"\n",
" loss = criterion(output, img) / 7400; # print(\"loss:\", loss)\n",
" loss.backward()\n",
" optimizer.step()\n",
" \n",
" trained.append(output)\n",
" losses.append(loss)\n",
" \n",
" outputs.append((epoch, img, output))\n",
" if epoch % 5 == 0:\n",
" print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item()))\n",
"\n",
"# Save the model\n",
"torch.save(model.state_dict(), 'autoencoder.pth')"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "fdec8545",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"COMPLETED optimizing loss function.\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"losses = torch.tensor(losses).detach().cpu().numpy()\n",
"# losses = losses.cpu().numpy()\n",
"\n",
"# Defining the Plot Style\n",
"plt.figure(facecolor='white')\n",
"plt.style.use('fivethirtyeight')\n",
"plt.xlabel('Iterations / Epoch')\n",
"plt.ylabel('Loss')\n",
"plt.plot((losses[:350]))\n",
"\n",
"print(\"COMPLETED optimizing loss function.\")"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "98efdf90-ae7d-4e15-ac36-da7e6a961aa2",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1.0159957\n"
]
}
],
"source": [
"print(losses[40])\n",
"#print(np.size(losses))"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "5d644d42",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Batch [0], Loss: 1.0065\n",
"Batch [1], Loss: 1.0061\n",
"Batch [2], Loss: 1.0049\n",
"Batch [3], Loss: 1.0064\n",
"Batch [4], Loss: 1.0057\n",
"Batch [5], Loss: 1.0057\n",
"Batch [6], Loss: 1.0062\n",
"Batch [7], Loss: 1.0062\n",
"Batch [8], Loss: 1.0058\n",
"Batch [9], Loss: 1.0072\n",
"Batch [10], Loss: 1.0047\n",
"Batch [11], Loss: 1.0063\n",
"Batch [12], Loss: 1.0049\n",
"Batch [13], Loss: 1.0064\n",
"Batch [14], Loss: 1.0060\n",
"Batch [15], Loss: 1.0061\n",
"Batch [16], Loss: 1.0046\n",
"Batch [17], Loss: 1.0064\n",
"Batch [18], Loss: 1.0056\n",
"Batch [19], Loss: 1.0060\n",
"Batch [20], Loss: 1.0054\n",
"Batch [21], Loss: 1.0068\n",
"Batch [22], Loss: 1.0071\n",
"Batch [23], Loss: 1.0055\n",
"Batch [24], Loss: 1.0050\n",
"Batch [25], Loss: 1.0062\n",
"Batch [26], Loss: 1.0064\n",
"Batch [27], Loss: 1.0064\n",
"Batch [28], Loss: 1.0059\n",
"Batch [29], Loss: 1.0052\n",
"Batch [30], Loss: 1.0049\n",
"Batch [31], Loss: 1.0067\n",
"Batch [32], Loss: 1.0067\n",
"Batch [33], Loss: 1.0051\n",
"Batch [34], Loss: 1.0053\n",
"Batch [35], Loss: 1.0053\n",
"Batch [36], Loss: 1.0058\n",
"Batch [37], Loss: 1.0062\n",
"Batch [38], Loss: 1.0051\n",
"Batch [39], Loss: 1.0064\n",
"Batch [40], Loss: 1.0051\n",
"Batch [41], Loss: 1.0050\n",
"Batch [42], Loss: 1.0057\n",
"Batch [43], Loss: 1.0056\n",
"Batch [44], Loss: 1.0055\n",
"Batch [45], Loss: 1.0073\n",
"Batch [46], Loss: 1.0054\n",
"Batch [47], Loss: 1.0065\n",
"Batch [48], Loss: 1.0073\n"
]
}
],
"source": [
"# Test the autoencoder\n",
"num_epochs = 50\n",
"outputs = []\n",
"tested = []\n",
"losses = []\n",
"\n",
"model_state_dict = torch.load('autoencoder.pth');\n",
"model = Autoencoder();\n",
"model.load_state_dict(model_state_dict)\n",
"R=[];\n",
"\n",
"model.cpu();\n",
"\n",
"with torch.no_grad(): \n",
" for b, xtest in enumerate(test_dataloader):\n",
" img, _ = xtest;\n",
" img = img.cpu();\n",
" # Apply the model\n",
" xpred = model.forward(img)\n",
" # Update test loss & accuracy for the epoch\n",
" losstest = criterion(xpred, img) / 19000\n",
" losses.append(losstest.item());\n",
"\n",
" y = xpred - img;\n",
" R.append( y.numpy() )\n",
"\n",
" print('Batch [{}], Loss: {:.4f}'.format(b, losstest.item()))\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "032fea41",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1.0064617 1.0061032 1.0048829 1.0064017 1.0057319 1.0056655 1.0062454\n",
" 1.0061747 1.0057641 1.0072342 1.0046877 1.0062848 1.0049303 1.0063547\n",
" 1.006006 1.006109 1.0045859 1.0064313 1.0056365 1.0059724 1.0054065\n",
" 1.0068065 1.0070988 1.0054579 1.0049857 1.0061715 1.0063528 1.0063652\n",
" 1.0058655 1.005199 1.0048867 1.0066928 1.00673 1.0050893 1.005252\n",
" 1.0052563 1.0057722 1.0062329 1.0051069 1.0063674 1.0050957 1.0049974\n",
" 1.0057102 1.0055721 1.0055089 1.0072767 1.0053504 1.0065398 1.0072845]\n"
]
}
],
"source": [
"losses = torch.tensor(losses).detach().cpu().numpy()\n",
"print(losses)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "b470f379",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"COMPLETED optimizing loss function.\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Defining the Plot Style\n",
"plt.figure(facecolor='white')\n",
"plt.style.use('fivethirtyeight')\n",
"plt.xlabel('Batch / Epoch')\n",
"plt.ylabel('Loss')\n",
"plt.plot((losses[:100]))\n",
"\n",
"print(\"COMPLETED optimizing loss function.\")"
]
},
{
"cell_type": "raw",
"id": "b9a582bd-b093-4c0d-8e7e-22bfbf9b7abf",
"metadata": {},
"source": [
"for i in enumerate(img):\n",
"# print(i[1])\n",
"\n",
" plt.imshow(i[0])\n",
"# Reshape the array for plotting\n",
"\n",
"for i in enumerate(trained):\n",
"# print(i[1])\n",
" plt.imshow(i[0])\n"
]
},
{
"cell_type": "raw",
"id": "c3fde6db-58ca-4f10-b6fb-dc81cf134d1f",
"metadata": {},
"source": [
"print(img[1]);\n",
"print(trained[1]);\n",
"print(xpred[1]);"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "1ecd9a86",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[86.7538 88.747986 88.7403 ... 94.745834 90.75315 94.74665 ]\n",
" [86.7538 88.747986 88.7403 ... 94.745834 90.75315 94.74665 ]\n",
" [86.7538 88.747986 88.7403 ... 94.745834 90.75315 94.74665 ]\n",
" ...\n",
" [86.7538 88.747986 88.7403 ... 94.745834 90.75315 94.74665 ]\n",
" [86.7538 88.747986 88.7403 ... 94.745834 90.75315 94.74665 ]\n",
" [86.7538 88.747986 88.7403 ... 94.745834 90.75315 94.74665 ]]\n"
]
}
],
"source": [
"x_predicted_percentage = xpred.numpy();\n",
"x_predicted = x_predicted_percentage * img[1].numpy();\n",
"\n",
"print(x_predicted)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "8fac20dd",
"metadata": {},
"outputs": [],
"source": [
"def plotting_ADC(_event_number, _adc_raw, _adc_reconstructed): \n",
" # Parameters\n",
" Event_raw = _adc_raw; \n",
" Event_reconstructed = _adc_reconstructed; \n",
"\n",
" # Plotting Values\n",
" plot_values_channel = np.arange(np.size(Event_raw));\n",
" \n",
" \n",
" # Plotting Paramters\n",
" # Plotting Parameters\n",
" plot_titel = \"Event Display\"\n",
" plt.figure(facecolor='white') \n",
"\n",
" # Plotting - normal\n",
" plt.plot(plot_values_channel, Event_raw, drawstyle = \"steps-post\", label = \"raw signal\")\n",
" plt.plot(plot_values_channel, Event_reconstructed, drawstyle = \"steps-post\", label = \"reconstructed\")\n",
" \n",
" \n",
" plt.title(plot_titel)\n",
" plt.legend(loc=\"upper left\")\n",
" plt.xlabel(\"channel number\")\n",
" plt.ylabel(\"ADC value\") \n",
" \n",
" #plt.grid()\n",
" plt.show\n",
"\n",
" #plt.savefig('Event_comparison.eps', format='eps')\n",
" #plt.savefig('Event_comparison.png', format='png')"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "10a5cec0",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 89. 87. 79. 85. 85. 84. 79. 87. 91. 86. 183. 87. 86. 86.\n",
" 81. 88. 93. 93. 89. 91. 89. 89. 87. 89. 87. 87. 75. 87.\n",
" 89. 85. 89. 90. 83. 89. 87. 92. 85. 91. 90. 85. 87. 88.\n",
" 84. 111. 88. 95. 90. 86. 895. 83. 87. 95. 91. 191. 89. 95.\n",
" 90. 98. 90. 89. 90. 91. 89. 89. 91. 93. 89. 89. 90. 89.\n",
" 89. 91. 89. 93.]\n",
"[ 87. 89. 89. 90. 89. 90. 85. 93. 91. 89. 187. 90. 87. 91.\n",
" 86. 91. 95. 91. 89. 91. 91. 93. 87. 95. 90. 91. 79. 89.\n",
" 87. 89. 90. 93. 89. 91. 91. 93. 89. 94. 91. 93. 90. 94.\n",
" 89. 94. 93. 93. 95. 90. 893. 89. 91. 94. 95. 194. 89. 95.\n",
" 90. 95. 93. 93. 90. 91. 95. 95. 90. 95. 93. 95. 89. 95.\n",
" 95. 95. 91. 95.]\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"Event_number = 19\n",
"Event_raw = img[Event_number].numpy(); print(Event_raw)\n",
"Event_predicted = x_predicted[Event_number]; print(np.round(Event_predicted))\n",
"plotting_ADC(Event_number, Event_raw-Event_raw, Event_predicted-Event_raw)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "9d53bf5e",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"@webio": {
"lastCommId": null,
"lastKernelId": null
},
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.12"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
%% Cell type:code id:a2409e03-673f-4546-9b59-9f7bdee1fd6e tags:
```
python
## AUTOENCODER-IMPLEMENTATION - Summer Student Project
# based on ==> https://www.geeksforgeeks.org/implementing-an-autoencoder-in-pytorch/
# by Lam Giang Tran, Chiara Amendola, Pedro Silva
```
%% Cell type:code id:44e646d5 tags:
```
python
# Loading Libaries
import
torch
import
ROOT
import
uproot
import
numpy
as
np
import
torch.nn
as
nn
import
torch.optim
as
optim
import
torchvision.datasets
as
datasets
import
torchvision.transforms
as
transforms
import
matplotlib.pyplot
as
plt
from
scipy.optimize
import
curve_fit
from
torch.utils.data
import
DataLoader
,
TensorDataset
```
%% Output
Welcome to JupyROOT 6.30/04
%% Cell type:code id:90df5809 tags:
```
python
#read the data
#fIn=ROOT('Events','/eos/user/l/latran/Autoencoder_Project/data/Test_Dataloader/Training_Dataset.root:Events')
## Start reading Data
# loading Dataset Training
Dataset_Training
=
uproot
.
open
(
'
/eos/user/l/latran/Autoencoder_Project/data/Training_Dataloader/Training_Dataset.root:Events
'
);
channal_training
=
Dataset_Training
[
'
x
'
].
array
(
library
=
"
np
"
);
#print(ch.shape)
x_training
=
Dataset_Training
[
'
y
'
].
array
(
library
=
"
np
"
);
print
(
x_training
[
0
]);
#print(x.shape); print(x)
x_training
=
x_training
.
astype
(
dtype
=
'
f
'
);
np
.
array
(
x_training
)
# Loading Dataset Testing
Dataset_Testing
=
uproot
.
open
(
'
/eos/user/l/latran/Autoencoder_Project/data/Training_Dataloader/Test_Dataset.root:Events
'
);
channal_testing
=
Dataset_Testing
[
'
x
'
].
array
(
library
=
"
np
"
);
#print(ch.shape)
x_testing
=
Dataset_Testing
[
'
y
'
].
array
(
library
=
"
np
"
);
print
(
x_testing
[
0
])
#print(x.shape); print(x)
x_testing
=
x_testing
.
astype
(
dtype
=
'
f
'
);
np
.
array
(
x_testing
)
#convert to pytorch tensors
X_Training
=
torch
.
from_numpy
(
x_training
)
X_Testing
=
torch
.
from_numpy
(
x_testing
)
if
torch
.
cuda
.
is_available
():
print
(
"
Using CUDA as it
'
s available
"
)
X_Training
=
X_Training
.
cuda
()
X_Testing
=
X_Testing
.
cuda
()
#split in training and validation -> already splitted during data preperation
b_Training
=
X_Training
.
shape
[
0
];
print
(
b_Training
)
b_Testing
=
X_Testing
.
shape
[
0
];
print
(
b_Testing
)
# fsplit = 0.1 -> already splitted during data preperation
# t = int((1-fsplit)*b); print(t)
batch_size
=
8192
;
# batch_size=1024
#train_tensors = TensorDataset(X[:b-t],X[:b-t]); print(train_tensors)
#test_tensors = TensorDataset(X[b-t:b],X[b-t:b]); print(test_tensors)
#create the data loaders
train_tensors
=
TensorDataset
(
X_Training
[:
b_Training
],
X_Training
[:
b_Training
]);
# print(len(train_tensors))
train_dataloader
=
DataLoader
(
train_tensors
,
batch_size
=
batch_size
,
shuffle
=
True
);
# print(len(train_dataloader))
test_tensors
=
TensorDataset
(
X_Testing
[:
b_Testing
],
X_Testing
[:
b_Testing
]);
# print(len(test_tensors))
test_dataloader
=
DataLoader
(
test_tensors
,
batch_size
=
batch_size
,
shuffle
=
True
);
# print(len(test_dataloader))
```
%% Output
[ 89. 87. 79. 88. 87. 89. 83. 93. 93. 93. 95. 93. 89. 90.
87. 85. 93. 91. 92. 91. 95. 91. 89. 93. 89. 90. 93. 89.
90. 86. 89. 89. 86. 87. 91. 93. 86. 89. 91. 87. 89. 90.
83. 91. 94. 93. 95. 101. 93. 79. 89. 94. 106. 87. 89. 95.
89. 95. 93. 91. 91. 90. 91. 93. 87. 97. 91. 91. 89. 91.
91. 87. 90. 93.]
[ 79 83 77 83 83 79 77 87 92 86 181 85 81 83 77 82 83 95
89 91 91 81 83 82 82 86 57 84 91 79 75 83 77 82 79 94
163 87 87 84 83 84 95 83 89 95 87 93 895 83 85 95 117 185
90 95 91 89 87 89 86 85 85 89 86 94 83 85 89 87 85 84
85 85]
Using CUDA as it's available
599999
399999
%% Cell type:code id:e42c878b-b3a0-4b00-8aba-9eb8a8f8f066 tags:
```
python
%%
time
# Define the autoencoder architecture
class
Autoencoder
(
nn
.
Module
):
def
__init__
(
self
):
super
().
__init__
()
self
.
encoder
=
nn
.
Sequential
(
nn
.
Linear
(
74
,
148
),
nn
.
ReLU
(),
nn
.
Linear
(
148
,
128
),
nn
.
ReLU
(),
nn
.
Linear
(
128
,
64
),
nn
.
ReLU
(),
nn
.
Linear
(
64
,
32
),
nn
.
ReLU
(),
nn
.
Linear
(
32
,
16
),
nn
.
ReLU
(),
nn
.
Linear
(
16
,
8
),
nn
.
ReLU
(),
nn
.
Linear
(
8
,
4
),
nn
.
ReLU
(),
nn
.
Linear
(
4
,
2
),
nn
.
ReLU
()
)
self
.
decoder
=
nn
.
Sequential
(
nn
.
Linear
(
2
,
4
),
nn
.
ReLU
(),
nn
.
Linear
(
4
,
8
),
nn
.
ReLU
(),
nn
.
Linear
(
8
,
16
),
nn
.
ReLU
(),
nn
.
Linear
(
16
,
32
),
nn
.
ReLU
(),
nn
.
Linear
(
32
,
64
),
nn
.
ReLU
(),
nn
.
Linear
(
64
,
128
),
nn
.
ReLU
(),
nn
.
Linear
(
128
,
148
),
nn
.
ReLU
(),
nn
.
Linear
(
148
,
74
),
nn
.
Sigmoid
()
)
def
forward
(
self
,
x
):
encoded
=
self
.
encoder
(
x
);
decoded
=
self
.
decoder
(
encoded
);
return
decoded
# Initialize the autoencoder
model
=
Autoencoder
()
# Define transform
#transform = transforms.Compose([
# transforms.Resize((64, 64)),
# transforms.ToTensor(),
#])
# Move the model to GPU
device
=
torch
.
device
(
'
cuda
'
if
torch
.
cuda
.
is_available
()
else
'
cpu
'
)
print
(
device
)
model
.
to
(
device
)
# Define the loss function and optimizer
criterion
=
nn
.
MSELoss
(
reduction
=
'
mean
'
)
# mean square of difference of input- and output layer
optimizer
=
optim
.
Adam
(
model
.
parameters
(),
lr
=
0.0001
,
weight_decay
=
1e-4
)
# Train the autoencoder
num_epochs
=
50
outputs
=
[]
trained
=
[]
losses
=
[]
for
epoch
in
range
(
num_epochs
):
for
data
in
train_dataloader
:
img
,
_
=
data
;
# print("img:",img); # print("_:", _)
img
=
img
.
to
(
device
);
output
=
model
(
img
);
# print("output:", output)
optimizer
.
zero_grad
()
loss
=
criterion
(
output
,
img
)
/
7400
;
# print("loss:", loss)
loss
.
backward
()
optimizer
.
step
()
trained
.
append
(
output
)
losses
.
append
(
loss
)
outputs
.
append
((
epoch
,
img
,
output
))
if
epoch
%
5
==
0
:
print
(
'
Epoch [{}/{}], Loss: {:.4f}
'
.
format
(
epoch
+
1
,
num_epochs
,
loss
.
item
()))
# Save the model
torch
.
save
(
model
.
state_dict
(),
'
autoencoder.pth
'
)
```
%% Output
cuda
Epoch [1/50], Loss: 1.0179
Epoch [6/50], Loss: 1.0057
Epoch [11/50], Loss: 1.0014
Epoch [16/50], Loss: 1.0028
Epoch [21/50], Loss: 1.0063
Epoch [26/50], Loss: 1.0072
Epoch [31/50], Loss: 1.0030
Epoch [36/50], Loss: 1.0087
Epoch [41/50], Loss: 1.0078
Epoch [46/50], Loss: 1.0043
CPU times: user 8min 30s, sys: 3.02 s, total: 8min 33s
Wall time: 8min 34s
%% Cell type:code id:fdec8545 tags:
```
python
losses
=
torch
.
tensor
(
losses
).
detach
().
cpu
().
numpy
()
# losses = losses.cpu().numpy()
# Defining the Plot Style
plt
.
figure
(
facecolor
=
'
white
'
)
plt
.
style
.
use
(
'
fivethirtyeight
'
)
plt
.
xlabel
(
'
Iterations / Epoch
'
)
plt
.
ylabel
(
'
Loss
'
)
plt
.
plot
((
losses
[:
350
]))
print
(
"
COMPLETED optimizing loss function.
"
)
```
%% Output
COMPLETED optimizing loss function.
%% Cell type:code id:98efdf90-ae7d-4e15-ac36-da7e6a961aa2 tags:
```
python
print
(
losses
[
40
])
#print(np.size(losses))
```
%% Output
1.0159957
%% Cell type:code id:5d644d42 tags:
```
python
# Test the autoencoder
num_epochs
=
50
outputs
=
[]
tested
=
[]
losses
=
[]
model_state_dict
=
torch
.
load
(
'
autoencoder.pth
'
);
model
=
Autoencoder
();
model
.
load_state_dict
(
model_state_dict
)
R
=
[];
model
.
cpu
();
with
torch
.
no_grad
():
for
b
,
xtest
in
enumerate
(
test_dataloader
):
img
,
_
=
xtest
;
img
=
img
.
cpu
();
# Apply the model
xpred
=
model
.
forward
(
img
)
# Update test loss & accuracy for the epoch
losstest
=
criterion
(
xpred
,
img
)
/
19000
losses
.
append
(
losstest
.
item
());
y
=
xpred
-
img
;
R
.
append
(
y
.
numpy
()
)
print
(
'
Batch [{}], Loss: {:.4f}
'
.
format
(
b
,
losstest
.
item
()))
```
%% Output
Batch [0], Loss: 1.0065
Batch [1], Loss: 1.0061
Batch [2], Loss: 1.0049
Batch [3], Loss: 1.0064
Batch [4], Loss: 1.0057
Batch [5], Loss: 1.0057
Batch [6], Loss: 1.0062
Batch [7], Loss: 1.0062
Batch [8], Loss: 1.0058
Batch [9], Loss: 1.0072
Batch [10], Loss: 1.0047
Batch [11], Loss: 1.0063
Batch [12], Loss: 1.0049
Batch [13], Loss: 1.0064
Batch [14], Loss: 1.0060
Batch [15], Loss: 1.0061
Batch [16], Loss: 1.0046
Batch [17], Loss: 1.0064
Batch [18], Loss: 1.0056
Batch [19], Loss: 1.0060
Batch [20], Loss: 1.0054
Batch [21], Loss: 1.0068
Batch [22], Loss: 1.0071
Batch [23], Loss: 1.0055
Batch [24], Loss: 1.0050
Batch [25], Loss: 1.0062
Batch [26], Loss: 1.0064
Batch [27], Loss: 1.0064
Batch [28], Loss: 1.0059
Batch [29], Loss: 1.0052
Batch [30], Loss: 1.0049
Batch [31], Loss: 1.0067
Batch [32], Loss: 1.0067
Batch [33], Loss: 1.0051
Batch [34], Loss: 1.0053
Batch [35], Loss: 1.0053
Batch [36], Loss: 1.0058
Batch [37], Loss: 1.0062
Batch [38], Loss: 1.0051
Batch [39], Loss: 1.0064
Batch [40], Loss: 1.0051
Batch [41], Loss: 1.0050
Batch [42], Loss: 1.0057
Batch [43], Loss: 1.0056
Batch [44], Loss: 1.0055
Batch [45], Loss: 1.0073
Batch [46], Loss: 1.0054
Batch [47], Loss: 1.0065
Batch [48], Loss: 1.0073
%% Cell type:code id:032fea41 tags:
```
python
losses
=
torch
.
tensor
(
losses
).
detach
().
cpu
().
numpy
()
print
(
losses
)
```
%% Output
[1.0064617 1.0061032 1.0048829 1.0064017 1.0057319 1.0056655 1.0062454
1.0061747 1.0057641 1.0072342 1.0046877 1.0062848 1.0049303 1.0063547
1.006006 1.006109 1.0045859 1.0064313 1.0056365 1.0059724 1.0054065
1.0068065 1.0070988 1.0054579 1.0049857 1.0061715 1.0063528 1.0063652
1.0058655 1.005199 1.0048867 1.0066928 1.00673 1.0050893 1.005252
1.0052563 1.0057722 1.0062329 1.0051069 1.0063674 1.0050957 1.0049974
1.0057102 1.0055721 1.0055089 1.0072767 1.0053504 1.0065398 1.0072845]
%% Cell type:code id:b470f379 tags:
```
python
# Defining the Plot Style
plt
.
figure
(
facecolor
=
'
white
'
)
plt
.
style
.
use
(
'
fivethirtyeight
'
)
plt
.
xlabel
(
'
Batch / Epoch
'
)
plt
.
ylabel
(
'
Loss
'
)
plt
.
plot
((
losses
[:
100
]))
print
(
"
COMPLETED optimizing loss function.
"
)
```
%% Output
COMPLETED optimizing loss function.
%% Cell type:raw id:b9a582bd-b093-4c0d-8e7e-22bfbf9b7abf tags:
for i in enumerate(img):
# print(i[1])
plt.imshow(i[0])
# Reshape the array for plotting
for i in enumerate(trained):
# print(i[1])
plt.imshow(i[0])
%% Cell type:raw id:c3fde6db-58ca-4f10-b6fb-dc81cf134d1f tags:
print(img[1]);
print(trained[1]);
print(xpred[1]);
%% Cell type:code id:1ecd9a86 tags:
```
python
x_predicted_percentage
=
xpred
.
numpy
();
x_predicted
=
x_predicted_percentage
*
img
[
1
].
numpy
();
print
(
x_predicted
)
```
%% Output
[[86.7538 88.747986 88.7403 ... 94.745834 90.75315 94.74665 ]
[86.7538 88.747986 88.7403 ... 94.745834 90.75315 94.74665 ]
[86.7538 88.747986 88.7403 ... 94.745834 90.75315 94.74665 ]
...
[86.7538 88.747986 88.7403 ... 94.745834 90.75315 94.74665 ]
[86.7538 88.747986 88.7403 ... 94.745834 90.75315 94.74665 ]
[86.7538 88.747986 88.7403 ... 94.745834 90.75315 94.74665 ]]
%% Cell type:code id:8fac20dd tags:
```
python
def
plotting_ADC
(
_event_number
,
_adc_raw
,
_adc_reconstructed
):
# Parameters
Event_raw
=
_adc_raw
;
Event_reconstructed
=
_adc_reconstructed
;
# Plotting Values
plot_values_channel
=
np
.
arange
(
np
.
size
(
Event_raw
));
# Plotting Paramters
# Plotting Parameters
plot_titel
=
"
Event Display
"
plt
.
figure
(
facecolor
=
'
white
'
)
# Plotting - normal
plt
.
plot
(
plot_values_channel
,
Event_raw
,
drawstyle
=
"
steps-post
"
,
label
=
"
raw signal
"
)
plt
.
plot
(
plot_values_channel
,
Event_reconstructed
,
drawstyle
=
"
steps-post
"
,
label
=
"
reconstructed
"
)
plt
.
title
(
plot_titel
)
plt
.
legend
(
loc
=
"
upper left
"
)
plt
.
xlabel
(
"
channel number
"
)
plt
.
ylabel
(
"
ADC value
"
)
#plt.grid()
plt
.
show
#plt.savefig('Event_comparison.eps', format='eps')
#plt.savefig('Event_comparison.png', format='png')
```
%% Cell type:code id:10a5cec0 tags:
```
python
Event_number
=
19
Event_raw
=
img
[
Event_number
].
numpy
();
print
(
Event_raw
)
Event_predicted
=
x_predicted
[
Event_number
];
print
(
np
.
round
(
Event_predicted
))
plotting_ADC
(
Event_number
,
Event_raw
-
Event_raw
,
Event_predicted
-
Event_raw
)
```
%% Output
[ 89. 87. 79. 85. 85. 84. 79. 87. 91. 86. 183. 87. 86. 86.
81. 88. 93. 93. 89. 91. 89. 89. 87. 89. 87. 87. 75. 87.
89. 85. 89. 90. 83. 89. 87. 92. 85. 91. 90. 85. 87. 88.
84. 111. 88. 95. 90. 86. 895. 83. 87. 95. 91. 191. 89. 95.
90. 98. 90. 89. 90. 91. 89. 89. 91. 93. 89. 89. 90. 89.
89. 91. 89. 93.]
[ 87. 89. 89. 90. 89. 90. 85. 93. 91. 89. 187. 90. 87. 91.
86. 91. 95. 91. 89. 91. 91. 93. 87. 95. 90. 91. 79. 89.
87. 89. 90. 93. 89. 91. 91. 93. 89. 94. 91. 93. 90. 94.
89. 94. 93. 93. 95. 90. 893. 89. 91. 94. 95. 194. 89. 95.
90. 95. 93. 93. 90. 91. 95. 95. 90. 95. 93. 95. 89. 95.
95. 95. 91. 95.]
%% Cell type:code id:9d53bf5e tags:
```
python
```
This diff is collapsed.
Click to expand it.
SCRIPT - Data Preparation_Summer Student Programm.ipynb
0 → 100644
+
1021
−
0
View file @
a805a9aa
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment