Skip to content

Instantly share code, notes, and snippets.

@quantshah
Created October 17, 2019 06:20
Show Gist options
  • Save quantshah/a56aaeca05f2bdae4cf8931a0d5b2781 to your computer and use it in GitHub Desktop.
Save quantshah/a56aaeca05f2bdae4cf8931a0d5b2781 to your computer and use it in GitHub Desktop.
Machine Learning Phases of Matter
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Project II: Machine Learning the Ising Phase Transition\n",
"## Learning from data [TIF285], Chalmers, Fall 2019\n",
"\n",
"#### Christian Forssén and Shahnawaz Ahmed, Chalmers\n",
"Last revised: 16-Oct-2019 by Christian Forssén [christian.forssen@chalmers.se]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Instructions"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- See deadline on the course web page\n",
"- This project is performed in groups of two students. \n",
"- The second part of the project is optional and only gives extra points. See examination rules on the course web page.\n",
"- Hand-in your written report via Canvas."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Written report\n",
"- Page limit: 6 pages (excluding title page and list of references). 3 extra pages are allowed when doing also the optional extra task.\n",
"- Give a short description of the nature of the problem and the methods you have used.\n",
"- Include your results either in figure form or in a table. All tables and figures should have relevant captions and labels on the axes.\n",
"- Try to give an interpretation of you results.\n",
"- Upload the source code of your program as a separate file (.ipynb or .py). Comment your program properly."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Import modules\n",
"\n",
"We need TensorFlow 2 for parts of this project. Make sure to update your `tif285-env` environment using the following command (making sure that you have the most recent version of the `environment.yml` file that includes `tensorflow` on the last line):\n",
"\n",
"```\n",
"conda env update -f environment.yml\n",
"```\n",
"\n",
"Please note that Keras has become a part of Tensorflow in the latest release. Therefore many of the online TensorFlow tutorials which use Keras can now directly use imports such as \n",
"\n",
"```\n",
"from tensorflow.keras.models import Sequential\n",
"```\n",
"\n",
"instead of the earlier:\n",
"\n",
"```\n",
"from keras.models import Sequential\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline\n",
"\n",
"import os\n",
"import time\n",
"import pickle\n",
"from multiprocessing import Pool as ThreadPool\n",
"\n",
"import numpy as np\n",
"\n",
"from scipy.optimize import curve_fit\n",
"import matplotlib.pyplot as plt\n",
"from sklearn.model_selection import train_test_split\n",
"\n",
"from tensorflow import keras\n",
"from tensorflow.keras.models import Sequential\n",
"from tensorflow.keras.layers import Dense, Dropout, Flatten\n",
"from tensorflow.keras.layers import Conv2D, MaxPooling2D\n",
"\n",
"from tqdm import tqdm\n",
"\n",
"np.random.seed(42)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Background\n",
"\n",
"The Ising model is arguably the most famous model in (condensed matter) physics. It is described by the simple Hamiltonian\n",
"\n",
"$$\n",
"H=−J \\sum_{\\langle i,j \\rangle} s_i s_j.\n",
"$$\n",
"\n",
"Here, the $s_i=\\{−1,1\\}$ are classical, binary magnetic moments (spins) sitting on a two-dimensional square lattice and the $\\langle i,j \\rangle$ indicates that only interactions betweens neighboring spins are taken into account. For simplicity, we will set $J=1$."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Most importantly, the Ising model shows a phase transition between a paramagnetic and a ferromagnetic phase as a function of temperature. The critical temperature $T_c$ at which this change of magnetic character occurs has been calculated exactly by Lars Onsager. He found\n",
"\n",
"$$\n",
"T_c = \\frac{2}{\\log \\left( 1 + \\sqrt{2} \\right) }\n",
"$$"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Critical temperature: Tc = 2.2692\n"
]
}
],
"source": [
"Tc = 2 / np.log(1+np.sqrt(2))\n",
"print(f\"Critical temperature: Tc = {Tc:.4f}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In this project we aim to reproduce this result (roughly) using increasingly sophisticated neural networks. You will use\n",
"1. a simple binary classifier (single neuron) that you implement yourself.\n",
"1. a relatively simple neural network (one hidden layer with 100 neurons) implemented using keras / tensorflow.\n",
"1. a convolutional neural network\n",
"1. (extra task) a Bayesian neural network\n",
"\n",
"At the end, the results that you obtain made it all the way into a Nature Physics publication just a few years ago: [Nature Physics (2017) 13, 431–434](https://www.nature.com/articles/nphys4035)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We will start by quickly simulating the Ising model using the Monte Carlo method to obtain representative sets of spin configurations for a bunch of temperatures. Afterwards, we do not take the traditional approach of inspecting the magnetization, the order parameter of the transition, and its susceptibility. Instead we use supervised learning to train a Neural Network to automagically learn the transition temperature."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Monte Carlo simulation\n",
"The Monte Carlo method for the Ising model is very straightforward: take a random configuration of spins to begin with and propose individual spin flips until you fall asleep. To decide whether a spin should be flipped we use the Metropolis criterium\n",
"$$\n",
"p=\\min \\left( 1, e^{-\\beta\\Delta E} \\right)\n",
"$$\n",
"where $\\Delta E = E′−E$ is the energy difference between the new (spin flipped) and the old configuration according to $H$ above and $\\beta = 1/T$ is the inverse of the temperature $T$. Since $\\Delta E$ only depends on the local environment of the spin to be flipped (nearest neighbors), we can evaluate it locally. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Generate spin configurations and study the phase transition\n",
"\n",
"In the python file attached with this notebook we have the definition of a `Lattice` class which can be used to generate a 2D lattice for `N` spins at a temperature `T`. Here, we simply import the `Lattice` class and use the `step` method to generate a lattice after a few hundred iterations to simulate a thermalization of the lattice. \n",
"\n",
"At every iteration, we select $N^2$ random points to try a flip attempt. A flip attempt consists of checking the change in energy due to a flip. If it is negative or less than $e^{-E/(k_b T)}$, then perform the flip. After a few steps the lattice with thermalize.\n",
"\n",
"\n",
"\n",
"#### *You need the `lattice.py` file in the same directory to get this to work which contains the definition of `Lattice`*\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"from lattice import Lattice"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[ 1 1 1 1 -1 -1 -1 -1 -1 1]\n",
" [ 1 1 1 1 1 1 -1 -1 -1 1]\n",
" [ 1 1 1 -1 -1 -1 1 -1 -1 1]\n",
" [ 1 1 1 -1 1 1 1 1 -1 1]\n",
" [ 1 1 1 1 1 -1 1 1 -1 -1]\n",
" [ 1 1 1 -1 -1 1 -1 1 1 -1]\n",
" [ 1 1 -1 -1 -1 -1 -1 1 -1 -1]\n",
" [ 1 1 1 1 -1 -1 1 -1 1 1]\n",
" [ 1 -1 1 1 1 1 -1 -1 1 1]\n",
" [ 1 1 1 1 -1 1 1 1 1 1]]\n"
]
}
],
"source": [
"# Initialize a lattice\n",
"lat = Lattice(N=10, T=4.5)\n",
"\n",
"# Make 30 iterations (N**2 spin flip attempts)\n",
"for i in range(30):\n",
" lat.step()\n",
"\n",
"print(lat.lattice) # (or even `print lat` to use the convenient repr)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Illustrate some spin configurations, and plot macroscopic quantities as a function of temperature"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"6it [00:05, 1.09it/s]\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 6 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# 10 x 10 lattice\n",
"# six temperatures, 500 thermalization iterations\n",
"# Plot the spin configurations for varying temperatures.\n",
"# Display the magnetization too\n",
"\n",
"nrows, ncols = 2, 3\n",
"fig, axs = plt.subplots(nrows, ncols)\n",
"fig.subplots_adjust(wspace=0.6)\n",
"\n",
"for (ip, T) in tqdm(enumerate([5.0, 4.0, 3.0, 2.3, 2.0, 1.0])):\n",
" lat = Lattice(N=10,T=T)\n",
" for k in range(500):\n",
" lat.step()\n",
"\n",
" idx = ip // ncols, ip % ncols\n",
"\n",
" axs[idx].matshow(lat.lattice,cmap=plt.cm.gray_r)\n",
" axs[idx].set_title(f\"T = {T:.1f}, $m$={lat.get_avg_magnetization():.1f}\")\n",
"\n",
" axs[idx].get_xaxis().set_visible(False)\n",
" axs[idx].get_yaxis().set_visible(False)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 60/60 [01:19<00:00, 1.32s/it]\n"
]
}
],
"source": [
"# 10 x 10 lattice\n",
"# 60 temperatures, 500 thermalization iterations\n",
"\n",
"# For a temperature range, thermalize a lattice, then\n",
"# take a few hundred steps, recording energy and magnetization.\n",
"# Store the means to plot next.\n",
"# This takes about 60s with one modern core.\n",
"\n",
"# Thermalization and measurement steps\n",
"ntherm = 500\n",
"nmeasure = 200\n",
"\n",
"# points = array with (T, mean(E), abs(mean(M)), var(E))\n",
"# with the mean and variance evaluated for a list of many temperatures\n",
"points = []\n",
"# Storing nmeasure / nsparse data points\n",
"nsparse = 10\n",
"# points_full = array with (T, E, abs(M))\n",
"# for several different configurations per temperature\n",
"points_full=[]\n",
"for T in tqdm(np.arange(4.0,1.0,-0.05)):\n",
" lat = Lattice(N=10,T=T)\n",
" for _ in range(ntherm):\n",
" lat.step()\n",
" Es = []\n",
" Ms = []\n",
"\n",
" for istep in range(nmeasure): \n",
" lat.step()\n",
" Es.append(lat.get_energy())\n",
" Ms.append(lat.get_avg_magnetization())\n",
" if (istep%nsparse==0):\n",
" points_full.append((T,Es[-1],np.abs(Ms[-1]))) \n",
" Es = np.array(Es)\n",
" Ms = np.array(Ms)\n",
" points.append((T,Es.mean(),np.abs(Ms.mean()),Es.var()))\n",
"points = np.array(points)\n",
"points_full = np.array(points_full)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x576 with 3 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Plot the energy, magnetization, and heat capacity vs temperature\n",
"\n",
"fig, axs = plt.subplots(3,1,sharex=True,figsize=(8,8))\n",
"\n",
"axs[0].plot(points[:,0],points[:,1], label=\"E\")\n",
"axs[0].set_ylabel(\"Energy\")\n",
"axs[0].set_title(\"Energy vs Temperature [L = 10]\")\n",
"\n",
"axs[1].plot(points[:,0],points[:,2], label=\"$|m|$\")\n",
"axs[1].set_ylabel(\"$|m|$\")\n",
"axs[1].set_title(\"Magnetization vs Temperature [L = 10]\")\n",
"\n",
"# heat capacity\n",
"# C = var(E) / ( k_B T**2)\n",
"heat_capacity = points[:,3] / (points[:,0]**2)\n",
"axs[2].plot(points[:,0],heat_capacity, label=\"$C$\")\n",
"axs[2].set_xlabel(\"T\")\n",
"axs[2].set_ylabel(\"$C$\")\n",
"axs[2].set_title(\"Heat capacity vs Temperature [L = 10]\")\n",
"\n",
"for ax in axs:\n",
" ax.axvline(x=Tc,linestyle='-', color=\"orange\",linewidth=2.0, label=\"$T_c$ ({:.3f})\".format(Tc))\n",
" ax.legend(loc=\"best\", numpoints=1)\n",
" ax.grid(True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Energy vs magnetization\n",
"Blue data is low temperature ($<T_c$) and red data is high temperature ($>T_c$)."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"high_T = points_full[:,0]>Tc\n",
"low_T = points_full[:,0]<Tc\n",
"\n",
"E_M_high = points_full[high_T][:,1:]\n",
"E_M_low = points_full[low_T][:,1:]\n",
"\n",
"fig, ax = plt.subplots(1,1)\n",
"ax.scatter(E_M_high[:,0],E_M_high[:,1],c='r')\n",
"ax.scatter(E_M_low[:,0],E_M_low[:,1],c='b')\n",
"ax.set_xlabel(\"$E$\")\n",
"ax.set_ylabel(\"$|m|$\");"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Task 1: Single neuron binary classifier"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Create a binary classifier that can take $(E,|m|)$ as input data and predict a binary label (0=below Tc, 1=above Tc)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Hints:\n",
"* Build your own binary classifier from a single neuron. Study the lecture notes and the exercise on logistic regression / neural networks.\n",
"* Normalize the data before training / testing (mean=0, standard deviation=1).\n",
"* Split into 70 % training data and 30% test data.\n",
"* Use weight decay alpha=1.0, learning parameter eta=0.01\n",
"* A rather large number of training iterations will be needed."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**How well does it perform? Plot the decision boundary.**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Neural network classifiers based on spin configurations"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You should now use a neural network to learn the phase transition based on images of the spin configurations.\n",
"We will use special tricks to generate new data for free from the configurations that we have generated (e.g. by flipping all spins, and by mirroring)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Generate spin configurations"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
">>> Loaded from ising_config_data_big.pkl\n"
]
}
],
"source": [
"# Use 6 threads to run some lattice evolutions\n",
"# With current parameters, this took a minute or two on an i7\n",
"# Dump out the lattice configurations/temperatures to a file\n",
"# and just load it if the file already exists, since this\n",
"# is a CPU intensive cell.\n",
"\n",
"fname = \"ising_config_data_big.pkl\"\n",
"\n",
"def get_lattices(T, N=10, Nlattices=25, Nthermal=200):\n",
" \"\"\"\n",
" Generates a set of lattices at a given temperature\n",
" \n",
" Args:\n",
" T (float): temperature of the lattice\n",
" N (int): the lattice size\n",
" Nlattices (int): the number of lattices to generate\n",
" Nthermal (int): the number of steps to simulate thermalization\n",
" \"\"\"\n",
" lattices = []\n",
" for _ in range(Nlattices):\n",
" lat = Lattice(N=N,T=T)\n",
" for _ in range(Nthermal):\n",
" lat.step()\n",
" lattices.append(lat.lattice)\n",
" return round(T, 4), lattices\n",
"\n",
"if not os.path.exists(fname):\n",
" pool = ThreadPool(6)\n",
" Ts = np.arange(5.0,1.0,-0.1)\n",
" d_data = {}\n",
" for T, lattices in pool.imap_unordered(get_lattices, Ts):\n",
" print(T)\n",
" d_data[T] = lattices\n",
"\n",
" with open(fname,\"wb\") as fhout:\n",
" pickle.dump(d_data,fhout)\n",
" print(f\">>> Dumped to {fname}\")\n",
"\n",
"else:\n",
" d_data = pickle.load(open(fname,\"rb\"))\n",
" print(\">>> Loaded from {}\".format(str(fname)))"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [],
"source": [
"# make vector of input matrices, vector of temperatures\n",
"X_data = []\n",
"y_data = []\n",
"T_data = []\n",
"\n",
"for T,configs in d_data.items():\n",
" for config in configs:\n",
" # flip spins to double dataset keeping E same\n",
" # this is also needed so ML algorithm doesn't learn\n",
" # to prefer one magnetization sign over another\n",
" # also make truth labels (0 is low T phase, 1 is high T phase)\n",
" # and also mirror lattice horizontally/vertically to get free data\n",
" target = 0\n",
" if T > Tc:\n",
" target = 1\n",
" \n",
" X_data.append(config)\n",
" X_data.append(np.flip(config,0))\n",
" X_data.append(np.flip(config,1))\n",
" X_data.append(-config)\n",
" X_data.append(-np.flip(config,0))\n",
" X_data.append(-np.flip(config,1))\n",
" \n",
" for _ in range(6):\n",
" T_data.append(T)\n",
" y_data.append(target)\n",
"\n",
"\n",
"X_data = np.array(X_data)\n",
"y_data = np.array(y_data)\n",
"T_data = np.array(T_data)\n",
"\n",
"# convert spin matrices from -1,1 to 0,1\n",
"X_data = 0.5*(X_data+1)\n",
"\n",
"# Thus, our training and test sets will consist of \n",
"# the lattice images and the targets will be 0 or 1.\n",
"# If the lattice is at low (T<Tc) or high (T>Tc) temperature\n",
"# It's up to the NN / CNN to learn the concept of temperature/magnetization/etc."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We implement two different ways to split our data in training and test sets:\n",
"\n",
"1. Randomly\n",
"1. Using only spin configurations at very high and very low temperatures as training data\n",
"\n",
"In the second approach our ultimate goal will be to see if we can correctly predict the phase for all intermediate temperatures. "
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"# function to split the data\n",
"def split_data(X_data, y_data, T_data, Thi=4.7, Tlo=1.3, test_size=0,random_state=42):\n",
" \"\"\"\n",
" Splits the data into train and test sets according to the settings.\n",
" \n",
" Either using sklearn train_test_split (test_size). \n",
" Or, alternatively, using T>Thi and T<Tlo data as training data and Tlo < T < Thi as predictions/test.\n",
" \"\"\"\n",
" if test_size:\n",
" print(f\"Using sklearn to split data. Test size: {test_size*100:}%\")\n",
" X_train, X_test, y_train, y_test, T_train, T_test = \\\n",
" train_test_split(X_data, y_data, T_data, test_size=test_size, random_state=random_state)\n",
" elif (Thi and Tlo):\n",
" print(f\"Using T>{Thi} and T<{Tlo} as training data.\")\n",
" train_set = np.logical_or(T_data>=Thi,T_data<=Tlo)\n",
" test_set = np.logical_not(train_set)\n",
" X_train = X_data[train_set]\n",
" X_test = X_data[test_set]\n",
" y_train = y_data[train_set]\n",
" y_test = y_data[test_set]\n",
" T_train = T_data[train_set]\n",
" T_test = T_data[test_set]\n",
" else:\n",
" print(\"No rule to split data.\")\n",
" return None\n",
" \n",
" print(f\"...Training samples: {X_train.shape[0]}\")\n",
" print(f\"...Testing samples: {X_test.shape[0]}\")\n",
" return(X_train, X_test, y_train, y_test, T_train, T_test)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Task 2: Tensorflow neural network with a single hidden layer\n",
"\n",
"1. Implement a neural network with a single hidden layer using tensorflow.\n",
"1. Flatten the 10x10 input images into arrays of length 100.\n",
"1. Use random splitting of the data (70% for training)\n",
"\n",
"Study in particular:\n",
"* What is the accuracy of predictions on the training / test data?\n",
"* Try to predict the critical temperature\n",
"\n",
"*Hint*: Plot the average predictions for lattices in the test set at different temperatures. The point at which the prediction passes through 0.5 is the critical temperature. I.e., at a phase transition, the CNN is confused about what phase the system is in. So we fit a sigmoid to the points and use this to estimate the crossing point (`Tc_fit`)"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Using sklearn to split data. Test size: 30.0%\n",
"...Training samples: 4200\n",
"...Testing samples: 1800\n"
]
}
],
"source": [
"X_train, X_test, y_train, y_test, T_train, T_test = split_data(X_data, y_data, T_data,test_size=0.3)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### A note about the output encoding, loss function and number of outputs\n",
"\n",
"If you check the target `y_train`, you notice that we have an `array([0, 1, 1, ..., 0, 0, 1])` representing the phases. This represents a binary classification problem where we expect the output of the final layer of the network to give a 1/0 output. In particular, if the final neuron has a sigmoid activation, it will give outputs very close to 0/1 as `array([0.01, 0.99, 0.95, ..., 0.2, 0.1, 0.86])`.\n",
"\n",
"While this works for a binary classification problem, if you have more than two classes as output, e.g., {\"red\", \"green\", \"yellow\"}, this simple 1/0 encoding does not work and you need to have a one-hot encoding:\n",
"\n",
"red = [1, 0, 0]\n",
"green = [0, 1, 0]\n",
"yellow = [0, 0, 1]\n",
"\n",
"In this case, think about how many neurons you should have in your output layer. You need to be also careful about the loss function you choose in this case."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### One hot encoding with keras\n",
"\n",
"If you do choose a one-hot encoding then you can use the following functionality in `keras`\n",
"\n",
"```\n",
"keras.utils.to_categorical(y_train, 2)\n",
"```\n",
"\n",
"where the 2 represents that you have two classes in your y_train."
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
"y_train = keras.utils.to_categorical(y_train, 2)\n",
"y_test = keras.utils.to_categorical(y_test, 2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Task 3: Convolutional neural network (CNN) \n",
"Now use a convolutional neural network (CNN) instead. Those are optimal for working with images.\n",
"\n",
"1. Implement a CNN with several hidden layers using tensorflow.\n",
"1. Now we will use only low- and high-temperature configurations as training data.\n",
"\n",
"Study in particular:\n",
"* What is the accuracy of predictions on the training / test data?\n",
"* Try to predict the critical temperature\n"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Using T>4.7 and T<1.3 as training data.\n",
"...Training samples: 1050\n",
"...Testing samples: 4950\n"
]
}
],
"source": [
"X_train, X_test, y_train, y_test, T_train, T_test = split_data(X_data, y_data, T_data, Thi=4.7, Tlo=1.3)"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [],
"source": [
"# prepare for CNN input\n",
"img_rows, img_cols = 10, 10\n",
"X_train = X_train.reshape(X_train.shape[0], img_rows, img_cols, 1)\n",
"X_test = X_test.reshape(X_test.shape[0], img_rows, img_cols, 1)\n",
"\n",
"input_shape = (img_rows, img_cols, 1)\n",
"\n",
"y_train = keras.utils.to_categorical(y_train, 2)\n",
"y_test = keras.utils.to_categorical(y_test, 2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Task 4: Understanding the neural network (extra)\n",
"Description to be added."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Task 5: A simple Bayesian neural network (extra)\n",
"Description to be added."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"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.7.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment