Модель TensorFlow не проводит никаких тренировок - PullRequest
1 голос
/ 22 октября 2019

Я тренирую простую модель машинного обучения, которая использует одномерное описание физической системы (502 элемента) и прогнозирует общую энергию (1 элемент). Поскольку я новичок в TensorFlow, я использовал простую плотную нейронную сеть с двумя скрытыми слоями по 64 нейрона каждый:

Model: "total_energy"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
charge_density_x_max (InputL [(None, 502)]             0         
_________________________________________________________________
hidden_1 (Dense)             (None, 64)                32192     
_________________________________________________________________
hidden_2 (Dense)             (None, 64)                4160      
_________________________________________________________________
dense (Dense)                (None, 1)                 65        
=================================================================
Total params: 36,417
Trainable params: 36,417
Non-trainable params: 0
_________________________________________________________________

Это мой исходный код для обучения, оценки и прогнозирования:

# imports
import os
import ast
import numpy as np
import pandas as pd
import tensorflow as tf
import matplotlib.pyplot as plt

# load the dataset from the csv file
data = pd.read_csv('1e_data.csv')

# load in the data
x_train = np.zeros(shape=(600, 502))
x_test = np.zeros(shape=(400, 502))
y_train = np.zeros(shape=(600))
y_test = np.zeros(shape=(400))
for i in range(0, 1000):
    if i < 600:
        x_train[i,:] = np.append(np.array(ast.literal_eval(data.loc[i,'n'])), float(data.loc[i,'xmax']))
        y_train[i] = float(data.loc[i,'E'])
    else:
        x_test[i-600,:] = np.append(np.array(ast.literal_eval(data.loc[i,'n'])), float(data.loc[i,'xmax']))
        y_test[i-600] = float(data.loc[i,'E'])

# build the neural network model
inputs = tf.keras.Input(shape=(502,), name='charge_density_x_max')
hidden1 = tf.keras.layers.Dense(64, activation='sigmoid', name='hidden_1')(inputs)
hidden2 = tf.keras.layers.Dense(64, activation='sigmoid', name='hidden_2')(hidden1)
outputs = tf.keras.layers.Dense(1)(hidden2)
model = tf.keras.Model(inputs=inputs, outputs=outputs, name='total_energy')

# save the info of the model
with open('model_info.dat','w') as fh:
    model.summary(print_fn=lambda x: fh.write(x + '\n'))

# compile the model
model.compile(optimizer='adam', loss='mean_absolute_percentage_error', metrics=['accuracy'])

# perform the training
model.fit(x_train, y_train, epochs=10)

# evaluate the model for accuracy
model.evaluate(x_test, y_test, verbose=2)

Тем не менее, когда я запускаю это, он, кажется, не тренируется вообще, давая точность 0,0000e + 00:

Epoch 1/10                                                                                     
600/600 [==============================] - 0s 196us/sample - loss: 289.0616 - acc: 0.0000e+00  
Epoch 2/10                                                                                     
600/600 [==============================] - 0s 37us/sample - loss: 144.5967 - acc: 0.0000e+00   
Epoch 3/10                                                                                     
600/600 [==============================] - 0s 46us/sample - loss: 97.2109 - acc: 0.0000e+00    
Epoch 4/10                                                                                     
600/600 [==============================] - 0s 46us/sample - loss: 108.0698 - acc: 0.0000e+00   
Epoch 5/10                                                                                     
600/600 [==============================] - 0s 47us/sample - loss: 84.5921 - acc: 0.0000e+00    
Epoch 6/10                                                                                     
600/600 [==============================] - 0s 38us/sample - loss: 79.9309 - acc: 0.0000e+00    
Epoch 7/10                                                                                     
600/600 [==============================] - 0s 38us/sample - loss: 80.6755 - acc: 0.0000e+00    
Epoch 8/10                                                                                     
600/600 [==============================] - 0s 47us/sample - loss: 87.5954 - acc: 0.0000e+00    
Epoch 9/10                                                                                     
600/600 [==============================] - 0s 46us/sample - loss: 73.6634 - acc: 0.0000e+00    
Epoch 10/10                                                                                    
600/600 [==============================] - 0s 38us/sample - loss: 78.0825 - acc: 0.0000e+00    
400/400 - 0s - loss: 70.3813 - acc: 0.0000e+00                                                 

Я, вероятно, допустил простую ошибку здесь, но я не знаюкак начать отладку. Это должно выполнить, по крайней мере, некоторую тренировку, но в данный момент кажется, что она просто пропускает тренировку и дает точность 0.

1 Ответ

2 голосов
/ 22 октября 2019

Вы находитесь в настройке регрессия , где точность равна бессмысленно (это имеет смысл только для классификации задач);см. Какая функция определяет точность в Keras, если потеря представляет собой среднеквадратическую ошибку (MSE)? для получения более подробной информации (она применима и в вашем случае, несмотря на использование другой потери).

Тот факт, что ваша сеть действительно действительно учится, становится очевидным из сокращения вашей потери, которая является фактическим количеством интереса к проблемам регрессии (вам просто не нужно metrics здесь).

Независимо от вышесказанного, вам, вероятно, следует изменить sigmoid активации на relu (в настоящее время мы обычно не используем sigmoid для промежуточных слоев).

...