tensorflow keras: я получаю эту ошибку ‘модуль «tensorflow._api.v1.keras.у layers’ нет атрибута ‘flatten'»

#python #python-3.x #tensorflow #keras

#python #python-3.x #tensorflow #keras

Вопрос:

Я получаю вышеупомянутую ошибку при выполнении приведенного ниже кода. Я пытаюсь разобраться в приведенном ниже руководстве по реализации нейронной сети tensorflow. https://www.datacamp.com/community/tutorials/tensorflow-tutorial

 def load_data(data_directory):
directories = [d for d in os.listdir(data_directory) 
               if os.path.isdir(os.path.join(data_directory, d))]
labels = []
images = []
for d in directories:
    label_directory = os.path.join(data_directory, d)
    file_names = [os.path.join(label_directory, f) 
                  for f in os.listdir(label_directory) 
                  if f.endswith(".ppm")]
    for f in file_names:
        images.append(skimage.data.imread(f))
        labels.append(int(d))
return images, labels

import os
import skimage
from skimage import transform
from skimage.color import rgb2gray
import numpy as np
import keras
from keras import layers
from keras.layers import Dense
ROOT_PATH = "C://Users//Jay//AppData//Local//Programs//Python//Python37//Scriptcodes//BelgianSignals"
train_data_directory = os.path.join(ROOT_PATH, "Training")
test_data_directory = os.path.join(ROOT_PATH, "Testing")

images, labels = load_data(train_data_directory)


# Print the `labels` dimensions
print(np.array(labels))

# Print the number of `labels`'s elements
print(np.array(labels).size)

# Count the number of labels
print(len(set(np.array(labels))))

# Print the `images` dimensions
print(np.array(images))

# Print the number of `images`'s elements
print(np.array(images).size)

# Print the first instance of `images`
np.array(images)[0]

images28 = [transform.resize(image, (28, 28)) for image in images]

images28 = np.array(images28)

images28 = rgb2gray(images28)

# Import `tensorflow` 
import tensorflow as tf 

# Initialize placeholders 
x = tf.placeholder(dtype = tf.float32, shape = [None, 28, 28])
y = tf.placeholder(dtype = tf.int32, shape = [None])

# Flatten the input data
images_flat = tf.keras.layers.flatten(x)

# Fully connected layer 
logits = tf.contrib.layers.dense(images_flat, 62, tf.nn.relu)

# Define a loss function
loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(labels = y, 
                                                                    logits = logits))
# Define an optimizer 
train_op = tf.train.AdamOptimizer(learning_rate=0.001).minimize(loss)

# Convert logits to label indexes
correct_pred = tf.argmax(logits, 1)

# Define an accuracy metric
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
  

Сначала я использовал tf.layers.flatten (x), как в руководстве. однако в будущих версиях он будет обесценен. Поэтому добавьте keras вместо этого, как предложено.

Я получаю следующий вывод в консоли ожидания.

ПЕРЕЗАПУСТИТЬ: C:UsersJayAppDataLocalProgramsPythonPython37ScriptcodesSecondTensorFlow.py Используя серверную часть TensorFlow.

Предупреждение (из модуля предупреждений): Файл «C:UsersJayAppDataLocalProgramsPythonPython37libsite-packagesskimagetransform_warps.py», строка 105 предупреждает («Режим по умолчанию, ‘constant’, будет изменен на ‘reflect’ в » Предупреждение пользователя: режим по умолчанию, ‘constant’, будет изменен на ‘reflect’ в skimage 0.15.

Предупреждение (из модуля предупреждений): Файл «C:UsersJayAppDataLocalProgramsPythonPython37libsite-packagesskimagetransform_warps.py», строка 110 предупреждает («Сглаживание будет включено по умолчанию в skimage 0.15 до » Предупреждение пользователя: сглаживание будет включено по умолчанию в skimage 0.15, чтобы избежать артефактов сглаживания при уменьшении выборки изображений.

Обратная трассировка (последний вызов): файл «C:UsersJayAppDataLocalProgramsPythonPython37ScriptcodesSecondTensorFlow.py «, строка 64, в

images_flat = tf.python.keras.layers.flatten(x)

Ошибка атрибута: модуль ‘tensorflow’ не имеет атрибута ‘python’

Я использую Keras версии 2.2.4, Tensorflow версии 1.13.1

Комментарии:

1. Используйте здесь Flatten с заглавной F буквы:- images_flat = tf.keras. layers.flatten(x)

2. Нет, это не работает. Его сбой связан с приведенной ниже ошибкой.

3. Обратная трассировка (последний вызов): Файл «* SecondTensorFlow.py», строка 63, в <модуле> images_flat = tf.keras. слои. Сгладить (x) файл «C:UsersJayAppDataLocalProgramsPythonPython37libsite-packagestensorflowpythonkeraslayerscore.py», строка 539, в файле инициализации self.data_format = conv_utils.normalize_data_format(data_format) «C:UsersJayAppDataLocalProgramsPythonPython37libsite-packagestensorflowpythonkerasutilsconv_utils.py», строка 188, в normalize_data_format data_format = значение. lower() Ошибка атрибута: объект ‘Tensor’ не имеет атрибута ‘lower’

4. Не существует такого понятия, как «tf.python»; откуда вы взяли этот код?

Ответ №1:

Либо

from keras.layers import Flatten

и использовать

Flatten()(input)

или

просто используйте

tf.keras.layers.Flatten()(input)

Ответ №2:

Новый подход («keras как API по умолчанию») предполагает использование слоя keras tf.keras.layers.Flatten но есть небольшой нюанс, который вы, похоже, упустили (и это не было упомянуто в комментариях).

tf.keras.layers.Flatten() на самом деле возвращает объект keras layer (вызываемый), который, в свою очередь, должен быть вызван с вашим предыдущим слоем.

Итак, что-то более похожее на это:

 # Flatten the input data
flatten_layer = tf.keras.layers.Flatten()
images_flat = flatten_layer(x)
  

или, для краткости, просто:

 # Flatten the input data
images_flat = tf.keras.layers.Flatten()(x)