python - CNN 与 keras 预测能量

标签 python keras regression

我是机器学习和 keras 库的新手,我制作了一个用于回归的 CNN 代码,如下所示。

%matplotlib inline
from __future__ import division
import numpy as np
from numpy.random import rand
import matplotlib.pyplot as plt


def initial_spin_state(N):
    state = np.random.choice((0.11111, 0.99999), (N, N))
    return state


def metropolis_algorithm(config, beta):

    N = len(config)

    for i in range(N):
        for j in range(N):

            a = np.random.randint(0, N)
            b = np.random.randint(0, N)
            s = config[a, b]
            near=config[(a+1)%N,b] + config[a,(b+1)%N] + config[(a-1)%N,b] + config[a,(b-1)%N]

            delta = 2 * s *near
            if delta < 0:
                s *= -1
            elif rand() < np.exp(-delta * beta):
                s *= -1
            config[a, b] = s

    return config

def get_energy(config):
    energy = 0
    N = len(config)
    for i in range(N):
        for j in range(N):
            S = config[i, j]
            near = config[(i+1)%N, j] + config[i,(j+1)%N] + config[(i-1)%N, j] + config[i,(j-1)%N]
            energy += near*S

    return energy


x_train = []
y_train = []
for i in range(50000):

    config = initial_spin_state(16)
    energy = get_energy(config)

    x_train.append(config)
    y_train.append(energy)

x_train = np.array(x_train)
y_train = np.array(y_train)

print(x_train.shape)
print(y_train.shape)


x_test = []
y_test = []
for j in range(20000):

    config = initial_spin_state(16)
    energy = get_energy(config)

    x_test.append(config)
    y_test.append(energy)

x_test = np.array(x_test)
y_test = np.array(y_test)

print(x_test.shape)
print(y_test.shape)


x_train = x_train.reshape(50000, 16, 16, 1)
x_test = x_test.reshape(20000, 16, 16, 1)
print(x_train.shape)
print(x_test.shape)

import numpy as np
import tensorflow as tf
tf.logging.set_verbosity(tf.logging.ERROR)
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
from keras.optimizers import Adadelta
from keras.regularizers import l2


model = Sequential()
model.add(Conv2D(32, (2, 2), input_shape = (16, 16, 1), activation = 'relu'))
model.add(MaxPooling2D(2,2))


model.add(Conv2D(16, (2, 2), activation = 'relu'))
model.add(MaxPooling2D(2,2))

model.add(Flatten())
model.add(Dense(512, activation = 'relu'))
#model.add(Dense(1024, activation = 'relu'))
model.add(Dense(1))

np.random.seed(0)
model.summary()
model.compile(loss = "mse", metrics = ['accuracy'], optimizer = 'adam')



%%time
hist = model.fit(x_train, y_train, epochs = 200, batch_size = 500,
                validation_data = (x_test, y_test), verbose = 2)


import matplotlib.pyplot as plt
plt.plot(hist.history['acc'], '_b', label = "training")
plt.plot(hist.history['val_acc'], 'r:', label = "test")
plt.legend()
plt.grid("on")
plt.show()


此代码用于图像输入,以及连续能量值输出。

因此,如果我将图像(正在配置)放入 CNN,它应该预测该配置的能量。

问题是..

当我训练 CNN 时,训练损失和验证损失下降得非常缓慢。

当然,训练精度和验证精度的提高非常缓慢。

并且,有时仅提高了训练准确度,而没有提高验证准确度。

天才们..我的代码出了什么问题?

请教我

最佳答案

首先,由于您正在做回归问题,我认为使用 acc 作为指标不是一个好主意,相反,您可能会考虑使用平均绝对误差mae 作为你的矩阵。

您使用的损失是mse(平均平方误差),因此该值会非常大,特别是当您没有标准化y值。但是,在运行您提供的代码约 25 个周期后,验证损失 降至 290.xx,其中 13.xxmae (而且它还没有收敛)。我尝试使用你的模型来预测一些验证数据,它工作得很好。也许您应该在认为出现问题之前测试您的模型。

关于python - CNN 与 keras 预测能量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57705470/

相关文章:

java - 对GWT的不同后端的反馈

python - Keras 中的条件批量归一化

python - 如何将 report_tensor_allocations_upon_oom 添加到 Keras 中的 RunOptions

python - 在 Python 中找到适合数据的多项式

python - LinearRegression() 和 Ridge(alpha=0) 的区别

matlab - Fminsearch Matlab(非线性回归)

python - 使用 CFFI 在 Python 中创建 CData 类型的缓冲区

python - PyTorch 中一组向量之间的成对相似度矩阵

python - 我在logging.py中的flask源上遇到了一些问题

tensorflow - 使用 keras 和 tensorflow "You must feed a value for placeholder tensor ' input_ 1' with dtype float"