Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save ltiao/53ced15f7902ee1a400b70d3d1dd85d8 to your computer and use it in GitHub Desktop.
Save ltiao/53ced15f7902ee1a400b70d3d1dd85d8 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "d3fb19ad",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2023-03-21 15:13:36.314055: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.\n",
"2023-03-21 15:13:36.345944: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n",
"To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n",
"2023-03-21 15:13:36.894793: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT\n"
]
}
],
"source": [
"import tensorflow as tf\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"from tensorflow.keras.metrics import Mean, RootMeanSquaredError"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "7f25016a",
"metadata": {},
"outputs": [],
"source": [
"n = 1024\n",
"batch_size = 32\n",
"\n",
"default_float = \"float64\"\n",
"\n",
"seed = 8888\n",
"random_state = np.random.RandomState(seed)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "c44b233c",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.49622001339864374"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"a = random_state.rand(n)\n",
"a.mean()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "062e3a7e",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.4962200133986438"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# done naively\n",
"acc = 0.\n",
"for i in range(n // batch_size):\n",
" acc += a[batch_size*i:batch_size*(i+1)].sum()\n",
"acc / n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "984be4cc",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2023-03-21 15:13:37.816475: I tensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:996] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355\n",
"2023-03-21 15:13:37.832220: I tensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:996] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355\n",
"2023-03-21 15:13:37.832342: I tensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:996] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355\n",
"2023-03-21 15:13:37.834784: I tensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:996] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355\n",
"2023-03-21 15:13:37.834977: I tensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:996] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355\n",
"2023-03-21 15:13:37.835050: I tensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:996] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355\n",
"2023-03-21 15:13:38.196353: I tensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:996] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355\n",
"2023-03-21 15:13:38.196484: I tensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:996] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355\n",
"2023-03-21 15:13:38.196607: I tensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:996] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355\n",
"2023-03-21 15:13:38.196679: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1635] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 6036 MB memory: -> device: 0, name: NVIDIA GeForce RTX 3070 Laptop GPU, pci bus id: 0000:01:00.0, compute capability: 8.6\n"
]
},
{
"data": {
"text/plain": [
"<tf.Tensor: shape=(), dtype=float64, numpy=0.49622001339864374>"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m = Mean(dtype=default_float)\n",
"m(a)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "7c6f928f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<tf.Tensor: shape=(), dtype=float64, numpy=0.49622001339864374>"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m.result()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "655f73c8",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<tf.Tensor: shape=(), dtype=float64, numpy=0.49622001339864374>"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m.reset_state()\n",
"m.update_state(a)\n",
"m.result()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "38ad8188",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<tf.Tensor: shape=(), dtype=float64, numpy=0.4962200133986438>"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m.reset_state()\n",
"for i in range(n // batch_size):\n",
" m.update_state(a[batch_size*i:batch_size*(i+1)])\n",
"m.result()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "4549ab83",
"metadata": {},
"outputs": [],
"source": [
"y_true = random_state.randn(n)\n",
"y_pred = y_true + 0.5 * random_state.randn(n)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "32cff3cd",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots()\n",
"\n",
"ax.scatter(y_pred, y_true)\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "0395be31",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<tf.Tensor: shape=(), dtype=float64, numpy=0.5095865465347981>"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m = RootMeanSquaredError(dtype=default_float)\n",
"m(y_pred, y_true)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "049b810f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<tf.Tensor: shape=(), dtype=float64, numpy=0.5095865465347981>"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tf.sqrt(tf.reduce_mean(tf.square(y_pred - y_true), axis=None))"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "e7d4b573",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<tf.Tensor: shape=(), dtype=float64, numpy=0.5095865465347981>"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m.reset_state()\n",
"for i in range(n // batch_size):\n",
" y_pred_batch = y_pred[batch_size*i:batch_size*(i+1)]\n",
" y_true_batch = y_true[batch_size*i:batch_size*(i+1)]\n",
" m.update_state(y_pred_batch, y_true_batch)\n",
"m.result()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"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.10.10"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment