A neural network device, comprising: a first plurality of synapses configured to receive a first plurality of inputs and to generate therefrom a first plurality of outputs, wherein the first plurality of synapses comprises: a plurality of memory cells; a controller configured to: program each of the memory cells to one of a plurality of program states that includes more than two program states, read the memory cells using a read operation of applied voltages to the memory cells, wherein during the read operation, separations between adjacent ones of the program states vary based on frequencies of use of the program states in the plurality of memory cells, wherein for each of the plurality of program states, the controller is configured to: determine the frequency of use of the program state in the plurality of memory cells, and set the separation between the program state and an adjacent one of the program states based upon the determined frequency of use such that program states having higher frequencies of use have greater separations between adjacent ones of the program states than program states having lower frequencies of use; the plurality of memory cells are configured to generate the first plurality of outputs based upon the first plurality of inputs and the plurality of program states; and a first plurality of neurons configured to receive the first plurality of outputs. a first plurality of synapses configured to receive a first plurality of inputs and to generate therefrom a first plurality of outputs, wherein the first plurality of synapses comprises: a plurality of memory cells; a controller configured to: program each of the memory cells to one of a plurality of program states that includes more than two program states, read the memory cells using a read operation of applied voltages to the memory cells, wherein during the read operation, separations between adjacent ones of the program states vary based on frequencies of use of the program states in the plurality of memory cells, wherein for each of the plurality of program states, the controller is configured to: determine the frequency of use of the program state in the plurality of memory cells, and set the separation between the program state and an adjacent one of the program states based upon the determined frequency of use such that program states having higher frequencies of use have greater separations between adjacent ones of the program states than program states having lower frequencies of use; the plurality of memory cells are configured to generate the first plurality of outputs based upon the first plurality of inputs and the plurality of program states; and a plurality of memory cells; a controller configured to: program each of the memory cells to one of a plurality of program states that includes more than two program states, read the memory cells using a read operation of applied voltages to the memory cells, wherein during the read operation, separations between adjacent ones of the program states vary based on frequencies of use of the program states in the plurality of memory cells, wherein for each of the plurality of program states, the controller is configured to: determine the frequency of use of the program state in the plurality of memory cells, and set the separation between the program state and an adjacent one of the program states based upon the determined frequency of use such that program states having higher frequencies of use have greater separations between adjacent ones of the program states than program states having lower frequencies of use; program each of the memory cells to one of a plurality of program states that includes more than two program states, read the memory cells using a read operation of applied voltages to the memory cells, wherein during the read operation, separations between adjacent ones of the program states vary based on frequencies of use of the program states in the plurality of memory cells, wherein for each of the plurality of program states, the controller is configured to: determine the frequency of use of the program state in the plurality of memory cells, and set the separation between the program state and an adjacent one of the program states based upon the determined frequency of use such that program states having higher frequencies of use have greater separations between adjacent ones of the program states than program states having lower frequencies of use; determine the frequency of use of the program state in the plurality of memory cells, and set the separation between the program state and an adjacent one of the program states based upon the determined frequency of use such that program states having higher frequencies of use have greater separations between adjacent ones of the program states than program states having lower frequencies of use; the plurality of memory cells are configured to generate the first plurality of outputs based upon the first plurality of inputs and the plurality of program states; and a first plurality of neurons configured to receive the first plurality of outputs.