A computer-implemented method of generating an output image having an output resolution of N pixels x N pixels, each pixel in the output image having a respective color value for each of a plurality of color channels, the method comprising: obtaining a low-resolution version of the output image; and upscaling the low-resolution version of the output image to generate the output image having the output resolution of N pixels x N pixels by performing the following operations: obtaining a current version of the output image having a current K pixels x K pixels resolution; processing the current version of the output image using a set of convolutional neural networks that are specific to the current resolution to generate an updated version of the output image having a 2K pixels x 2K pixels resolution; repeating the obtaining and processing operations using a current version of the output image having a current 2K pixels x 2K pixels resolution until an image with an output resolution of N pixels x N pixels is obtained; wherein the set of convolutional neural networks that are specific to the current resolution comprises: a first convolutional neural network that is configured to receive a first input comprising the current version of the output image and to generate a first output image that includes columns of pixels from a K pixels × 2K pixels version of the output image, and a second convolutional neural network that is configured to receive a second input comprising the K pixels x 2K pixels version of the output image and to generate a second output image that includes rows of pixels from the 2K pixels x 2K pixels version of the output image. obtaining a low-resolution version of the output image; and upscaling the low-resolution version of the output image to generate the output image having the output resolution of N pixels x N pixels by performing the following operations: obtaining a current version of the output image having a current K pixels x K pixels resolution; processing the current version of the output image using a set of convolutional neural networks that are specific to the current resolution to generate an updated version of the output image having a 2K pixels x 2K pixels resolution; repeating the obtaining and processing operations using a current version of the output image having a current 2K pixels x 2K pixels resolution until an image with an output resolution of N pixels x N pixels is obtained; obtaining a current version of the output image having a current K pixels x K pixels resolution; processing the current version of the output image using a set of convolutional neural networks that are specific to the current resolution to generate an updated version of the output image having a 2K pixels x 2K pixels resolution; repeating the obtaining and processing operations using a current version of the output image having a current 2K pixels x 2K pixels resolution until an image with an output resolution of N pixels x N pixels is obtained; a first convolutional neural network that is configured to receive a first input comprising the current version of the output image and to generate a first output image that includes columns of pixels from a K pixels × 2K pixels version of the output image, and a second convolutional neural network that is configured to receive a second input comprising the K pixels x 2K pixels version of the output image and to generate a second output image that includes rows of pixels from the 2K pixels x 2K pixels version of the output image. <EOS>